public static (SquareEnum From, SquareEnum To) GetRookRokadeSquares(this SquareEnum kingMoveSquare, bool isWhiteToMove) { if (kingMoveSquare.File() == 6) { return(isWhiteToMove ? SquareEnum.h1 : SquareEnum.h8, (SquareEnum)((int)kingMoveSquare - 1)); } else { return(isWhiteToMove ? SquareEnum.a1 : SquareEnum.a8, (SquareEnum)((int)kingMoveSquare + 1)); } }
public bool Contains(PiecesEnum piece, SquareEnum square) { if (!this.Piece.IsEqual(piece)) { return(false); } foreach (var sq in Iterator.Iterate()) { if (square.Equals(sq.Square)) { return(true); } } return(false); }
public static IEnumerable <(PieceEnum Piece, SquareEnum Square)> Create(PieceEnum piece, SquareEnum square, IPositionImpl position) { var moves = Create(piece); foreach (var m in moves.GetIteratorFor(square, position, piece).Iterate()) { yield return(m.Piece, m.Square); } }
public Position.PiecesIterator <PieceEnum> GetIteratorFor(SquareEnum square, Option <Position> position, PieceEnum pieceEnum = PieceEnum.Bishop) => position.Match(
private static Unit ShowMoves(PieceEnum piece, SquareEnum square, (PieceEnum Promoted, SquareEnum Square)[] moveSquares)
// A8: 0 / 8 = 0 // H8: 7 / 8 = 0; // A1: 56 / 8 = 7; // H1: 63 / 8 = 7; public static int Row(this SquareEnum square) => (int)square / 8;
public static bool IsRokadeMove(this PieceEnum piece, SquareEnum square, SquareEnum moveSquare) => PieceEnum.King.Equals(piece) && Math.Abs((int)square - (int)moveSquare) == 2;
public static bool IsKingsideRokadeMove(this PieceEnum piece, SquareEnum square, SquareEnum moveSquare) => piece.IsRokadeMove(square, moveSquare) && moveSquare.File() == 6;
public static ulong DownBitsOff(this SquareEnum square, int sub = 0) => ~square.DownBitsOn(sub);
public static char ConvertPieceToChar(IDictionary <SquareEnum, PieceOnSquare <PiecesEnum> > dictionary, SquareEnum square) => ConvertPieceToChar(dictionary.ContainsKey(square) ? (int)dictionary[square].Piece : 0);
public static ulong UpBitsOff(this SquareEnum square, int add = 0) => ~square.UpBitsOn(add);
public static ulong DownBitsOn(this SquareEnum square, int sub = 0) => 0x7ffffffffffffffful >> ((int)square - sub);
public static ulong UpBitsOn(this SquareEnum square, int add = 0) => 0xfffffffffffffffeul << (63 - ((int)square + add));
// A8: 0 % 8 = 0 // H8: 7 % 8 = 7; // A1: 56 % 8 = 0; // H1: 63 % 8 = 7; public static int File(this SquareEnum square) => (int)square % 8;
internal static Option <Move> ToMove(this string parameter) { Match match = regex.Match(parameter); if (match.Success) { string value; PieceEnum piece = PieceEnum.Pawn; SquareEnum from = SquareEnum.a1; SquareEnum to = SquareEnum.a1; PieceEnum promote = PieceEnum.Pawn; if (IsKingsideRokade(match.Groups)) { return(Move.Of(RokadeEnum.KingSide)); } else if (IsQueensideRokade(match.Groups)) { return(Move.Of(RokadeEnum.QueenSide)); } else { if (IsPawnMove(match.Groups)) { piece = PieceEnum.Pawn; if (TryGetGroupValue(match.Groups, "Promote", out value)) { value.TryPieceParse().Map(p => promote = p); } else { promote = piece; } } else { if (!TryGetGroupValue(match.Groups, "Piece", out value)) { return(None); } value.TryPieceParse().Map(p => promote = piece = p); if (TryGetGroupValue(match.Groups, "Promote", out value)) { return(None); } } if (!TryGetGroupValue(match.Groups, "From", out value)) { return(None); } from = value.ParseEnum <SquareEnum>(); if (!TryGetGroupValue(match.Groups, "To", out value)) { return(None); } to = value.ParseEnum <SquareEnum>(); } return(Move.Of(piece, from, to, promote)); } else { return(None); } }