Создайте непобедимый крестики-нолики с помощью алгоритма минимакса - PullRequest
0 голосов
/ 19 октября 2019

Я новичок в JavaScript, и я пытаюсь создать свою первую игру tictactoe просто для удовольствия, но когда я ее создаю, работало обычное tictactoe (2 игрока), но когда я пытаюсь добавить движение AI, используя случайныйАй, это было не умно, поэтому я
Я пытаюсь добавить минимаксный алгоритм, чтобы сделать мой tictactoe AI непобедимым, но он не работает, и он просто показывает мне X во всей строке, я застрял в этом коде, как 1 неделю, ятак смущен тем, как я могу сделать это непобедимым. Это мой javascript, html и css код
Пожалуйста, если у кого-то есть ответ для меня, пожалуйста, помогите мне Спасибо

game_over = false,
 score = [0,0],
 moves = 0;
 var human ="X";
 var computer ="O"
 var origBoard;
 function startGame(){

 origboard= Array.from(Array(9).keys());
 
 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++) {
 clearBox(i);
 }
 turn=human;
   
 document.winner=null;
 setMessage(  "Player "+turn + " Start");
 }
 function setMessage(msg) { 
 document.getElementById("message").innerText = msg;
 }
 function nextMove(square){
 if(document.winner != null) {
 setMessage(document.winner +" won the Game."); 
 }
 else if(square.innerText=="") {
 square.innerText = turn;
 switchTurn();
 } 
 }

 function switchTurn(){

 if (checkForWinner(turn)){
 setMessage(" Player " + turn + " You win!");
 document.winner = turn;
                          
          
 } else if (checkDraw()){
 setMessage("Draw");
 }else if (turn == human){
 turn =computer;
 computerMove();
 setMessage( "Player "+turn + " turn");

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

    
 function checkForWinner(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 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 clearBox(number) {
 document.getElementById("s" + number).innerText = "";
 }


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

 } 
   

 function minimax(newBoard, player){
 var availSpots = empty(newBoard);

 if (checkForWinner(newBoard, human)){
    return {score: -10};
 } else if (checkForWinner(newBoard, computer)) {
    return {score: 10};
 } else if (availSpots.length === 0) {
    return {score: 0};
 }
 var moves = [];
 for (var i = 0; i < availSpots.length; i++) {
 var move = {};
 move.index = newBoard[availSpots[i]];
 newBoard[availSpots[i]] = player;

 if (player == aiPlayer) {
 var result = minimax(newBoard, human);
 move.score = result.score;
 } else {
 var result = minimax(newBoard, computer);
 move.score = result.score;
 }

 newBoard[availSpots[i]] = move.index;

 moves.push(move);
 }

 var bestMove;
 if(player === computer) {
 var bestScore = -10000;
 for(var i = 0; i < moves.length; i++) {
 if (moves[i].score > bestScore) {
 bestScore = moves[i].score;
 bestMove = i;
 }
 }
 } else {
 var bestScore = 10000;
 for(var i = 0; i < moves.length; i++) {
 if (moves[i].score < bestScore) {
 bestScore = moves[i].score;
 bestMove = i;
 }
 }
 }

 return moves[bestMove];
   
 }






 function computerMove() {
 return minimax(origBoard, computer); 
 }


 
 function empty() {
 var empty = true;
 var space = document.getElementsByTagName("td");
 for (var i = 0; i < space.length; i++) {
 if (space[i].innerHTML.length < 1) empty = false;                              
 }
 return empty;
 }
 
  
 td { 
 
 height: 100px; 

 width: 100px; 
 
   font-size: 20px; 
 
  text-align: center; 
   } 
 

    
  
  <body onload="startGame();"> 
 
 

 
 <div id="message">sss</div> 
 

 
 <table class="squares"  border = "1"> 
 
 <tr> 
 
  <td class="square" id="s1" onClick="nextMove(this)"></td> 
 
  <td class="square" id="s2" onClick="nextMove(this)"></td> 
 
  <td class="square" id="s3" onClick="nextMove(this)"></td> 
  </tr> 
  <tr> 
 
   <td class="square" id="s4" onClick="nextMove(this)"></td> 
 
   <td class="square" id="s5" onClick="nextMove(this)"></td> 
 
    <td class="square" id="s6" onClick="nextMove(this)"></td> 
 
    </tr> 
 
    <tr> 
 
    <td class="square" id="s7" onClick="nextMove(this)"></td> 
 
     <td class="square" id="s8" onClick="nextMove(this)"></td> 
 
      <td class="square" id="s9" onClick="nextMove(this)"></td> 

       </tr> 
       </div>
       </table> 

        

он должен выбрать лучший ход и быть непобедимым

...