2017-05-17 3 views
0

私はtic-tac-toeのJavaScriptゲームを作成し、Wikipediaの記事で概説されている戦略に基づいて賢明な動きをするほどスマートにしようとしています。 IEに2つのXまたは2つのOsがある行または列がある場合は、空の位置を取る。 OBJ { KEY1: "X"、 KEY2: ""、 KEY3: "X"、 }オブジェクト内の特定のキー/値を効率的にソート型関数を使用して更新する方法

私が持っているので、キーと値のペアの行または列与えられ、値があるかもしれないと言うことができしばらくの間これを行う方法に取り組んできましたし、一連のループ以外でこれを行う方法があるのならば、興味があります。私の最初の試みはアルファベット順にアイテムをソートしようとしていましたので、空白の値を切り分けることができました:var = "" "X" "X"

この場合、簡単に最初のアイテムを呼び出して更新できます私はそれを元の位置に戻すことはできません。しかし、無駄なコードがたくさん作成されないように、これをどうやって行うのか分かりません。おそらく複数のループに分割する方が良いでしょうか? 1つの空白のスポットを持つ行と列を(それらのうちの8つが)分離する1つ?

私が持っていたもう一つのアイデアは、グリッドの各値に1の値を与え、グリッドを調べ、行が3の場合(varを作成して.eval()メソッドを使用)それぞれの項目を1にして空白の点を1に更新し、すでに1である他の2つの点を更新します。

私は可能な限り具体的にしようとしましたが、私は認めます。

$(document).ready(function(){  
var playerTurn = true; 
var buttonStatus = "allowclick"; // Change to inactive once game starts 
var player = ""; 
var machine = ""; 
var test = ""; 
var emptyObj = {1: "", 2: "", 3: "", 
       4: "", 5: "", 6: "", 
       7: "", 8: "", 9: ""}; 
var gridObj = {1: "", 2: "", 3: "", 
       4: "", 5: "", 6: "", 
       7: "", 8: "", 9: ""}; 
var winningObj = [[1,2,3], [4,5,6], [7,8,9], [1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]; 




// Check if player is holding a corner 
function machineFunction() { 
    // Loop through winningObj and check if there are rows/columns with 2/3 taken 
    // for(i = 0; i < winningObj.length; i++) { 
     var i = 3; 
     var alpha = winningObj[i][0]; 
     var bravo = winningObj[i][1]; 
     var charlie = winningObj[i][2]; 
     console.log(alpha); 
     console.log(bravo); 
     console.log(charlie); 
     // After defining alpha/bravo/charlie, fire the fxn 
     testFxn(alpha, bravo, charlie); 
     // This is my function to sort the 3 different spots within the grid 
     function testFxn(a,b,c) { 
      // Test would be equal to ["", "X", "X"] or something similar 
      var test = [gridObj[a], gridObj[b], gridObj[c]].sort(); 
      console.log(test); 
      console.log(gridObj); 
      // If 2/3 spots taken by either X or O, take this spot 
      if (test[0] === "" && test[1] === "X" && test[2] === "X") { 
       console.log("#" + alpha + "") 
       $('#' + alpha + '').html(machine); 
       gridObj[alpha] = machine; 
       console.log(gridObj); 
       $(this).html(machine); // Sends player over to html 
       gridObj[this.id] = machine; // Update gridObj object 
       playerTurn = true; 
      } 
      if (test[0] === "" && test[1] === "O" && test[2] === "O") { 
       // How do I get the ID I need?? 
       $('#' + test[0] + '').html(machine); 
       playerTurn = true; 
      } 
     }; 
+0

これはフィドルのリンクですが、私は以前のものは動作しないと思います。 (https://jsfiddle.net/1hup5195/#&togetherjs=i67M4LaRnw) –

答えて

0

あなたがこの(反復するためにいくつかを使用して...)のようなSTHを行うことができます。 https://jsfiddle.net/1hup5195/

をここに参照のための私のスクリプトの一部である:ここで

は私が作ったJSのフィドルがあります

var rows = [[1,2,3], [4,5,6], [7,8,9], [1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]; 
var gridObj = {1: "", 2: "", 3: "", 
      4: "", 5: "", 6: "", 
      7: "", 8: "", 9: ""}; 

rows.some(function(row){//iterate over all rows 
    var values=row.map(key=>gridObj[key]);//get the rows values 
    if(values.filter(el=>el==="X").length===2){//check if there are two Xses 
     gridObj[rows[values.indexOf("")]]="O";//get the field id and add O to the blank field 
     return true;//stop iterating the rows 
    } 
}); 

http://jsbin.com/miriwuhuce/edit?console

0

私はコメントしたいと思いますが、できません。だから答えとして私のコメントです...

各 "フィールド"のオブジェクトを作成する場合は、別の配列で参照することができます。したがって、array.copyを実行してその配列をソートし、オブジェクト内の値を変更することができます。

これは、同じオブジェクトを保持する他の配列の値も設定します。

幸運を祈る!

0

JavaScriptはmapという大きな機能を持ち、配列に使用できます。 Here is documentation

マップは、配列内の各要素に対して何らかの定義された機能を実行し(おそらく現在の状態から優勝状態をチェックする)、変更された値または変更されていない値を持つ新しい配列を返すコールバックを提供します。たとえば、あなたが今のような状態に勝つの配列を持っている、と

var winner = winningObj.map((item) => { //()=>{} is ES6 syntax. Same as function(){} 
    var token = {} 
    if currentState[item[0]] != empty 
     token.1st = X 

    if currentState[item[1]] != empty 
     token.2nd = X 
    if currentState[item[2]] != empty 
     token.3rd = X 

    if all tokens are X 
     return X  // winner! 
    else if all tokens are O 
     return O  // check the other winning conditions, or keep playing 
    else 
     return false 
); 

if winner.containsValue(X) 
    X wins 
else if winner.containsValue(O) 
    O wins 
else 
    keep playing 

を行うことができ、私はこれは本当に優れた効率の面であなたの質問に答えていませんが、この方法は、あなたが書くことを避けることができます知っていますループを外してmap()をあなたのためにすべてやります。

関連する問題