我有一个井字游戏随机AI,可以在JavaScript中工作,但并不聪明。我想知道如何使它无与伦比

问题描述 投票:-1回答:1

我尝试同时添加最佳的Move和minimax算法,以使我的井字游戏无与伦比,但它不起作用

function computerMove() {
  var blanks = [];
  for (var i = 1; i <= 9; i++) {
    var place = document.getElementById("s" + i).innerText;
    if (place == "") blanks.push([i]);
  }
  if (blanks.length > 0) {
    var bestMove = Math.floor(Math.random() * blanks.length);
    nextMove(document.getElementById("s" + blanks[bestMove]));
  }
  var moves = [];
  if (currentTurn === computer) {
    var bestScore = -100000;
    for (var k = 0; k < moves.length; k++) {
      if (moves[k].score > bestScore1) {
        bestScore = moves[k].score;
        bestMove = k;
      }
    }
  } else {
    var bestScore = 100000;
    for (var l = 0; l < moves.length; l++) {
      if (moves[l].score < bestScore2) {
        bestScore = moves[l].score;
        bestMove = l;
      }
    }
  }

  return moves[bestMove];
}

它应该选择最好的动作并且无与伦比

artificial-intelligence minimax
1个回答
0
投票
var human = "X"; 

var computer = "O"; 




function startGame() { 

  var td = document.getElementsByTagName('td');
for( let i=0; i<td.length;i++){
  td[i].innerHTML="";
  td[i].style.background="none";
}


    for (var i= 1; i<=9; i++) {
       clearBoard(i);
    }


  currentTurn = human
    document.winner=null;
        setMessage(  "Player "+ currentTurn + " turn.");


} 



function setMessage(message) { 

 document.getElementById("message").innerText = message; 

} 



function nextMove(square) { 

 if (document.winner != null) { 

  setMessage(currentTurn + " has already won."); 

 }  else if ( square.innerText==""){
   square.innerText= currentTurn
 }

 swapTurn();  



} 

function swapTurn(){
if (winner(currentTurn)){

                setMessage(" Player " + human + " You win!");
                } if (winner(computer)){

                  setMessage("computer "+ " win!");

                }
                document.winner =currentTurn;
                   if (checkDraw()){
                     setMessage("Draw");

            } else if ( currentTurn==human){

                    currentTurn=computer;
                         computerMove();
                           setMessage("Player " + currentTurn + " turn");
                         }
             else if ( currentTurn=human){
              setMessage("Player " + currentTurn + "turn")
            }


}





 function Winner(move) { 

 var result = false; 

 if (checkRow(1,2,3, move) || 

 checkRow(4,5,6, move) || 

 checkRow(7,8,9, move) || 

 checkRow(1,4,7, move) || 

 checkRow(2,5,8, move) || 

 checkRow(3,6,9, move) || 

 checkRow(1,5,9, move) || 
checkRow(3,5,7, move))


{ 

   result = true; 

 } 

 return result; 

}





 function computerMove(){
    return minimax (origboard,computer)


  }



function minimax(newBoard, player){

    var availSpots = this.empty(newBoard);
    if(this.winner(newBoard, computer)){
      return {score: 10};
    }
    else if(this.winner(newBoard, human)){
      return {score: -10};
    }
    else if(availSpots.length === 0){
      return {score: 0};
    }

    var moves = [];

    for(var j = 0; j < availSpots.length; j++){
      var move = {};
      move.index = availSpots[j];
      newBoard[availSpots[j]] = player;
      if(player === computer){
        var result1 = this.minimax(newBoard, human);
        move.score = result1.score;
      }
      else{
        var result2 = this.minimax(newBoard, computer);
        move.score = result2.score;
      }

      newBoard[availSpots[j]] = move.index;
      moves.push(move);
    }

    var bestMove;
    if(player === computer){
      var bestScore1 = -100000;
      for(var k = 0; k < moves.length; k++){
        if(moves[k].score > bestScore1){
          bestScore1 = moves[k].score;
          bestMove = k;
        }
      }
    }
    else{
      var bestScore2 = 100000;
      for(var l = 0; l < moves.length; l++){
        if(moves[l].score < bestScore2){
          bestScore2 = moves[l].score;
          bestMove = l;
        }
      }
    }

    return moves[bestMove];
  }


 function checkDraw(){
            for (var i = 1; i <= 9; i = i + 1) 
                if(getBox(i)=="")
                    return false;
            return true;


        }
function checkRow(a, b, c, move) { 

 var result = false; 

 if(getBox(a) == move && getBox(b) == move && getBox(c) == move) { 

 result = true; 

 } 

 return result; 

} 



function getBox(number) { 

 return document.getElementById("s" + number).innerText; 

}            






function clearBoard(number) { 

 document.getElementById("s" + number).innerText = ""; 

} 

© www.soinside.com 2019 - 2024. All rights reserved.