public void ResetGame() { _winner = XOPlayer.NotSet; _lastMove = XOPlayer.NotSet; _winningSolution = 0; _moves = 0; ResetBoard(); }
public XOPlayer GetWinner() { if (_winner != XOPlayer.NotSet) { return _winner; } int x = 0, o = 0; for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLUMNS; j++) { if (_board[i,j] == XOPlayer.X) { x |= (int)Math.Pow(2.0, i * 3 + j); } else if (_board[i,j] == XOPlayer.O) { o |= (int)Math.Pow(2.0, i * 3 + j); } } } foreach (var solution in _solutions) { if ((x & solution) == solution) { _winner = XOPlayer.X; _winningSolution = solution; return _winner; } if (((o & solution) == solution)) { _winner = XOPlayer.O; _winningSolution = solution; return _winner; } } return _winner; }
/// <summary> /// /// </summary> /// <param name="movingPlayer"></param> /// <param name="row"></param> /// <param name="column"></param> /// <exception cref="XOInvalidMoveException"></exception> public void MakeAMove(XOPlayer movingPlayer, int row, int column) { if (row >= ROWS || row < 0) { throw new ArgumentOutOfRangeException("row"); } if (column >= COLUMNS || column < 0) { throw new ArgumentOutOfRangeException("column"); } if (IsGameOver) { throw new XOInvalidMoveException("The game is over!", XOInvalidMoveExceptionReasons.GameAlreadyOver); } if (_lastMove == movingPlayer) { throw new XOInvalidMoveException("You can't go twice in a row!", XOInvalidMoveExceptionReasons.SamePlayerTwice); } if (_board[row,column] != XOPlayer.NotSet) { throw new XOInvalidMoveException("You can't set an already set place on the board!", XOInvalidMoveExceptionReasons.AlreadySetPlace); } _board[row, column] = movingPlayer; _lastMove = movingPlayer; _moves++; GetWinner(); }