chessai
college code for ai playing chess in java
git clone https://9o.is/git/chessai.git
commit 3f29ca055ab4a9caa5962e24b08eb17d2b25eb44 parent 7fb5a359a3652e07966f73b74bc8696d4f87e68c Author: Jul <jul@9o.is> Date: Fri, 7 Dec 2012 20:17:46 -0500 updated ai Diffstat:
| M | src/main/java/chess/ChessBoard.java | | | 9 | ++++++++- |
| M | src/main/java/chess/ChessGame.java | | | 5 | ++++- |
| M | src/main/java/chess/ChessPlayer.java | | | 98 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ |
| M | src/main/java/chess/ChessRules.java | | | 12 | ++++++++---- |
| M | src/main/java/chess/utils/ChessType.java | | | 12 | ++++++------ |
5 files changed, 95 insertions(+), 41 deletions(-)
diff --git a/src/main/java/chess/ChessBoard.java b/src/main/java/chess/ChessBoard.java @@ -63,17 +63,24 @@ public class ChessBoard extends ChessState implements Cloneable { //CHECK public boolean move(ChessCoordinate src, ChessCoordinate dest) { - ChessRules.INSTANCE.setLog(true); ChessRules.INSTANCE.setState(this); ChessRules.INSTANCE.setSrc(src); ChessRules.INSTANCE.setDest(dest); + ChessRules.INSTANCE.validMove(); + ChessRules.INSTANCE.applyCaptureRule(); + super.move(src, dest); + return true; + + // TODO implement all rules to not allow opponent make whatever move + /* if(ChessRules.INSTANCE.validMove()) { ChessRules.INSTANCE.applyCaptureRule(); super.move(src, dest); return true; } else return false; + */ } public List<ChessCoordinate> getPieces(ChessColor color) { diff --git a/src/main/java/chess/ChessGame.java b/src/main/java/chess/ChessGame.java @@ -12,7 +12,7 @@ import java.util.List; public class ChessGame { public static void main(String[] args) { - final int gameId = 25; + final int gameId = 67; final int teamNo = 1; final String secret = "32c68cae"; @@ -35,7 +35,10 @@ public class ChessGame { new ChessClock(status.getSecondsLeft()); ChessRules.INSTANCE.setLog(false); + ChessRules.INSTANCE.setEvaluating(true); ChessMove move = player.bestPossibleMove(board); + ChessRules.INSTANCE.setLog(true); + ChessRules.INSTANCE.setEvaluating(false); MoveResponse response = server.push(board, move); if(response.isResult() && board.move(move)) { diff --git a/src/main/java/chess/ChessPlayer.java b/src/main/java/chess/ChessPlayer.java @@ -40,18 +40,41 @@ public class ChessPlayer { moves = 0; } + public List<ChessMove> possibleMoves( + ChessCoordinate src, ChessState state) { + List<ChessMove> moves = new ArrayList<ChessMove>(); + ChessRules.INSTANCE.setState(state); + ChessRules.INSTANCE.setSrc(src); + + final ChessDirection[] directions = + ChessRules.INSTANCE.possibleDirections(); - public List<ChessMove> possibleMoves(List<ChessCoordinate> pieces, ChessState state) { - ChessRules.INSTANCE.setEvaluating(true); - ChessRules.INSTANCE.setLog(false); + for(ChessDirection direction : directions) { + boolean valid = true; + int steps = 1; + while (valid) { + ChessMove move = new ChessMove(src, direction, steps); + ChessCoordinate dest = src; + dest = dest.getCoordinate(state, move); + ChessRules.INSTANCE.setDest(dest); + valid = ChessRules.INSTANCE.validMove(); + + if(valid) moves.add(move); + steps++; + } + } + + return moves; + } + + public List<ChessMove> possibleMoves(List<ChessCoordinate> pieces, ChessBoard state) { List<ChessMove> moves = new ArrayList<ChessMove>(); for(ChessCoordinate src : pieces) { List<ChessMove> possibleMoves = possibleMoves(src, state); for(ChessMove move : possibleMoves) moves.add(move); } - ChessRules.INSTANCE.setEvaluating(false); return moves; } @@ -110,40 +133,57 @@ public class ChessPlayer { ChessType srcType = srcPiece.getType(); ChessType destType = destPiece.getType(); - // CAPTURE - if(destType != ChessType.NA) { - return destType.getValue(); - } else { - return 0; - } + int value = evaluateCapture(destType) + + evaluateMovablePieces(src, board, move) + + evaluateMovablePieces(dest, board, move); + + + return value; } - public List<ChessMove> possibleMoves( - ChessCoordinate src, ChessState state) { + public int evaluateCapture(ChessType destType) { + if(destType != ChessType.NA) + return destType.getValue(); + return 0; + } - List<ChessMove> moves = new ArrayList<ChessMove>(); - ChessRules.INSTANCE.setState(state); - ChessRules.INSTANCE.setSrc(src); + public int evaluateMovablePieces( + ChessCoordinate coor, + ChessBoard board, + ChessMove move) { - final ChessDirection[] directions = - ChessRules.INSTANCE.possibleDirections(); + // Check if pieces around src are movable + List<ChessCoordinate> coordinates = coor.surroundingCoordinates(1); + List<ChessMove> moves = possibleMoves(coordinates, board); + int value = 0; - for(ChessDirection direction : directions) { - boolean valid = true; - int steps = 1; - while (valid) { - ChessMove move = new ChessMove(src, direction, steps); - ChessCoordinate dest = src; - dest = dest.getCoordinate(state, move); - ChessRules.INSTANCE.setDest(dest); - valid = ChessRules.INSTANCE.validMove(); + for(int i=0; i<moves.size(); i++) { + ChessType type = ChessPiece.find(board.get( + moves.get(i).getCoordinate())).getType(); - if(valid) moves.add(move); - steps++; + if(type != ChessType.PAWN || type != ChessType.KING || type != ChessType.KNIGHT) { + if(type == ChessType.BISHOP) value -= 3; + else value -= 1; } + } - return moves; + // Check if pieces around dest are movable + ChessBoard tmpBoard = new ChessBoard(board); + tmpBoard.move(move); + moves.clear(); + moves = possibleMoves(coordinates, tmpBoard); + + for(int i=0; i<moves.size(); i++) { + ChessType type = ChessPiece.find(board.get( + moves.get(i).getCoordinate())).getType(); + + if(type != ChessType.PAWN || type != ChessType.KING || type != ChessType.KNIGHT) { + if(type == ChessType.BISHOP) value += 3; + else value += 1; + } + } + return value; } public ChessColor getColor() { diff --git a/src/main/java/chess/ChessRules.java b/src/main/java/chess/ChessRules.java @@ -225,12 +225,14 @@ public enum ChessRules { if(src.getRank()+2 == dest.getRank() && src.getFile() == dest.getFile() && - wPawnCanDoubleMove) { + wPawnCanDoubleMove && + destPiece == ChessPiece.NA) { return true; } if(src.getRank()+1 == dest.getRank() && - src.getFile() == dest.getFile()){ + src.getFile() == dest.getFile() && + destPiece == ChessPiece.NA){ setwPawnCanDoubleMove(false); return true; @@ -249,12 +251,14 @@ public enum ChessRules { if(src.getRank() == dest.getRank()+2 && src.getFile() == dest.getFile() && - bPawnCanDoubleMove) { + bPawnCanDoubleMove && + destPiece == ChessPiece.NA) { return true; } if(src.getRank() == dest.getRank()+1 && - src.getFile() == dest.getFile()) { + src.getFile() == dest.getFile()&& + destPiece == ChessPiece.NA) { setbPawnCanDoubleMove(false); return true; diff --git a/src/main/java/chess/utils/ChessType.java b/src/main/java/chess/utils/ChessType.java @@ -8,12 +8,12 @@ import java.util.List; * Check */ public enum ChessType { - KING ("K", 1000), - QUEEN ("Q", 9), - BISHOP ("B", 3), - KNIGHT ("N", 3), - ROOK ("R", 5), - PAWN ("P", 1), + KING ("K", 2000*2), + QUEEN ("Q", 20*2), + BISHOP ("B", 6*2), + KNIGHT ("N", 6*2), + ROOK ("R", 10*2), + PAWN ("P", 2*2), NA (" ", 0); private int value;