Skip to content
Permalink
Browse files

Merge branch 'master' of https://github.uconn.edu/sas12028/CheckersAI

  • Loading branch information
joesweeney committed Apr 19, 2017
2 parents 6289b81 + 751012d commit 60763a3a44a2a2f5d60f03228da376f6284238c8
Showing with 95 additions and 15 deletions.
  1. +35 −12 src/CheckersAI.java
  2. +52 −3 src/CheckersGameState3.java
  3. +3 −0 src/Move.java
  4. +4 −0 src/Move3.java
  5. +1 −0 src/RmCheckersClient.java
@@ -9,9 +9,34 @@ public CheckersAI(Evaluator e, int player){
this.player = player;
}

public Move minimax(CheckersGameState s, int ply){
private boolean stop(CheckersGameState state, boolean jumped, int depth, int min_ply){
CheckersGameState3 s = (CheckersGameState3) state;
if(depth < min_ply){
return false;
}
else if(depth == min_ply && !s.canJump() && !jumped && !s.canExchange()){
return true;
}
else if(depth == min_ply +1 && !s.canJump() && !s.canExchange() && depth == 4){
return true;
}
else if(depth > min_ply +1 && depth < min_ply + 10 && !s.canJump()){
return true;
}
else if(depth > min_ply +10 && depth < min_ply + 20 && s.twoKings()){
return true;
}
else if(depth >= min_ply + 20){
return true;
}
else{
return false;
}
}

public Move minimax(CheckersGameState s, int min_ply){
int depth = 0;
if(s.isTerminal() || depth == ply){
if(s.isTerminal()){
return null;
}
double alpha = Double.NEGATIVE_INFINITY;
@@ -21,7 +46,7 @@ public Move minimax(CheckersGameState s, int ply){
Move max = null;
// System.out.println(s.actions().size());
for(Move a: s.actions()){
check = minValue(s.result(a), alpha, beta, ply, depth + 1);
check = minValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply);
if(check > v){
v = check;
max = a;
@@ -34,15 +59,14 @@ public Move minimax(CheckersGameState s, int ply){
return max;
}

private double maxValue(CheckersGameState s, double alpha, double beta, int ply, int depth){

if(s.isTerminal() || depth == ply){
return eval.evaluate(s, this.player); // if terminal, piece ratio should be infinite
private double maxValue(CheckersGameState s, double alpha, double beta, int depth, boolean jumped, int min_ply){
if(s.isTerminal() || stop(s, jumped, depth, min_ply)){
return eval.evaluate(s, this.player); // if terminal, piece ratio should be infinite
}
double v = Double.NEGATIVE_INFINITY;
double check;
for(Move a: s.actions()){
check = minValue(s.result(a), alpha, beta, ply, depth + 1);
check = minValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply);
if(check > v){
v = check;
}
@@ -54,15 +78,14 @@ private double maxValue(CheckersGameState s, double alpha, double beta, int ply,
return v;
}

private double minValue(CheckersGameState s, double alpha, double beta, int ply, int depth){

if(s.isTerminal() || depth == ply){
private double minValue(CheckersGameState s, double alpha, double beta, int depth, boolean jumped, int min_ply){
if(s.isTerminal() || stop(s, jumped, depth, min_ply)){
return eval.evaluate(s, this.player);
}
double v = Double.POSITIVE_INFINITY;
double check;
for(Move a: s.actions()){
check = maxValue(s.result(a), alpha, beta, ply, depth + 1);
check = maxValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply);
if(check < v){
v = check;
}
@@ -5,10 +5,13 @@

int player;
int[] board;
List<Move> actions;

public CheckersGameState3(int player, int[] board){
this.player = player;
this.board = board;
//System.out.println(this.moves());
this.actions = this.moves();
}

public CheckersGameState3() {
@@ -23,14 +26,53 @@ public CheckersGameState3() {
2,2,2,2,
2,2,2,2
};
this.actions = this.moves();
}

public CheckersGameState3(int player, String[] board){
this.player = player;
this.board = to_array(board);
this.actions = this.moves();
}

public int convert(String s){

boolean canJump(){
//System.out.println(this.moves);
return (this.actions.size() > 0 && this.actions.get(0).isJump());
}

boolean canExchange(){
if(canJump()){
for(Move m: this.actions){
if(m.captures().length == 1){
for(Move n: this.result(m).actions()){
if(n.captures().length == 1){
return true;
}
}
}
}
return false;
}
return false;
}

boolean twoKings(){
int bkings = 0;
int wkings = 0;
for(int i = 0; i < board.length; i++){
if(board[i] == 3){
bkings++;
}
else if(board[i] == 4){
wkings++;
}
}
return Math.abs(bkings - wkings) >= 2;
}


public int convert(String s){
if(s.equals("-")){
return 0;
}
@@ -144,6 +186,11 @@ private boolean any_jumps(int orig, int delta1, int delta2, int[] board, boolean
}

public List<Move> actions(){
return this.actions;
}


public List<Move> moves(){
LinkedList<Move> moves = new LinkedList<Move>();
LinkedList<Move> jumps = new LinkedList<Move>();
for(int i = 0; i < this.board.length; i++){
@@ -166,6 +213,8 @@ private boolean any_jumps(int orig, int delta1, int delta2, int[] board, boolean
}
}
}
//System.out.println(jumps);
//System.out.println(moves);
if(jumps.isEmpty()){
return moves;
}
@@ -285,8 +334,8 @@ public double pieceRatio(int player){
double mypieces = 0.0;
for(int i = 0; i<this.board.length; i++){
if(i%9!=8){
if(this.board[i] != 0 ) total+=1.0;
if(myPiece(this.board[i], player)) mypieces+=1.0;
else if(this.board[i] != 0 ) total+=1.0;
}
}
//System.out.println("" + mypieces);
@@ -309,7 +358,7 @@ public boolean isSafe(int pos){

public boolean isTerminal(){
double rat = pieceRatio(this.player);
return (rat == 0 || rat == 1);
return (rat == 0 || rat == Double.POSITIVE_INFINITY);
}

public void printState(){
@@ -7,4 +7,7 @@
// Returns the string representation of a move
public String toString();

boolean isJump();


}
@@ -37,6 +37,10 @@ public int destination(){
return kills;
}

public boolean isJump(){
return this.kills != null;
}

// private String convert(int pos){
// int x;
// int y;
@@ -144,6 +144,7 @@ else if(player == 2) { // white
readAndEcho(); // move query
}
while(currentState.actions().size()>0){
currentState.printState();
Move myMove = ai.minimax(currentState, 8);
writeMessageAndEcho(myMove.toString());
if(!applyMove(myMove.toString())) {

0 comments on commit 60763a3

Please sign in to comment.
You can’t perform that action at this time.