Created
June 1, 2016 21:18
-
-
Save VoR0220/29919887c53f4673bb335be7466f4fe3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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