Skip to content

Instantly share code, notes, and snippets.

@VoR0220
Created June 1, 2016 21:18
Show Gist options
  • Save VoR0220/29919887c53f4673bb335be7466f4fe3 to your computer and use it in GitHub Desktop.
Save VoR0220/29919887c53f4673bb335be7466f4fe3 to your computer and use it in GitHub Desktop.
contract TicTacToe {
address player_one;
address player_two;
address public next_player;
address public winner;
mapping (uint => address) game_board;
uint total_moves;
bool public game_in_progress;
/// @notice Creates a tictactoe game for first player (first up) and second player
/// to be played on a gameboard numbered one through nine, horizontally first.
/// row 1: 1 2 3
/// row 2: 4 5 6
/// row 3: 7 8 9
/// @param _player_one address of first player
/// @param _player_two address of second player
function TicTacToe(address _player_one, address _player_two) {
// set player one
player_one = _player_one;
// set player two
player_two = _player_two;
// set next player state
next_player = player_one;
// set number of moves state
total_moves = 0;
// set game in progress state
game_in_progress = true;
}
/// @notice Attempts to place a move on the game board at a player's request.
function move(uint8 square) returns(bool sufficient) {
// verify game is in progress
if (!game_in_progress) return false;
// verify correct player is attempting a move
if (next_player != msg.sender) return false;
// verify requested square is valid
if ((square < 1) || (square > 9)) return false;
// verify square is not consumed
if ((game_board[square] == player_one) ||
(game_board[square] == player_two)) {
return false;
}
// allow the player to make the move
game_board[square] = msg.sender;
// increment number of game moves
total_moves++;
// determine if game is complete
bool completed = isGameComplete(square);
if (completed) {
game_in_progress = false;
return true;
}
// change player state
if (msg.sender == player_one) {
next_player = player_two;
}
if (msg.sender == player_two) {
next_player = player_one;
}
return true;
}
/// @notice Determine if game is complete and if not a draw set the winner
function isGameComplete(uint8 square) returns(bool complete) {
// determine player
address player = game_board[square];
// upper left move
if (square == 1) {
// top row
if ((game_board[2] == player) && (game_board[3] == player)) {
winner = player;
return true;
}
// left column
if ((game_board[4] == player) && (game_board[7] == player)) {
winner = player;
return true;
}
// diagonal
if ((game_board[5] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
}
// upper mid move
if (square == 2) {
// top row
if ((game_board[1] == player) && (game_board[3] == player)) {
winner = player;
return true;
}
// mid column
if ((game_board[5] == player) && (game_board[8] == player)) {
winner = player;
return true;
}
}
// upper right move
if (square == 3) {
// top row
if ((game_board[1] == player) && (game_board[2] == player)) {
winner = player;
return true;
}
// right column
if ((game_board[6] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
// diagonal
if ((game_board[5] == player) && (game_board[7] == player)) {
winner = player;
return true;
}
}
// mid left move
if (square == 4) {
// middle row
if ((game_board[5] == player) && (game_board[6] == player)) {
winner = player;
return true;
}
// left column
if ((game_board[1] == player) && (game_board[7] == player)) {
winner = player;
return true;
}
}
// center move
if (square == 5) {
// middle row
if ((game_board[4] == player) && (game_board[6] == player)) {
winner = player;
return true;
}
// mid column
if ((game_board[2] == player) && (game_board[8] == player)) {
winner = player;
return true;
}
// diagonal
if ((game_board[1] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
}
// mid right move
if (square == 6) {
// middle row
if ((game_board[4] == player) && (game_board[5] == player)) {
winner = player;
return true;
}
// right column
if ((game_board[3] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
}
// lower left move
if (square == 7) {
// bottom row
if ((game_board[8] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
// left column
if ((game_board[1] == player) && (game_board[4] == player)) {
winner = player;
return true;
}
// diagonal
if ((game_board[5] == player) && (game_board[3] == player)) {
winner = player;
return true;
}
}
// lower mid move
if (square == 8) {
// bottom row
if ((game_board[7] == player) && (game_board[9] == player)) {
winner = player;
return true;
}
// mid column
if ((game_board[2] == player) && (game_board[5] == player)) {
winner = player;
return true;
}
}
// lower right move
if (square == 9) {
// bottom row
if ((game_board[7] == player) && (game_board[8] == player)) {
winner = player;
return true;
}
// right column
if ((game_board[3] == player) && (game_board[6] == player)) {
winner = player;
return true;
}
// diagonal
if ((game_board[1] == player) && (game_board[5] == player)) {
winner = player;
return true;
}
}
// check for a draw
if (total_moves >= 9) return true;
// if we get to this point then game is still in progress
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment