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