public bool CanMove(FigureMoving fm) //можно ли пойти { this.fm = fm; return(CanMoveFrom() && //можно ли пойти с той клетки куда мы идем CanMoveTo() && //можно ли пойти на ту клетку куда собрались идти CanFigureMove()); //может ли фигура сделать этот ход }
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();//после того как сделан ход запускается генерация fen return(next); }
bool CanEatKing() { Square badKing = FindBadKing(); //найдем координату плохого короля Moves moves = new Moves(this); //все возможные ходы foreach (FigureOnSquare fs in YieldFigures()) //по списку всех доступных фигур { FigureMoving fm = new FigureMoving(fs, badKing); //создаем ход который идет на короля if (moves.CanMove(fm)) //проверяем можно ли этот ход сделать { return(true); //если да ,то поставлен шах } } return(false); }
public Chess Move(string move) //функция позволяющая делать ход Pe2e4(пешка переместилась с e2 на e4) Pe7e8Q(Q - это в кого она превратилась) { 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); //иницализирует новый шахматный экзеплеяр с новым fen и board return(nextChess); }
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)) //проверяет может ли идти по этому ходу { if (!board.IsCheckAfterMove(fm)) //проверяем после ход пропал шах или нет { allMoves.Add(fm); //если да,добавляет в список все возможных ходов. } } } } }
public bool IsCheckAfterMove(FigureMoving fm)//будет ли поставлен шах после хода { Board after = Move(fm); return(after.CanEatKing()); }