/// <summary> /// Makes a move on this Tic-Tac-Toe board at the specified move position /// </summary> /// <param name="move">The move to make</param> /// <returns>A reference to this Tic-Tac-Toe board</returns> public override Board MakeMove(Move move) { TTTMove m = (TTTMove)move; //Make the move if possible, if a move has already been made at this position then throw an invalid move exception if (boardContents[m.X, m.Y] == 0) { //Make the move on this board boardContents[m.X, m.Y] = CurrentPlayer; //Remove the move just performed from the list of possible moves possibleMoves.Remove(m); //Determine if there is a winner DetermineWinner(move); //Swap out the current player CurrentPlayer = NextPlayer; //Call the MakeMove method on the Board base class, to save the last move made on this board return(base.MakeMove(move)); } else { throw new InvalidMoveException("Move has already been made at: " + m.ToString()); } }
/// <summary> /// Determine if the current game is over <para/> /// Uses knowledge of the last move to save computation time /// </summary> /// <param name="move">The last move made</param> protected override void DetermineWinner(Move move) { TTTMove m = (TTTMove)move; //Check the row and column of the last move if (boardContents[0, m.Y] == boardContents[1, m.Y] && boardContents[1, m.Y] == boardContents[2, m.Y] || boardContents[m.X, 0] == boardContents[m.X, 1] && boardContents[m.X, 1] == boardContents[m.X, 2]) { winner = CurrentPlayer; return; } //Then check each diagonal if (boardContents[0, 0] != 0 && boardContents[0, 0] == boardContents[1, 1] && boardContents[0, 0] == boardContents[2, 2] || boardContents[0, 2] != 0 && boardContents[0, 2] == boardContents[1, 1] && boardContents[0, 2] == boardContents[2, 0]) { winner = CurrentPlayer; return; } //If there is still no winner and the board is full, the game is a tie, otherwise no winner yet if (PossibleMoves().Count == 0) { winner = 0; } }