// Метод хода, создаем новую доску с измененным положением фигур public Board Move(FigureMoving fm) { Board next = new Board(Fen); // Новая доска с тем же феном next.SetFigureAt(fm.From, Figure.none); // Удаляем фигуру с прошлой клетки next.SetFigureAt(fm.To, fm.Promotion == Figure.none ? fm.Figure : fm.Promotion); // Двигаем фигуру (или еще и повышаем) if (MoveColor == Color.black) // Увеличиваем номер хода, если ходили черные { next.MoveNumber++; } next.MoveColor = MoveColor.FlipColor(); // Меняем игрока next.GenerateFen(); // Восстанавливаем фен по положению фигур return(next); }
// Получает все возможные на данный момент ходы текущего цвета private void FindAllMoves() { AllMoves = new List <FigureMoving>(); // инициализируем ходы foreach (FigureOnSquare fs in Board.YieldFigures()) // Для каждой фигуры того цвета на доске { foreach (Square to in Square.YieldSquares()) // Для каждого квадрата на доске { FigureMoving fm = new FigureMoving(fs, to); // Создаем двигаемую фигуру на основе всех доступных фигур и квадратов if (Moves.CanMove(fm) && !Board.IsCheckAfterMove(fm)) // Если можем ее двигать и не будет мата { AllMoves.Add(fm); // Добавляем в список } } } }
private bool CanEatKing() { Square enemyKing = FindEnemyKing(); // Квадрат вражеского короля Moves moves = new Moves(this); // Возможные ходы для данного положения доски foreach (FigureOnSquare fs in YieldFigures()) // Идем по всем фигурам на доске { FigureMoving fm = new FigureMoving(fs, enemyKing); // Если фигура может побить квадрат короля и может двигаться, то шах if (moves.CanMove(fm)) { return(true); } } return(false); }
// Создает новое положение доски (после хода) public Chess Move(string move) { FigureMoving fm = new FigureMoving(move); // Двигаемая фигура if (!Moves.CanMove(fm)) // Проверяем, можем ли мы двигать эту фигуру { return(this); // Если нет, оставляем ситуацию на доске той же } if (Board.IsCheckAfterMove(fm)) { return(this); // Не ходить под шах } Board nextBoard = Board.Move(fm); // Двигаем фигуру по доске Chess nextChess = new Chess(nextBoard); // Новый экземпляр игры return(nextChess); }
// Есть ли шах после хода public bool IsCheckAfterMove(FigureMoving fm) { Board after = Move(fm); return(after.CanEatKing()); }
// Проверяет, можно ли сделать такой ход public bool CanMove(FigureMoving fm) { this.FigureMoving = fm; return(CanMoveFrom() && CanMoveTo() && CanFigureMove()); }