微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Tic Tac Toe AI-未选择最佳空间

如何解决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 举报,一经查实,本站将立刻删除。