Beispiel #1
0
 public void ResetGame()
 {
     _winner = XOPlayer.NotSet;
     _lastMove = XOPlayer.NotSet;
     _winningSolution = 0;
     _moves = 0;
     ResetBoard();
 }
Beispiel #2
0
 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;
 }
Beispiel #3
0
        /// <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();
        }