Version 0.9.2
============= External config file. Move ordering.
This commit is contained in:
@ -270,7 +270,7 @@ public class Board {
|
|||||||
/*================*
|
/*================*
|
||||||
* PUBLIC METHODS *
|
* PUBLIC METHODS *
|
||||||
*================*/
|
*================*/
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This methods takes a {@link Move} and applies it (updating the bitboard)
|
* This methods takes a {@link Move} and applies it (updating the bitboard)
|
||||||
@ -649,4 +649,10 @@ public class Board {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int compare(Object arg0, Object arg1) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package suicideChess;
|
package suicideChess;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@ -175,7 +176,8 @@ public class ComputerPlayer {
|
|||||||
|
|
||||||
private static Date thinkingBeginingTime;
|
private static Date thinkingBeginingTime;
|
||||||
private static int maxDepth;
|
private static int maxDepth;
|
||||||
private static ArrayList<Move> bestMoves=new ArrayList<Move>();
|
private static ArrayList<Move> bestMoves=new ArrayList<Move>();
|
||||||
|
|
||||||
//this class is used to return two arguments in the next function, the two arguments being
|
//this class is used to return two arguments in the next function, the two arguments being
|
||||||
//an integer representing the value of alpha or beta
|
//an integer representing the value of alpha or beta
|
||||||
//an integer representing the real value of the branch (alpha-beta only give boundaries)
|
//an integer representing the real value of the branch (alpha-beta only give boundaries)
|
||||||
@ -194,19 +196,41 @@ public class ComputerPlayer {
|
|||||||
};
|
};
|
||||||
private static ReturnWrapper AlphaBeta(Board bitboard, int currentDepth, int alpha, int beta) throws NotAValidSquare, NoPieceOnSquare {
|
private static ReturnWrapper AlphaBeta(Board bitboard, int currentDepth, int alpha, int beta) throws NotAValidSquare, NoPieceOnSquare {
|
||||||
nodesSearched++;
|
nodesSearched++;
|
||||||
|
int currentMaxDepth = maxDepth; //this is when intelligent depth is on, the computer may search one step further
|
||||||
|
|
||||||
if(bitboard.isADraw()) {
|
if(!SuicideChess.QUIESCENCE_SEARCH || currentMaxDepth>=SuicideChess.MAX_PLY_DEPTH) { //stop if we are getting to deep
|
||||||
return new ReturnWrapper(Board.DRAW_BOARD,Board.DRAW_BOARD,"");
|
if(bitboard.isADraw()) {
|
||||||
|
return new ReturnWrapper(Board.DRAW_BOARD,Board.DRAW_BOARD,"");
|
||||||
|
}
|
||||||
|
if (currentDepth >= currentMaxDepth) {
|
||||||
|
//System.out.println("'-> Evaluate: "+bitboard.getBoardValue());
|
||||||
|
return new ReturnWrapper(bitboard.getBoardValue(),bitboard.getBoardValue(),"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (currentDepth >= maxDepth) {
|
|
||||||
//System.out.println("'-> Evaluate: "+bitboard.getBoardValue());
|
|
||||||
return new ReturnWrapper(bitboard.getBoardValue(),bitboard.getBoardValue(),"");
|
|
||||||
}
|
|
||||||
|
|
||||||
Rules.legalMovesForPlayer(bitboard);
|
Rules.legalMovesForPlayer(bitboard);
|
||||||
ArrayList<Move> allLegalMoves = Rules.getLegalMovesCapture();
|
ArrayList<Move> allLegalMoves = Rules.getLegalMovesCapture();
|
||||||
if (allLegalMoves.size()==0) {
|
if (allLegalMoves.size()==0) {
|
||||||
|
if(SuicideChess.QUIESCENCE_SEARCH) {
|
||||||
|
if(bitboard.isADraw()) {
|
||||||
|
return new ReturnWrapper(Board.DRAW_BOARD,Board.DRAW_BOARD,"");
|
||||||
|
}
|
||||||
|
if (currentDepth >= currentMaxDepth) {
|
||||||
|
//System.out.println("'-> Evaluate: "+bitboard.getBoardValue());
|
||||||
|
return new ReturnWrapper(bitboard.getBoardValue(),bitboard.getBoardValue(),"");
|
||||||
|
}
|
||||||
|
}
|
||||||
allLegalMoves = Rules.getLegalMovesNonCapture();
|
allLegalMoves = Rules.getLegalMovesNonCapture();
|
||||||
|
} else { //if there are captures, see if we can just abandon search here
|
||||||
|
if (SuicideChess.INTELLIGENT_DEPTH) {
|
||||||
|
currentMaxDepth++; //go one step further in depth
|
||||||
|
if(currentDepth==0 && allLegalMoves.size()==1) {
|
||||||
|
bestMoves.clear();
|
||||||
|
bestMoves.add(allLegalMoves.get(0));
|
||||||
|
Board boardCopy = new Board(bitboard);
|
||||||
|
boardCopy.doMove(allLegalMoves.get(0));
|
||||||
|
return new ReturnWrapper(bitboard.getBoardValue(),bitboard.getBoardValue(),allLegalMoves.get(0).toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (allLegalMoves.size()==0) {
|
if (allLegalMoves.size()==0) {
|
||||||
if (bitboard.getCurrentPlayer()==Piece.BLACK) {
|
if (bitboard.getCurrentPlayer()==Piece.BLACK) {
|
||||||
@ -221,7 +245,10 @@ public class ComputerPlayer {
|
|||||||
int bestScoreSoFar;
|
int bestScoreSoFar;
|
||||||
int currentAlphaBeta;
|
int currentAlphaBeta;
|
||||||
String bestVariationSoFar="";
|
String bestVariationSoFar="";
|
||||||
if (bitboard.getCurrentPlayer()==Piece.BLACK) {
|
if (SuicideChess.MOVE_ORDERING) {
|
||||||
|
Collections.sort(allLegalMoves,new MoveCompare(bitboard));
|
||||||
|
}
|
||||||
|
if (bitboard.getCurrentPlayer()==Piece.BLACK) {
|
||||||
bestScoreSoFar=Board.MAX_VALUE; //black tries to minimise
|
bestScoreSoFar=Board.MAX_VALUE; //black tries to minimise
|
||||||
for (int i=0; i<allLegalMoves.size(); i++) {
|
for (int i=0; i<allLegalMoves.size(); i++) {
|
||||||
Board boardCopy = new Board(bitboard);
|
Board boardCopy = new Board(bitboard);
|
||||||
@ -326,5 +353,4 @@ public class ComputerPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
52
src/suicideChess/MoveComparator.java
Normal file
52
src/suicideChess/MoveComparator.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package suicideChess;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
import suicideChess.Board.NoPieceOnSquare;
|
||||||
|
import suicideChess.Square.NotAValidSquare;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is used to sort Moves in the alpha beta pruning.
|
||||||
|
*
|
||||||
|
* @author Jean-Baptiste Hétier
|
||||||
|
* @version $LastChangedRevision$, $LastChangedDate$
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class MoveCompare implements Comparator<Move> {
|
||||||
|
|
||||||
|
private Board bitboard; //the bitboard to do the moves from
|
||||||
|
private int sortOrder; //increasing or decreasing order
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param bitboard, the bitboard to do the moves from
|
||||||
|
* @param order, who is playing (black or white) -> will give the order in which to sort (black minimises and white maximises)
|
||||||
|
*/
|
||||||
|
public MoveCompare(Board bitboard) {
|
||||||
|
this.bitboard = bitboard;
|
||||||
|
if(this.bitboard.getCurrentPlayer()==Piece.BLACK) {
|
||||||
|
sortOrder= +1;
|
||||||
|
} else {
|
||||||
|
sortOrder= -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int compare(Move one, Move another) {
|
||||||
|
Board oneBoardCopy = new Board(bitboard);
|
||||||
|
Board anotherBoardCopy = new Board(bitboard);
|
||||||
|
try {
|
||||||
|
oneBoardCopy.doMove(one);
|
||||||
|
anotherBoardCopy.doMove(another);
|
||||||
|
} catch (NoPieceOnSquare e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NotAValidSquare e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if(oneBoardCopy.getBoardValue()>anotherBoardCopy.getBoardValue()) {
|
||||||
|
return sortOrder;
|
||||||
|
} else if (oneBoardCopy.getBoardValue()>anotherBoardCopy.getBoardValue()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -sortOrder;
|
||||||
|
}
|
||||||
|
}
|
@ -96,7 +96,14 @@ public class OpeningBook {
|
|||||||
nbOfMovesThatHaveBeenPlayed++;
|
nbOfMovesThatHaveBeenPlayed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a move from the book if available, given a bitboard.
|
||||||
|
* @param bitboard
|
||||||
|
* @return
|
||||||
|
* @throws NotAValidMoveException
|
||||||
|
* @throws NotAValidSquare
|
||||||
|
* @throws NoOpeningMovesLeft
|
||||||
|
*/
|
||||||
public static Move getMove(Board bitboard) throws NotAValidMoveException, NotAValidSquare, NoOpeningMovesLeft {
|
public static Move getMove(Board bitboard) throws NotAValidMoveException, NotAValidSquare, NoOpeningMovesLeft {
|
||||||
ArrayList<Move> possibleMoves = new ArrayList<Move>();
|
ArrayList<Move> possibleMoves = new ArrayList<Move>();
|
||||||
for (int i=0; i<validMoves.length; i++) {
|
for (int i=0; i<validMoves.length; i++) {
|
||||||
|
@ -34,10 +34,25 @@ public class SuicideChess {
|
|||||||
*/
|
*/
|
||||||
public static final boolean SQUARE_CHECK_INVALID = true;
|
public static final boolean SQUARE_CHECK_INVALID = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* do move ordering in Alpha-Beta pruning ?
|
||||||
|
*/
|
||||||
|
public static final boolean MOVE_ORDERING = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intelligent depth -> ie: when only one possible move, don't search. When very few moves, add one to depth.
|
||||||
|
*/
|
||||||
|
public static final boolean INTELLIGENT_DEPTH = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quiescence search -> don't evaluate if captures are possible.
|
||||||
|
*/
|
||||||
|
public static final boolean QUIESCENCE_SEARCH = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name to be displayed
|
* The name to be displayed
|
||||||
*/
|
*/
|
||||||
public static final String NAME = "djib's SuShi v0.8.9";
|
public static final String NAME = "djib's SuShi v0.9.2";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays informations in the console.
|
* Displays informations in the console.
|
||||||
|
Reference in New Issue
Block a user