From 9f270071fb17de7dc822a38c5fd020b6edb8e1cc Mon Sep 17 00:00:00 2001 From: Sailesh Date: Wed, 19 Apr 2017 16:24:49 -0400 Subject: [PATCH] Implement variable depth minimax --- src/CheckersAI.java | 35 ++++++++++++++++++----------------- src/CheckersGameState3.java | 2 +- src/RmCheckersClient.java | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/CheckersAI.java b/src/CheckersAI.java index f761434..36a5b07 100644 --- a/src/CheckersAI.java +++ b/src/CheckersAI.java @@ -9,21 +9,24 @@ public class CheckersAI{ this.player = player; } - private boolean stop(CheckersGameState state, boolean jumped, int depth){ + private boolean stop(CheckersGameState state, boolean jumped, int depth, int min_ply){ CheckersGameState3 s = (CheckersGameState3) state; - if(!s.canJump() && !jumped && !s.canExchange() && depth == 3){ + if(depth < min_ply){ + return false; + } + else if(depth == min_ply && !s.canJump() && !jumped && !s.canExchange()){ return true; } - else if(!s.canJump() && !s.canExchange() && depth == 4){ + else if(depth == min_ply +1 && !s.canJump() && !s.canExchange() && depth == 4){ return true; } - else if(depth < 11 && !s.canJump()){ + else if(depth > min_ply +1 && depth < min_ply + 10 && !s.canJump()){ return true; } - else if(depth < 20 && s.twoKings()){ + else if(depth > min_ply +10 && depth < min_ply + 20 && s.twoKings()){ return true; } - else if(depth >= 20){ + else if(depth >= min_ply + 20){ return true; } else{ @@ -31,7 +34,7 @@ public class CheckersAI{ } } - public Move minimax(CheckersGameState s){ + public Move minimax(CheckersGameState s, int min_ply){ int depth = 0; if(s.isTerminal()){ return null; @@ -43,7 +46,7 @@ public class CheckersAI{ Move max = null; // System.out.println(s.actions().size()); for(Move a: s.actions()){ - check = minValue(s.result(a), alpha, beta, depth + 1, a.isJump()); + check = minValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply); if(check > v){ v = check; max = a; @@ -56,15 +59,14 @@ public class CheckersAI{ return max; } - private double maxValue(CheckersGameState s, double alpha, double beta, int depth, boolean jumped){ - - if(s.isTerminal() || stop(s, jumped, depth)){ - 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, depth + 1, a.isJump()); + check = minValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply); if(check > v){ v = check; } @@ -76,15 +78,14 @@ public class CheckersAI{ return v; } - private double minValue(CheckersGameState s, double alpha, double beta, int depth, boolean jumped){ - - if(s.isTerminal() || stop(s, jumped, depth)){ + 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, depth + 1, a.isJump()); + check = maxValue(s.result(a), alpha, beta, depth + 1, a.isJump(), min_ply); if(check < v){ v = check; } diff --git a/src/CheckersGameState3.java b/src/CheckersGameState3.java index 6593464..375f4d2 100644 --- a/src/CheckersGameState3.java +++ b/src/CheckersGameState3.java @@ -38,7 +38,7 @@ public class CheckersGameState3 implements CheckersGameState{ boolean canJump(){ //System.out.println(this.moves); - return this.actions.get(0).isJump(); + return (this.actions.size() > 0 && this.actions.get(0).isJump()); } boolean canExchange(){ diff --git a/src/RmCheckersClient.java b/src/RmCheckersClient.java index 5842136..2b271c8 100644 --- a/src/RmCheckersClient.java +++ b/src/RmCheckersClient.java @@ -145,7 +145,7 @@ public class RmCheckersClient { } while(currentState.actions().size()>0){ currentState.printState(); - Move myMove = ai.minimax(currentState); + Move myMove = ai.minimax(currentState, 8); writeMessageAndEcho(myMove.toString()); if(!applyMove(myMove.toString())) { System.out.println("couldn't apply my move");