public List<int[]> sortAlphaBeta(ChessBoard cb, bool isWhite, List<int[]> possibleMoves) { List<int[]> retVal = new List<int[]>(); List<int> valueSet = new List<int>(); for (int i = 0; i < possibleMoves.Count; i++) { numIterations++; if (numIterations == 33000) { gui.addText("Found bug"); } int[] currMove = possibleMoves[i]; cb.movePiece(isWhite, currMove[0], currMove[1], true); valueSet.Add(Rating.rating(isWhite, cb, possibleMoves.Count, searchDepth)); cb.undoMove(isWhite); if (!matchesMoveList(cb)) { gui.addText("More errors!"); } } while (valueSet.Count > 0) { int index = indexOfMax(valueSet); retVal.Add(possibleMoves[index]); possibleMoves.RemoveAt(index); valueSet.RemoveAt(index); } return retVal; }
private static List<position_t> Rook(ChessBoard board, position_t pos, bool verify_check = true) { List<position_t> moves = new List<position_t>(); piece_t p = board.Grid[pos.number][pos.letter]; if (p.piece == Piece.NONE) return moves; // slide along vert/hor for possible moves moves.AddRange(Slide(board, p.player, pos, new position_t(1, 0))); moves.AddRange(Slide(board, p.player, pos, new position_t(-1, 0))); moves.AddRange(Slide(board, p.player, pos, new position_t(0, 1))); moves.AddRange(Slide(board, p.player, pos, new position_t(0, -1))); if (verify_check)// make sure each move doesn't put us in check { for (int i = moves.Count - 1; i >= 0; i--) { ChessBoard b2 = LegalMoveSet.move(board, new move_t(pos, moves[i])); if (isCheck(b2, p.player)) { moves.RemoveAt(i); } } } return moves; }
private static List<position_t> Pawn(ChessBoard board, position_t pos, bool verify_check = true) { List<position_t> moves = new List<position_t>(); piece_t p = board.Grid[pos.number][pos.letter]; if (p.piece == Piece.NONE) return moves; // gather relative moves List<position_t> relative = new List<position_t>(); relative.Add(new position_t(-1, 1 * ((p.player == Player.BLACK) ? -1 : 1))); relative.Add(new position_t(0, 1 * ((p.player == Player.BLACK) ? -1 : 1))); relative.Add(new position_t(0, 2 * ((p.player == Player.BLACK) ? -1 : 1))); relative.Add(new position_t(1, 1 * ((p.player == Player.BLACK) ? -1 : 1))); // iterate moves foreach (position_t move in relative) { position_t moved = new position_t(move.letter + pos.letter, move.number + pos.number); // bounds check if (moved.letter < 0 || moved.letter > 7 || moved.number < 0 || moved.number > 7) continue; // double forward move if (moved.letter == pos.letter && board.Grid[moved.number][moved.letter].piece == Piece.NONE && Math.Abs(moved.number - pos.number) == 2) { // check the first step int step = -((moved.number - pos.number) / (Math.Abs(moved.number - pos.number))); bool hasnt_moved = pos.number == ((p.player == Player.BLACK) ? 6 : 1); if (board.Grid[moved.number + step][moved.letter].piece == Piece.NONE && hasnt_moved) { moves.Add(moved); } } // if it's not blocked we can move forward else if (moved.letter == pos.letter && board.Grid[moved.number][moved.letter].piece == Piece.NONE) { moves.Add(moved); } // angled attack else if (moved.letter != pos.letter && board.Grid[moved.number][moved.letter].piece != Piece.NONE && board.Grid[moved.number][moved.letter].player != p.player) { moves.Add(moved); } // en passant else if(isEnPassant(board, new move_t(pos,moved))) { moves.Add(moved); } } if (verify_check)// make sure each move doesn't put us in check { for (int i = moves.Count - 1; i >= 0; i--) { ChessBoard b2 = LegalMoveSet.move(board, new move_t(pos, moves[i])); if (isCheck(b2, p.player)) { moves.RemoveAt(i); } } } return moves; }
private static List<position_t> Knight(ChessBoard board, position_t pos, bool verify_check = true) { List<position_t> moves = new List<position_t>(); piece_t p = board.Grid[pos.number][pos.letter]; if (p.piece == Piece.NONE) return moves; // collect all relative moves possible List<position_t> relative = new List<position_t>(); relative.Add(new position_t(2, 1)); relative.Add(new position_t(2, -1)); relative.Add(new position_t(-2, 1)); relative.Add(new position_t(-2, -1)); relative.Add(new position_t(1, 2)); relative.Add(new position_t(-1, 2)); relative.Add(new position_t(1, -2)); relative.Add(new position_t(-1, -2)); // iterate moves foreach (position_t move in relative) { position_t moved = new position_t(move.letter + pos.letter, move.number + pos.number); // bounds check if (moved.letter < 0 || moved.letter > 7 || moved.number < 0 || moved.number > 7) continue; // if empty space or attacking if (board.Grid[moved.number][moved.letter].piece == Piece.NONE || board.Grid[moved.number][moved.letter].player != p.player) moves.Add(moved); } if (verify_check)// make sure each move doesn't put us in check { for (int i = moves.Count - 1; i >= 0; i--) { ChessBoard b2 = LegalMoveSet.move(board, new move_t(pos, moves[i])); if (isCheck(b2, p.player)) { moves.RemoveAt(i); } } } return moves; }