/// <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); } } } }