如何解决Java Tic Tac Toe AI-未选择最佳空间
我一直在努力为Tic Tac Toe项目创建无与伦比的AI。
我一直在使用&Coding Train教程进行谷歌搜索-但是,AI似乎仍在选择随机正方形。 尽管在选择哪个方格后面必须有逻辑,但我无法弄清楚逻辑是什么!
这是我的代码笔-https://codepen.io/kath-ldn/pen/oNLZqrp,我已经复制了下面的相关代码。
如果有人可以看看这个,我将非常感激。我已经被困了好几天了,无法解决问题所在。
//functions to assess winning combos
function equals3(a,b,c) {
return a === b && b === c && a !== "";
}
function checkWinner(){
let winner = null;
if (equals3(gameBoard[0],gameBoard[1],gameBoard[2])) {
winner = gameBoard[0];
};
if (equals3(gameBoard[3],gameBoard[4],gameBoard[5])) {
winner = gameBoard[3];
};
if (equals3(gameBoard[6],gameBoard[7],gameBoard[8])) {
winner = gameBoard[6];
};
if (equals3(gameBoard[0],gameBoard[3],gameBoard[6])) {
winner = gameBoard[0];
};
if (equals3(gameBoard[1],gameBoard[7])) {
winner = gameBoard[1];
};
if (equals3(gameBoard[2],gameBoard[5],gameBoard[8])) {
winner = gameBoard[0];
};
if (equals3(gameBoard[0],gameBoard[8])) {
winner = gameBoard[0];
};
if (equals3(gameBoard[2],gameBoard[6])) {
winner = gameBoard[2];
};
let openSpots = 0;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
openSpots = openSpots + 1;
};
};
if (winner === null && openSpots === 0) {
return 'tie';
} else {
return winner;
};
};
let scores = {
X: 10,O: -10,tie: 0
};
//function to create impossible-to-beat AI using minimax algorithm
function bestMove() {
let bestscore = -Infinity;
let move;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
gameBoard[i] = AI;
let score = minimax(gameBoard,false);
gameBoard[i] = "";
if (score > bestscore) {
bestscore = score;
move = i;
}
}
}
gameBoard[move] = AI;
};
//minimax function
function minimax(gameBoard,depth,isMaximizing){
let result = checkWinner();
if (result !== null) {
return scores[result];
}
if (isMaximizing) {
let bestscore = -Infinity;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
gameBoard[i] = AI;
let score = minimax(gameBoard,depth + 1,false);
gameBoard[i] = "";
bestscore = Math.max(score,bestscore);
}
}
return bestscore;
} else {
let bestscore = Infinity;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
gameBoard[i] = human;
let score = minimax(gameBoard,true);
gameBoard[i] = "";
bestscore = Math.min(score,bestscore);
}
}
return bestscore;
}
};
解决方法
您正在遍历整个电路板并为每个正方形调用minimax,这不是必需的,并且会非常慢。您只需要这样调用一次:
move,score = minimax(gameBoard,8,true)
我不确定是否需要它,但是我将从checkWinner函数返回0而不是返回“ tie”字符串。似乎很难从例如否则为1和“ te”。
然后在minimax函数中,您需要更改一些内容以实际返回它找到的最佳动作。对任何编程语言问题都感到抱歉,我已经习惯了Python。希望您无论如何都能理解我的意思
//minimax function
function minimax(gameBoard,depth,isMaximizing){
let result = checkWinner();
if (result !== null) {
return None,scores[result];
}
if (isMaximizing) {
let bestScore = -Infinity;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
gameBoard[i] = AI;
let score = minimax(gameBoard,depth - 1,false)[1];
gameBoard[i] = "";
if score > bestScore:
bestScore = score
bestMove = gameBoard[i]
}
}
return bestMove,bestScore;
} else {
let bestScore = Infinity;
for (let i = 0; i < gameBoard.length; i++) {
if (gameBoard[i] === "") {
gameBoard[i] = human;
let score = minimax(gameBoard,true)[1];
gameBoard[i] = "";
if score < bestScore:
bestScore = score
bestMove = gameBoard[i]
}
}
return bestMove,bestScore;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。