private BitBoard GetQueenMoves(int m, int n) { var moves = new BitBoard(); moves.Or(GetBishopMoves(m, n)); moves.Or(GetRookMoves(m, n)); return(moves); }
// Проверка возможности контратаки или защиты private bool FindNextMove() { // Ищем пересечения каждой фигуры с общим полем BMovesSum + BPositions // Пробуем переместить фигуру поочередно в каждую точку пересечения // Вызываем функцию анализа для временного поля // Исключение в логике, добавляем ходы отступления короля как есть var posibleCellToMovesMap = new Dictionary <Cell, BitBoard> { { KingPosition, WCellToMovesMap[KingPosition] } }; WCellToMovesMap.Remove(KingPosition); var BPosAndMoves = new BitBoard(); BPosAndMoves.Or(BPositions); BPosAndMoves.Or(BMovesSum); foreach (var cellMovesMap in WCellToMovesMap) { var moves = new BitBoard(); moves.Or(BPosAndMoves); moves.And(cellMovesMap.Value); posibleCellToMovesMap.Add(cellMovesMap.Key, moves); } foreach (var cellMovesMap in posibleCellToMovesMap) { for (var i = 0; i < BitBoard.FieldSize; i++) { for (var j = 0; j < BitBoard.FieldSize; j++) { if (cellMovesMap.Value.Get(i, j) == false) { continue; } var nextMove = new SimpleAnalyser(ChessBoard); nextMove.MoveFigure(cellMovesMap.Key, new Cell(i, j)); nextMove.SimpleAnalyse(); if (!nextMove.isKingAttacked) { return(true); // Этим ходом король защищен } } } } return(false); // Никакой защиты не найдено }
private void CalcFiguresMovesMaps() { for (var i = 0; i < BitBoard.FieldSize; i++) { for (var j = 0; j < BitBoard.FieldSize; j++) { var figure = ChessBoard[i, j]; if (figure.Equals(Figure.None)) { continue; } if (figure.color == Color.White) { BitBoard moves = WMovesGen.Get(figure.piece, new Cell(i, j)); WCellToMovesMap.Add(new Cell(i, j), moves); } else { BitBoard moves = BMovesGen.Get(figure.piece, new Cell(i, j)); BCellToMovesMap.Add(new Cell(i, j), moves); } } } foreach (var movesMap in WCellToMovesMap) { WMovesSum.Or(movesMap.Value); } foreach (var movesMap in BCellToMovesMap) { BMovesSum.Or(movesMap.Value); } }