コード例 #1
0
        public GameState MakeStep(int smallFieldNumber, int cellNumber)
        {
            if (!_lastStep.Equals(smallFieldNumber) && !_lastStep.Equals(-1) && !_model.BigField.SmallFields[_lastStep].Full)
            {
                // Если ходит в маленькое поле, в которое не должен ходить
                return(GameState.WrongSmallField);
            }

            if (_model.BigField.SmallFields[smallFieldNumber].Full)
            {
                // Если это маленькое поле полностью заполнено
                return(GameState.FullField);
            }

            if (_model.BigField.SmallFields[smallFieldNumber].Cells[cellNumber].CellState != CellState.None)
            {
                // Эта клетка занята
                return(GameState.BusyCell);
            }

            _lastStep = cellNumber;

            _model.BigField.SmallFields[smallFieldNumber].Cells[cellNumber].CellState = _xStep ? CellState.X : CellState.O;
            _model.BigField.SmallFields[smallFieldNumber].Full = _model.BigField.SmallFields[smallFieldNumber].IsFull();

            // Если в этом поле уже выиграли, то не надо проверять условия на победу
            if (_model.BigField.SmallFields[smallFieldNumber].Winner.Equals(Winner.None))
            {
                if (_model.BigField.SmallFields[smallFieldNumber].IsWin(cellNumber, _xStep))
                {
                    if (IsWin(smallFieldNumber))
                    {
                        // Если выиграл всю игру. В поле _winner - победитель игры.
                        _littlePoint = smallFieldNumber;
                        _xStep       = !_xStep;
                        return(GameState.WinGame);
                    }

                    // Если выиграл маленькое поле, по smallFieldNumber можешь узнать, какие клетки нужно закрасить.
                    // А по _xStep - чей ход был (для цвета).
                    _littlePoint = smallFieldNumber;
                    _xStep       = !_xStep;
                    return(GameState.WinSmallField);
                }
            }

            if (_model.Full())
            {
                return(GameState.GameOver);
            }

            // Ход прошел успешно. Нет ни побед, ни ошибок
            _xStep = !_xStep;
            return(GameState.Ok);
        }