// Returns a list of all possible moves public static List<Tuple<uint, uint>> getPossibleMoves(Board board, Piece piece) { List<Tuple<uint, uint>> tmpList = new List<Tuple<uint, uint>>(); short yMod; short passantRow; if (piece.getColour() == "white") { yMod = 1; passantRow = 4; } else { yMod = -1; passantRow = 3; } // Take left if (board.withinBoard((int) piece.getX() - 1, (int) piece.getY() + yMod)) { Piece P = board.getPieceAt((uint)(piece.getX() - 1), (uint)(piece.getY() + yMod)); if (P != null) { if (!piece.isSameColour(P)) { tmpList.Add(new Tuple<uint, uint>((uint)(piece.getX() - 1), (uint)(piece.getY() + yMod))); } } } //Take right if (board.withinBoard((int)piece.getX() + 1, (int)piece.getY() + yMod)) { Piece P = board.getPieceAt((uint)(piece.getX() + 1), (uint)(piece.getY() + yMod)); if (P != null) { if (!piece.isSameColour(P)) { tmpList.Add(new Tuple<uint, uint>((uint)(piece.getX() + 1), (uint)(piece.getY() + yMod))); } } } //Move 1 if (board.withinBoard((int)piece.getX(), (int)piece.getY() + yMod)) { Piece P = board.getPieceAt(piece.getX(), (uint)(piece.getY() + yMod)); if (P == null) { tmpList.Add(new Tuple<uint, uint>(piece.getX(), (uint)(piece.getY() + yMod))); } } //Move 2 (Only first move) if (!piece.movedFromInit()) { if (board.withinBoard((int)piece.getX(), (int)piece.getY() + 2 * yMod)) { Piece P = board.getPieceAt(piece.getX(), (uint)(piece.getY() + 2 * yMod)); Piece P2 = board.getPieceAt(piece.getX(), (uint)(piece.getY() + yMod)); if (P == null && P2 == null) { tmpList.Add(new Tuple<uint, uint>(piece.getX(), (uint)(piece.getY() + 2 * yMod))); //((Pawn)piece).setDoubleStepTurn(board.getTurn()); } } } //En Passant if (piece.getY() == passantRow) { if ((piece.getX() + 1) < Board.BOARD_SIZE_X) { Piece P1 = board.getPieceAt(piece.getX() + 1, piece.getY()); if (P1 != null) { if (P1 is Pawn) if (((Pawn)P1).getDoubleStepTurn() == board.getTurn() - 1) tmpList.Add(new Tuple<uint, uint>(piece.getX() + 1, (uint)(piece.getY() + yMod))); } } if ((int)piece.getX() - 1 >= 0) { Piece P2 = board.getPieceAt(piece.getX() - 1, piece.getY()); if (P2 != null) { if (P2 is Pawn) if (((Pawn)P2).getDoubleStepTurn() == board.getTurn() - 1) tmpList.Add(new Tuple<uint, uint>(piece.getX() - 1, (uint)(piece.getY() + yMod))); } } } // Filter for check situations CommonRules.checkFilter(ref tmpList, board, piece); return tmpList; }
public static List<Tuple<uint, uint>> getPossibleMoves(Board board, Piece piece) { List<Tuple<uint, uint>> moves = new List<Tuple<uint, uint>>(); int x = (int)piece.getX(); int y = (int)piece.getY(); for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (i == 0 && j == 0) { // Standing still is not a move continue; } int nx = x + i; int ny = y + j; if (board.withinBoard(nx, ny)) { Square s = board.getSquareAt((uint)nx, (uint)ny); if ((piece.getColour() == "white" && s.getBlackCover() == 0) || (piece.getColour() == "black" && s.getWhiteCover() == 0)) { Piece p = s.getPiece(); if (p == null) { moves.Add(new Tuple<uint, uint>((uint)nx, (uint)ny)); } else { if (p.getColour() != piece.getColour()) { moves.Add(new Tuple<uint, uint>((uint)nx, (uint)ny)); } } } } } } // Castling Square tmp = board.getSquareAt(piece.getX(), piece.getY()); if ((!piece.movedFromInit()) && (!tmp.getEnemyCover(piece.getColour()))) { for (int i = 1; i < 5; i++) { Square s = board.getSquareAt((uint)(x - i), (uint)y); if ((i < 4) && ((s.getPiece() != null) || s.getEnemyCover(piece.getColour()))) break; else if ((s.getPiece() != null) && (i == 4)) if ((s.getPiece() is Rook) && (!s.getPiece().movedFromInit())) moves.Add(new Tuple<uint, uint>((uint)(x - 2), (uint)y)); } for (int i = 1; i < 4; i++) { Square s = board.getSquareAt((uint)(x + i), (uint)y); if ((i < 3) && ((s.getPiece() != null) || s.getEnemyCover(piece.getColour()))) break; else if ((s.getPiece() != null) && (i == 3)) if ((s.getPiece() is Rook) && (!s.getPiece().movedFromInit())) moves.Add(new Tuple<uint, uint>((uint)(x + 2), (uint)y)); } } // Remove squares with enemy king reach foreach (Tuple<uint, uint> reach in getEnemyKingReach(board, piece)) { moves.Remove(reach); } // Remove any moves that create new checks checkFilter(ref moves, board, piece); // Done, all moves found return moves; }