Exemplo n.º 1
0
        // Метод хода, создаем новую доску с измененным положением фигур
        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);
        }
Exemplo n.º 2
0
 // Получает все возможные на данный момент ходы текущего цвета
 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);                                 // Добавляем в список
             }
         }
     }
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        // Создает новое положение доски (после хода)
        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);
        }
Exemplo n.º 5
0
        // Есть ли шах после хода
        public bool IsCheckAfterMove(FigureMoving fm)
        {
            Board after = Move(fm);

            return(after.CanEatKing());
        }
Exemplo n.º 6
0
        // Проверяет, можно ли сделать такой ход
        public bool CanMove(FigureMoving fm)
        {
            this.FigureMoving = fm;

            return(CanMoveFrom() && CanMoveTo() && CanFigureMove());
        }