예제 #1
0
파일: Board.cs 프로젝트: ashsvis/Checkers
        /// <summary>
        /// Выбор целевой ячейки для хода или боя
        /// </summary>
        /// <param name="location"></param>
        public void SelectTargetCell(Address location)
        {
            if (_game.WinPlayer != WinPlayer.Game)
            {
                return;
            }
            Cell cell;

            if (GetCell(location, out cell) && cell.State != State.Prohibited)
            {
                if (_game.Mode == PlayMode.Game || _game.Mode == PlayMode.NetGame)
                {
                    if (_game.Player == Player.Black && !_game.Direction ||
                        _game.Player == Player.White && _game.Direction)
                    {
                        return;
                    }
                }
                if (Selected != null && cell.State == State.Empty) // ранее была выбрана фишка и выбрана пустая клетка
                // пробуем делать ход
                {
                    var startPos   = Selected.Address;
                    var endPos     = cell.Address;
                    var moveResult = MakeMove(startPos, endPos);
                    Selected = null;  // после хода сбрасываем текущую выбранную фишку
                    if (moveResult != MoveResult.Prohibited)
                    {
                        // подсчёт очков
                        if (moveResult == MoveResult.SuccessfullCombat)
                        {
                            if (_game.Direction)
                            {
                                _game.BlackScore++;
                            }
                            else
                            {
                                _game.WhiteScore++;
                            }
                        }
                        _game.CheckWin();
                        // считаем количество непрерывных ходов одной стороной
                        _movedCount++;
                        // определение дамки
                        if (!cell.King &&
                            (!_game.Direction && cell.Address.Row == SideSize ||
                             _game.Direction && cell.Address.Row == 1))
                        {
                            cell.King = true;
                        }
                        var hasCombat = HasCombat(endPos); // есть ли в этой позиции возможность боя
                        // запоминаем очередь хода перед возможной сменой
                        var lastDirection = _game.Direction;
                        // или был бой и далее нет возможности боя
                        if (moveResult == MoveResult.SuccessfullCombat && !hasCombat ||
                            moveResult == MoveResult.SuccessfullMove)
                        {
                            // сообщаем о перемещении фишки
                            OnCheckerMoved(lastDirection, startPos, endPos, moveResult, _movedCount);
                            // сбрасываем количество непрерывных ходов одной стороной
                            _movedCount = 0;
                            // передача очерёдности хода
                            _game.Direction = !_game.Direction;
                            OnActivePlayerChanged();
                            _game.CheckWin();
                            if (_game.WinPlayer == WinPlayer.None)
                            {
                                CheckAvailableGoals();
                            }
                            return;
                        }
                        else if (moveResult == MoveResult.SuccessfullCombat && hasCombat)
                        {
                            // выбрана фишка для продолжения боя
                            SetSelectedCell(cell);
                        }
                        // сообщаем о перемещении фишки
                        OnCheckerMoved(lastDirection, startPos, endPos, moveResult, _movedCount);
                    }
                }
            }
        }