private void GenerateWhitePawnAttacks() { for (int i = 0; i < 64; i++) { var file = MoveUtility.Files[i]; var rank = MoveUtility.Ranks[i]; //Attack Left var targetFile = file - 1; var targetRank = rank + 1; if (ValidLocation(targetFile, targetRank)) { WhitePawnAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Attack Right targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { WhitePawnAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } } }
private void GenerateWhitePawnMoves() { for (int i = 0; i < 64; i++) { var file = MoveUtility.Files[i]; var rank = MoveUtility.Ranks[i]; var targetRank = rank + 1; var targetFile = file; //Single Move if (ValidLocation(targetFile, targetRank)) { WhitePawnMoves[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Double Move if (rank == 2) { targetRank = rank + 2; if (ValidLocation(targetFile, targetRank)) { WhitePawnDoubleMoves[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } } } }
private void GenerateMasks() { for (var file = 1; file < 9; file++) { for (var rank = 1; rank < 9; rank++) { for (var bit = 2; bit < 8; bit++) { RankMask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(rank, bit); FileMask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(bit, file); } var diagonalA8H1 = file + rank; // from 2 to 16, longest diagonal = 9 if (diagonalA8H1 < 10) { for (var square = 2; square < diagonalA8H1 - 1; square++) { DiagonalA8H1Mask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(diagonalA8H1 - square, square); } } else { for (var square = 2; square < 17 - diagonalA8H1; square++) { DiagonalA8H1Mask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(9 - square, diagonalA8H1 + square - 9); } } var diagonalA1H8 = file - rank; // from -7 to +7, longest diagonal = 0 if (diagonalA1H8 > -1) // lower half, diagonals 0 to 7 { for (var square = 2; square < 8 - diagonalA1H8; square++) { DiagonalA1H8Mask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(square, diagonalA1H8 + square); } } else { for (var square = 2; square < 8 + diagonalA1H8; square++) { DiagonalA1H8Mask[MoveUtility.BoardIndex[rank][file]] |= MoveUtility.GetBitStatesByBoardIndex(square - diagonalA1H8, square); } } } } }
/// <summary> /// Generates the file attacks for rooks and queens. /// The Sliding attack is transformed from top to bottom to left to right. /// /// H8 /// . . . . . A . . LSB MSB /// . . . . . B . . => A B C D E F G H /// . . . . . C . . /// . . . . . D . . /// . . . . . E . . /// . . . . . F . . /// . . . . . G . . /// . . . . . H . . /// A1 /// </summary> private void GenerateFileAttacks() { for (var square = 0; square < 64; square++) { for (var attackState = 0; attackState < 64; attackState++) { for (var attackbit = 0; attackbit < 8; attackbit++) { if ((SlidingAttacks[8 - MoveUtility.Ranks[square]][attackState] & _byteBitStates[attackbit]) > 0) { var file = MoveUtility.Files[square]; var rank = 8 - attackbit; FileAttacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank, file); } } } } }
private void GenerateDiagonalA1H8Attacks() { for (var square = 0; square < 64; square++) { for (var attackState = 0; attackState < 64; attackState++) { for (var attackbit = 0; attackbit < 8; attackbit++) { var slidingattackindex = (MoveUtility.Ranks[square] - 1) < (MoveUtility.Files[square] - 1) ? (MoveUtility.Ranks[square] - 1) : (MoveUtility.Files[square] - 1); if ((SlidingAttacks[slidingattackindex][attackState] & _byteBitStates[attackbit]) > 0) { var diagonalLength = MoveUtility.Files[square] - MoveUtility.Ranks[square]; int file; int rank; if (diagonalLength < 0) { file = attackbit + 1; rank = file - diagonalLength; } else { rank = attackbit + 1; file = diagonalLength + rank; } if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9)) { DiagonalA1H8Attacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank, file); } } } } } }
private void GenerateDiagonalA8H1Attacks() { for (var square = 0; square < 64; square++) { for (var attackState = 0; attackState < 64; attackState++) { for (var attackbit = 0; attackbit < 8; attackbit++) { var slidingattackindex = 8 - MoveUtility.Ranks[square] < MoveUtility.Files[square] - 1 ? 8 - MoveUtility.Ranks[square] : MoveUtility.Files[square] - 1; if ((SlidingAttacks[slidingattackindex][attackState] & _byteBitStates[attackbit]) > 0) { var diagonalLength = MoveUtility.Files[square] + MoveUtility.Ranks[square]; int file; int rank; if (diagonalLength < 10) { file = attackbit + 1; rank = diagonalLength - file; } else { rank = 8 - attackbit; file = diagonalLength - rank; } if ((file > 0) && (file < 9) && (rank > 0) && (rank < 9)) { DiagonalA8H1Attacks[square][attackState] |= MoveUtility.GetBitStatesByBoardIndex(rank, file); } } } } } }
private void GenerateKnightAttacks() { for (int i = 0; i < 64; i++) { var file = MoveUtility.Files[i]; var rank = MoveUtility.Ranks[i]; //Down 2 Right 1 var targetRank = rank - 2; var targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Down 2 Left 1 targetFile = file - 1; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Down 1 Right 2 targetRank = rank - 1; targetFile = file + 2; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Down 1 Left 2 targetFile = file - 2; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up 2 Right 1 targetRank = rank + 2; targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up 2 Left 1 targetFile = file - 1; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up 1 Right 2 targetRank = rank + 1; targetFile = file + 2; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up 1 Left 2 targetFile = file - 2; if (ValidLocation(targetFile, targetRank)) { KnightAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } } }
private void GenerateKingAttacks() { for (int i = 0; i < 64; i++) { var file = MoveUtility.Files[i]; var rank = MoveUtility.Ranks[i]; //Down var targetRank = rank - 1; var targetFile = file; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up targetRank = rank + 1; targetFile = file; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Left targetRank = rank; targetFile = file - 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Right targetRank = rank; targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Down Left targetRank = rank - 1; targetFile = file - 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Down Right targetRank = rank - 1; targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up Left targetRank = rank + 1; targetFile = file - 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } //Up Right targetRank = rank + 1; targetFile = file + 1; if (ValidLocation(targetFile, targetRank)) { KingAttacks[i] |= MoveUtility.GetBitStatesByBoardIndex(targetRank, targetFile); } } }