chessai
college code for ai playing chess in java
git clone https://9o.is/git/chessai.git
ChessPlayer.java
(5961B)
1 package chess;
2
3 import chess.utils.ChessColor;
4 import chess.utils.ChessDirection;
5 import chess.utils.ChessType;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 /**
11 * Check
12 */
13 public class ChessPlayer {
14
15 private static final String ERROR_MSG =
16 ChessPlayer.class+": Invalid color.";
17
18 private int points;
19 private ChessColor color;
20 private int moves;
21
22 public ChessPlayer(ChessColor color) {
23 if(color == ChessColor.NA)
24 throw new IllegalArgumentException(ERROR_MSG);
25
26 this.color = color;
27 points = 0;
28 moves = 0;
29 }
30
31 public ChessPlayer(int colorNo) {
32 if(colorNo > 2 || colorNo < 1)
33 throw new IllegalArgumentException(ERROR_MSG);
34
35 ChessColor color =
36 colorNo==1 ? ChessColor.WHITE : ChessColor.BLACK;
37
38 this.color = color;
39 points = 0;
40 moves = 0;
41 }
42
43 public List<ChessMove> possibleMoves(
44 ChessCoordinate src, ChessState state) {
45
46 List<ChessMove> moves = new ArrayList<ChessMove>();
47 ChessRules.INSTANCE.setState(state);
48 ChessRules.INSTANCE.setSrc(src);
49
50 final ChessDirection[] directions =
51 ChessRules.INSTANCE.possibleDirections();
52
53 for(ChessDirection direction : directions) {
54 boolean valid = true;
55 int steps = 1;
56 while (valid) {
57 ChessMove move = new ChessMove(src, direction, steps);
58 ChessCoordinate dest = src;
59 dest = dest.getCoordinate(state, move);
60 ChessRules.INSTANCE.setDest(dest);
61 valid = ChessRules.INSTANCE.validMove();
62
63 if(valid) moves.add(move);
64 steps++;
65 }
66 }
67
68 return moves;
69 }
70
71 public List<ChessMove> possibleMoves(List<ChessCoordinate> pieces, ChessBoard state) {
72 List<ChessMove> moves = new ArrayList<ChessMove>();
73 for(ChessCoordinate src : pieces) {
74 List<ChessMove> possibleMoves = possibleMoves(src, state);
75 for(ChessMove move : possibleMoves)
76 moves.add(move);
77 }
78 return moves;
79 }
80
81 public ChessMove bestPossibleMove(ChessBoard board) {
82 List<ChessCoordinate> pieces = board.getPieces(color);
83 List<ChessMove> moves = possibleMoves(pieces, board);
84
85 ChessMove bestMove = null;
86 int eval = -999999999;
87
88 while(!moves.isEmpty()) {
89 ChessMove move = moves.get(0);
90 ChessBoard tmpBoard = new ChessBoard(board);
91 tmpBoard.move(move);
92 int ourscore = evaluate(move,board);
93 int oppEval = evaluateOpponentMove(tmpBoard, ourscore);
94
95 if(oppEval > eval){
96 bestMove=move;
97 eval= oppEval;
98 }
99
100 moves.remove(0);
101 }
102 return bestMove;
103 }
104
105 public int evaluateOpponentMove(ChessBoard board, int ourscore) {
106
107 List<ChessCoordinate> pieces = board.getPieces(color.opposite());
108 List<ChessMove> moves = possibleMoves(pieces, board);
109
110 int eval = 999999999;
111 while(!moves.isEmpty()) {
112 ChessMove move = moves.get(0);
113 int moveEval = ourscore - evaluate(move, board);
114
115 if(eval > moveEval) { // we have a minimum
116 if(eval == 999999999)
117 eval = moveEval;
118 else // prune
119 return moveEval;
120 }
121 moves.remove(0);
122 }
123 return eval;
124 }
125
126 private int evaluate(ChessMove move, ChessBoard board) {
127 ChessCoordinate src = move.getCoordinate();
128 ChessCoordinate dest = src.getCoordinate(board, move);
129
130 ChessPiece srcPiece = ChessPiece.find(board.get(src));
131 ChessPiece destPiece = ChessPiece.find(board.get(dest));
132
133 ChessType srcType = srcPiece.getType();
134 ChessType destType = destPiece.getType();
135
136 int value = evaluateCapture(destType) +
137 evaluateMovablePieces(src, board, move) +
138 evaluateMovablePieces(dest, board, move);
139
140
141 return value;
142 }
143
144 public int evaluateCapture(ChessType destType) {
145 if(destType != ChessType.NA)
146 return destType.getValue();
147 return 0;
148 }
149
150 public int evaluateMovablePieces(
151 ChessCoordinate coor,
152 ChessBoard board,
153 ChessMove move) {
154
155 // Check if pieces around src are movable
156 List<ChessCoordinate> coordinates = coor.surroundingCoordinates(1);
157 List<ChessMove> moves = possibleMoves(coordinates, board);
158 int value = 0;
159
160 for(int i=0; i<moves.size(); i++) {
161 ChessType type = ChessPiece.find(board.get(
162 moves.get(i).getCoordinate())).getType();
163
164 if(type != ChessType.PAWN || type != ChessType.KING || type != ChessType.KNIGHT) {
165 if(type == ChessType.BISHOP) value -= 3;
166 else value -= 1;
167 }
168
169 }
170
171 // Check if pieces around dest are movable
172 ChessBoard tmpBoard = new ChessBoard(board);
173 tmpBoard.move(move);
174 moves.clear();
175 moves = possibleMoves(coordinates, tmpBoard);
176
177 for(int i=0; i<moves.size(); i++) {
178 ChessType type = ChessPiece.find(board.get(
179 moves.get(i).getCoordinate())).getType();
180
181 if(type != ChessType.PAWN || type != ChessType.KING || type != ChessType.KNIGHT) {
182 if(type == ChessType.BISHOP) value += 3;
183 else value += 1;
184 }
185 }
186 return value;
187 }
188
189 public ChessColor getColor() {
190 return color;
191 }
192
193 public int getPoints() {
194 return points;
195 }
196
197 public int getMoves() {
198 return moves;
199 }
200
201 public void setPoints(int points) {
202 this.points = points;
203 }
204
205 public void incrementMoves() {
206 this.moves++;
207 }
208 }