数值Tic-Tac-Toe错误的Java-Minimax算法
我有一个算法的问题,我试图实现作为大学作业。我正在制作数字版的tic-tac-toe。我的讲师给了我们班他版本的极小极大算法,用于标准的tic-tac-toe游戏,我们现在必须为数字tic-tac-toe实现它。他的标准实施如下:数值Tic-Tac-Toe错误的Java-Minimax算法,java,algorithm,libgdx,minimax,Java,Algorithm,Libgdx,Minimax,我有一个算法的问题,我试图实现作为大学作业。我正在制作数字版的tic-tac-toe。我的讲师给了我们班他版本的极小极大算法,用于标准的tic-tac-toe游戏,我们现在必须为数字tic-tac-toe实现它。他的标准实施如下: public class MinimaxPlayer extends BasePlayer { private Random randomGenerator; public MinimaxPlayer(Board board, int symbol) {
public class MinimaxPlayer extends BasePlayer {
private Random randomGenerator;
public MinimaxPlayer(Board board, int symbol) {
super(board, symbol);
name = "MinimaxPlayer";
skill = 5; // skill is measure of search depth
randomGenerator = new Random();
}
@Override
public int move () {
return (int) minimax(mySymbol, opponentSymbol, 0);
}
private float minimax(int p_mySymbol, int p_opponentSymbol, int depth) {
final float WIN_SCORE = 100;
final float DRAW_SCORE = 0;
float score;
float maxScore = -10000;
int maxPos = -1;
// for each board position
for (int r=0; r<3; ++r) {
for (int c=0; c<3; ++c) {
// skip over used positions
if (board.cells[r][c]!=board.EMPTY) continue;
String indent = new String(new char[depth]).replace("\0", " ");
//Gdx.app.log(indent, "search ("+r+","+c+")");
// place move
board.cells[r][c] = p_mySymbol;
// evaluate board (recursively)
if (board.hasWon(p_mySymbol, r, c)) {
score = WIN_SCORE;
} else if (board.isDraw()) {
score = DRAW_SCORE;
} else {
if (depth<skill) {
score = -minimax(p_opponentSymbol, p_mySymbol, depth+1);
} else {
score = 0;
}
}
// update ranking
if (Math.abs(score-maxScore)<1.0E-5 && randomGenerator.nextDouble()<0.1) {
maxScore = score;
maxPos = 3*r+c;
} else if (score>maxScore) { // clear
maxScore = score;
maxPos = 3*r+c;
}
//Gdx.app.log(indent, "Score "+score);
// undo move
board.cells[r][c] = board.EMPTY;
}
}
// on uppermost call return move not score
return (depth==0? maxPos : maxScore);
};
公共类MinimaxPlayer扩展BasePlayer{
专用随机发生器;
公共MinimaxPlayer(棋盘,整数符号){
超级(板、符号);
name=“MinimaxPlayer”;
skill=5;//skill是搜索深度的度量
随机生成器=新随机();
}
@凌驾
公共整数移动(){
返回(int)极小极大值(mySymbol,opponentSymbol,0);
}
私有浮点极小极大值(int p_mySymbol,int p_opponentSymbol,int depth){
最终浮点数赢分数=100;
最终浮点数=0;
浮点数;
浮点最大分数=-10000;
int maxPos=-1;
//每个董事会职位
对于(int r=0;rWhere在if中定义为空(board.cells[r][c]!=board.EMPTY)continue;?@Floam EMPTY是在给MinimaxPlayer构造函数的board类中定义的。EMPTY只是一个值为0的最终int。这表示棋盘上有一个空格,因此如果该空格不为空,那么检查它就没有意义了,所以我们“继续”并跳过该空格。你能发布BasePlayer的内容吗?我很好奇如果它与:if(深度)有关,那么在if(board.cells[r][c]!=board.EMPTY)中定义空是什么continue;?@Floam EMPTY是在给MinimaxPlayer构造函数的board类中定义的。EMPTY只是一个值为0的最终int。这表示棋盘上有一个空格,因此如果该空格不为空,那么检查它就没有意义了,所以我们“继续”并跳过该空格。你能发布BasePlayer的内容吗?我很好奇如果它与:if(深度)有关,则为ing
public class MinimaxPlayer extends BasePlayer {
private Random randomGenerator;
//change constructor to take skill levels for depth search.
public MinimaxPlayer(Board board, Symbol symbol,int depth) {
super(board, symbol);
name = "MinimaxPlayer";
// skill is measure of search depth
skill = depth;
randomGenerator = new Random();
}
@Override
public int move () {
return (int) minimax(board.currentPlayer.numbers, board.currentPlayer.opponent.numbers, 0);
}
private float minimax(List<Integer> myNumbers, List<Integer> opponentNumbers, int depth) {
final float WIN_SCORE = 100;
final float DRAW_SCORE = 0;
float score;
float maxScore = -10000;
int maxPos = -1;
// for each board position
for (int r=0; r<3; ++r) {
for (int c=0; c<3; ++c) {
for(Integer number : myNumbers){
// skip over used positions
if (board.cells[r][c]!=board.EMPTY) continue;
// place move
board.cells[r][c] = number;
System.out.println("Number placed :" + number);
// evaluate board (recursively)
if (board.hasWon(number, r, c)) {
score = WIN_SCORE;
System.out.println("This move has won with score: "+ score);
} else if (board.isDraw()) {
score = DRAW_SCORE;
System.out.println("this move is a draw and score is: " + score);
} else {
System.out.println("Depth is now: " + depth);
if (depth<skill) {
score = -minimax(opponentNumbers, myNumbers, depth+1);
} else {
score = 0;
}
}
System.out.println("Made it to update rankings");
// update ranking
if (Math.abs(score-maxScore)<1.0E-5 && randomGenerator.nextDouble()<0.1) {
currentNumber = number;
maxScore = score;
maxPos = 3*r+c;
} else if (score>maxScore) { // clear
currentNumber = number;
maxScore = score;
maxPos = 3*r+c;
}
//Gdx.app.log(indent, "Score "+score);
System.out.println("Undone move");
// undo move
board.cells[r][c] = board.EMPTY;
}
}
}
System.out.println("Depth:" + depth);
System.out.println("MaxScore:" + maxScore);
System.out.println("MaxPosition: "+ maxPos);
// on uppermost call return move not score
return (depth==0 ? maxPos : maxScore);
};