2017-02-09 12 views
0

Я пытаюсь реализовать минимакс для tic-tac-toe. Проблема в том, что это не всегда так, как ожидалось. Я попытался отладить его и обнаружил, что в тех случаях, когда он не выбирает правильный ход, именно тогда оценка для этого движения почему-то «отрицательная бесконечность». Вот код:My Minimax не всегда выбирает лучший ход

`

function minimaxMove(board) { 

    let nextMove = null; 

    const mmRecurse = function (board, lastPlayer, depth) { 
     let winner = checkGameState(board); 

     if(winner == state.AIplayer) { 
     return -1000 + depth; 
     } else if(winner == state.playerIs) { 
     return depth - 1000; 
     } 

     let nextPlayer = lastPlayer == state.playerIs ? state.AIplayer : state.playerIs; 


     let moves = [], scores = []; 

     for(let i = 0; i < state.board.length; i++) { 
     let boardCopy = board.slice(); 
     if(boardCopy[i] == "E") { 
      boardCopy[i] = nextPlayer; 
      moves.push(i); 
      scores.push(mmRecurse(boardCopy, nextPlayer, depth+1)); 
     } 
     } 

     if(depth === 0) { 
     nextMove = moves[scores.indexOf(Math.max.apply(null,scores))]; 
     console.log(moves, scores, nextMove); 
     } else { 
     if(depth == 9) { 
      return 0; 
     } 
     if(nextPlayer == state.AIplayer) { 
      return Math.max.apply(null, scores); 
     } else if(nextPlayer == state.playerIs){ 
      return Math.min.apply(null, scores) 
     } 
     } 

    } 

    mmRecurse(board, state.playerIs, 0); 

    state.turn = state.playerIs; 
    return nextMove; 
    } 

`

Иногда это работает хорошо, иногда не выбирает правильный ход.

+0

Можете ли вы создать рабочую скрипку? –

+0

@IvanModric - https://jsfiddle.net/Askerov/ypgv4e8e/ - здесь. – askerovlab

ответ

0

Оказывается, мои проблемы были, если кому-то это понадобится, я изменил номер 1000 на 10, проверяя, что нужно возвращать. Кроме того, у меня не было ничего для рисования. Если вы хотели бы видеть источник on github

+1

Можете ли вы принять свой ответ, пожалуйста? – marli

+0

@marli, конечно. спасибо за напоминание, я не мог первые два дня, а потом забыл. – askerovlab