2017-08-11 3 views
0

未定義のプロパティ 'score'を読み取ることができません。これはminimaxアルゴリズムを使用したtic tac toeゲームです。ここに私の全体のアプリケーションのためのペンです。未定義のプロパティ 'score'を読み取ることができません

https://codepen.io/MartinaMF/pen/LjNdNN

$(document).ready(function(){ 
    var turns=[0,1,2,3,4,5,6,7,8]; 
    var computerTurn; 
    var playerTurn; 
    var iter=0; 
    var count=0; 

    function winCondition(turnArray,currentTurn){ 
    if((turnArray[0]===currentTurn && turnArray[1]===currentTurn && turnArray[2]===currentTurn)|| 
     (turnArray[3]===currentTurn && turnArray[4]===currentTurn && turnArray[5]===currentTurn)|| 
     (turnArray[6]===currentTurn && turnArray[7]===currentTurn && turnArray[8]===currentTurn)|| 
     (turnArray[0]===currentTurn && turnArray[3]===currentTurn && turnArray[6]===currentTurn)|| 
     (turnArray[1]===currentTurn && turnArray[4]===currentTurn && turnArray[7]===currentTurn)|| 
     (turnArray[2]===currentTurn && turnArray[5]===currentTurn && turnArray[8]===currentTurn)|| 
     (turnArray[0]===currentTurn && turnArray[4]===currentTurn && turnArray[8]===currentTurn)|| 
     (turnArray[2]===currentTurn && turnArray[4]===currentTurn && turnArray[6]===currentTurn)){ 
     return true; 
    } 
    else{ 
     return false;} 

    } 
    function availableSpots(Arr){ 
    return Arr.filter(function(item){ 
     return item!="X" && item!="O"; 
    }); 
    } 
    function minimax(reboard,player){ 
    iter++; 
    let array = availableSpots(reboard); 
    if (winCondition(reboard, playerTurn)) 
    { 
    return {score:-10}; 

    } 
    else if (winCondition(reboard, computerTurn)) 
    { 
    return 
    {score:10}; 

     } 
    else if (array.length === 0) 
    { 
    return {score:0}; 

    } 
    var moves = []; 
    for(var i=0; i<array.length;i++){ 
     var move = {}; 
     move.index = reboard[array[i]]; 
     reboard[array[i]] = player; 
     if(player==computerTurn){ 
     var g = minimax(reboard, playerTurn); 
     move.score = g.score; 
     } 
     else{ 
     var g = minimax(reboard, computerTurn); 
     move.score = g.score; 
     } 
     reboard[array[i]] = move.index; 
     moves.push(move); 
    } 
    var bestMove; 
    if(player === computerTurn){ 
     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 reset(){ 
    turns = [0,1,2,3,4,5,6,7,8]; 
    count = 0; 
    $(".box").text(""); 
    } 
    function movement(turn,id){ 
    var spotTaken = $("#"+id).text(); 
    if(spotTaken!="X" ||spotTaken!="O"){ 
     count++; 
    $("#"+id).text(turn); 
     turns[id]=turn; 
     if(winCondition(turns,turn)){ 
     alert("you win!!"); 
     reset(); 
     }else if(count>8){ 
     alert("it was a draw"); 
     reset(); 
     } 
     else{ 
     count++; 
     var computerChoice = minimax(turns,computerTurn).index; 
     console.log(computerChoice); 
     $("#"+computerChoice).text(computerTurn); 
     turns[computerChoice]=computerTurn; 
     if(winCondition(turns,computerTurn)){ 
      alert("you lose!!"); 
      reset(); 
     } 
     else if(count > 8){ 
      alert("it was a draw"); 
     } 
     } 

    } 
    } 
    $("#onePlayer").on("click",function(){ 
    $("#xOro").show(); 
    $("#chooseGame").hide(); 
    }); 
    $("#chooseX").on("click",function(){ 
    $("#xOro").hide(); 
    $("#gameBoard").show(); 
    computerTurn = "O"; 
    playerTurn = "X"; 
    $(".playerOneTurn").show(); 
    $(".playerOneTurn").html("<p>Computer's turn</p>"); 

    }); 
    $("#chooseO").on("click",function(){ 
    $("#xOro").hide(); 
    $("#gameBoard").show(); 
    computerTurn = "X"; 
    playerTurn = "O"; 
    $(".playerOneTurn").show(); 
    $(".playerOneTurn").html("<p>Computer's turn</p>"); 
    }); 
    $(".box").on("click",function(){ 
    var spot = $(this).attr("id"); 
    movement(playerTurn,spot); 
    }); 
}); 

は、私は上記のペンでチックタックつま先のゲームのためのペンを作成したが、私はそれが私にこのメッセージを表示します再生しようとすると、「未定義のプロパティスコアを読み取ることができません」私は知りませんどうして ?誰も私を助けてくれる?

+2

あなたのペンは404をスローします。URLを更新してください –

+0

あなたはこれまでに宣言しましたか? 'reboard'ですか? 'var reboard = {}'のように? 'let array'は' var array'よりも優れていますか? 'array'スコープが限られていると便利ですか? – zer00ne

+0

いいえReboardを宣言していませんでした。それは配列でなければならない関数の属性です。配列とvarの配列はどちらも同じです@ zer00ne –

答えて

0

あなたのミニマックス()が返す{スコア}とは、あなたがこれをやっている:失敗する行の下のよう

var g = minimax(reboard, computerTurn).score; 
move.score = g.score; 

'g' は、スコア値ではないオブジェクトを持っている

move.score = g.score; 

ます

var g = minimax(reboard, computerTurn).score; 
move.score = g; 
+0

残念ですが、元のコードを削除することを忘れました(.score)ミニマックス(reboard、computerTurn); move.score = g.score; –

+0

も私に同じエラーを与えます –

+0

私はすでに@ Jibin.Jayのコードを更新しました –

0

そのままでは、minmax()は2人のマスターを務めようとします...試みで失敗します。 movement()から呼び出さ

  • minmax().indexプロパティを持つオブジェクトを返すことが期待されています。
  • 再帰的に呼び出された場合、minmax()は、.scoreプロパティを持つオブジェクトを返すと予想されます。

ただし、それはすなわちmoveオブジェクト、常に両方の性質を持つオブジェクトを返すためにminmax()ための簡単です、おそらく、発信者のニーズのminmax()を通知し、それに応じて構成することができます。これを行うには、胚のmoveオブジェクトにカプセル化された索引(さらにスコアが追加されて返される)を索引に渡すことができます。必要な改造といくつかの単純化して

、私はこれで終わった:

function minimax(reboard, player, move) { 
    let array = availableSpots(reboard); 
    if (winCondition(reboard, playerTurn)) { 
     return $.extend(move, { score: -10 }); // Yay!, returned object will be a `move` with an .index and a .score property. 
    } else if (winCondition(reboard, computerTurn)) { 
     return $.extend(move, { score: 10 }); // ... ditto ... 
    } else if (array.length === 0) { 
     return $.extend(move, { score: 0 }); // ... ditto ... 
    } 
    var moves = array.map(function(index) { 
     var reboard_ = reboard.slice(0, index).concat(player).concat(reboard.slice(index + 1)); // to prevent mutation of reboard, work with a mutated clone. 
     return minimax(reboard_, (player == computerTurn) ? playerTurn : computerTurn, { 'index': index }); // pass an embryonic `move` object. 
    }); 
    if(player === computerTurn) { 
     // Yay!, returned object will be a `move` with an .index and a .score property. 
     return moves.reduce(function(best, move) { 
      return (move.score > best.score) ? move : best; 
     }, {'index': -1, 'score': -10000}); // starter object for the reduction 
    } else { 
     // ... ditto ... 
     return moves.reduce(function(best, move) { 
      return (move.score < best.score) ? move : best; 
     }, {'index': -1, 'score': 10000}); // starter object for the reduction 
    } 
} 

のみ、他の変更はminimax()再帰が開始されmovement()、である:

var computerChoice = minimax(turns, computerTurn, { 'index': id }).index; // pass an embryonic `move` object 

テストされていません

関連する問題