2017-02-09 8 views
0

私はtic-tac-toe用のminimaxを実装しようとしています。問題は、必ずしも期待通りではないということです。私はそれをデバッグしようとしましたが、正しい動きを選択しない場合、その動きのスコアが何らかの理由で「負の無限大」であることがわかりました。私の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、確かに – marli

+0

思い出してくれてありがとう、私は最初の二日間はできなかったし、それから忘れてしまった。 – askerovlab

関連する問題