private static void PopulatePawnMoves( ICollection <GameMoveData2> resultMoves, Bitboard destinationsBitboard, int moveOffset, GameMoveFlags moveFlags) { var isPawnPromotion = (moveFlags & GameMoveFlags.IsPawnPromotion) != 0; while (destinationsBitboard.IsAny) { var targetSquareIndex = Bitboard.PopFirstSquareIndex(ref destinationsBitboard); var move = new GameMove2( new Square(targetSquareIndex - moveOffset), new Square(targetSquareIndex)); if (isPawnPromotion) { var promotionMoves = move.MakeAllPromotions(); foreach (var promotionMove in promotionMoves) { resultMoves.Add(new GameMoveData2(promotionMove, moveFlags)); } } else { resultMoves.Add(new GameMoveData2(move, moveFlags)); } } }
internal CastlingInfo2( CastlingType castlingType, GameMove2 kingMove, GameMove2 rookMove, [NotNull] params Square[] emptySquares) { castlingType.EnsureDefined(); if (emptySquares is null) { throw new ArgumentNullException(nameof(emptySquares)); } if (kingMove.From.Rank != kingMove.To.Rank || Math.Abs(kingMove.From.SquareIndex - kingMove.To.SquareIndex) != 2) { throw new ArgumentException( $@"Invalid castling move '{kingMove.ToUciNotation()}'.", nameof(kingMove)); } CastlingType = castlingType; CastlingSide = castlingType.GetSide(); Option = castlingType.ToOption(); KingMove = kingMove; RookMove = rookMove; EmptySquares = emptySquares.AsReadOnly(); PassedSquare = new Square((kingMove.From.SquareIndex + kingMove.To.SquareIndex) / 2); GameSide = Option.IsAnySet(CastlingOptions.WhiteMask) ? GameSide.White : GameSide.Black; }
private void GenerateSlidingPieceMoves( [NotNull] ICollection <GameMoveData2> resultMoves, GameSide side, GeneratedMoveTypes moveTypes, PieceType pieceType, [NotNull] ShiftDirection[] directions) { var piece = pieceType.ToPiece(side); var pieces = PiecePosition[piece]; var emptySquares = PiecePosition[Piece.None]; var enemies = PiecePosition[side.Invert()]; var shouldGenerateQuiets = moveTypes.IsAnySet(GeneratedMoveTypes.Quiet); var shouldGenerateCaptures = moveTypes.IsAnySet(GeneratedMoveTypes.Capture); //// TODO [HarinezumiSama] NEW-DESIGN: IDEA: Generate for all pieces rather for one by one while (pieces.IsAny) { var sourceSquareIndex = Bitboard.PopFirstSquareIndex(ref pieces); var sourceBitboard = Bitboard.FromSquareIndex(sourceSquareIndex); var sourceSquare = new Square(sourceSquareIndex); foreach (var direction in directions) { var current = sourceBitboard; while ((current = current.Shift(direction)).IsAny) { if ((current & emptySquares).IsAny) { if (shouldGenerateQuiets) { var move = new GameMove2(sourceSquare, current.GetFirstSquare()); resultMoves.Add(new GameMoveData2(move, GameMoveFlags.None)); } continue; } if ((current & enemies).IsAny) { if (shouldGenerateCaptures) { var move = new GameMove2(sourceSquare, current.GetFirstSquare()); resultMoves.Add( new GameMoveData2(move, GameMoveFlags.IsRegularCapture)); } } break; } } } }
private static void PopulateSimpleMoves( ICollection <GameMoveData2> resultMoves, Square sourceSquare, Bitboard destinationsBitboard, GameMoveFlags moveFlags) { while (destinationsBitboard.IsAny) { var targetSquareIndex = Bitboard.PopFirstSquareIndex(ref destinationsBitboard); var move = new GameMove2(sourceSquare, new Square(targetSquareIndex)); resultMoves.Add(new GameMoveData2(move, moveFlags)); } }
public static string ToUciNotation(this GameMove2 move) { var isPromotion = move.PromotionResult != PieceType.None; var chars = new[] { move.From.FileChar, move.From.RankChar, move.To.FileChar, move.To.RankChar, isPromotion ? char.ToLowerInvariant(move.PromotionResult.GetFenChar()) : '\0' }; return(new string(chars, 0, isPromotion ? chars.Length : chars.Length - 1)); }
internal GameMoveData2(GameMove2 move, GameMoveFlags moveFlags) { Move = move; MoveFlags = moveFlags; }
public abstract GamePosition MakeMove(GameMove2 move);
public override GamePosition MakeMove(GameMove2 move) { throw new NotImplementedException(); }