2012-02-02 45 views
0

我在javascript寫一個四維4-IN-A-行遊戲的遊戲所有獲獎行的列表。你可以看到它here。我想執行檢查勝利。我怎樣才能構建四維4-IN-A-排

爲了節省時間,我打算建立事前所有更多鈔票制勝模式列表,這對於一個贏得遍歷這個列表的瑣碎工作檢查。

我遇到的麻煩是如何構建這個列表。獲勝線的組包括:

[[0, x, y, z], [1, x, y, z], [2, x, y, z], [3, x, y, z]]對於所有的x,y和z
[[w, 0, y, z], [w, 1, y, z], [w, 2, y, z], [w, 3, y, z]]所有W,Y和Z
[[w, x, 0, z], [w, x, 1, z], [w, x, 2, z], [w, x, 3, z]]所有W,X和Z
[[w, x, y, 0], [w, x, y, 1], [w, x, y, 2], [w, x, y, 3]]所有W,X和Y

然後

[[0, 0, y, z], [1, 1, y, z], [2, 2, y, z], [3, 3, y, z]]所有y和z
[[0, 3, y, z], [1, 2, y, z], [2, 1, y, z], [3, 0, y, z]]所有y和z

正如你所猜測的,這個列表會繼續。本質上,規則是一組座標(例如,在x座標)的集合必須是序列[1,2,3,4],而其他爲任一序列[1, 2, 3, 4][4, 3, 2, 1],或者[n, n, n, n]

如何赫克我可以構建這個名單? ....

+0

備註:如果你有一個算法來構造這個列表,那麼相同的算法是否可用來直接檢查獲勝條件? :) – Yoshi 2012-02-02 11:04:30

+0

@Yoshi:是的,但運行一次算法會更快,然後使用緩存結果。 – Eric 2012-02-02 11:29:32

+0

如果目的是檢查遊戲是否結束?我不確定這是最好的方法 – 2012-02-02 12:19:58

回答

0

解決了!

var winningLines = (function() { 
    var validCoordSets = (function() { 
     var a = []; 

     //Build sequences, such as [1, 2, 3, 4] and [4, 3, 2, 1] 
     var sequence = []; 
     for(var i = 0; i < size; i++) { 
      sequence.push(i); 
     } 
     a.push(sequence); 
     a.push(sequence.slice().reverse()); 

     //Build constants, such as [1, 1, 1, 1], [2, 2, 2, 2] 
     for(var i = 0; i < size; i++) { 
      var straight = []; 
      for(var j = 0; j < size; j++) { 
       straight.push(i); 
      } 
      a.push(straight); 
     } 
     return a; 
    })(); 

    var n = validCoordSets.length; 

    var a = []; 

    var w = validCoordSets[0]; 
    for(var i = 0; i < n; i++) 
    for(var j = 0; j < n; j++) 
    for(var k = 0; k < n; k++) { 
     var x = validCoordSets[i]; 
     var y = validCoordSets[j]; 
     var z = validCoordSets[k]; 

     line = []; 
     for(var l = 0; l < size; l++) { 
      line.push([w[l], x[l], y[l], z[l]]); 
     } 
     a.push(line); 
    } 

    var x = validCoordSets[0]; 
    for(var i = 1; i < n; i++) 
    for(var j = 0; j < n; j++) 
    for(var k = 0; k < n; k++) { 
     var w = validCoordSets[i]; 
     var y = validCoordSets[j]; 
     var z = validCoordSets[k]; 

     line = []; 
     for(var l = 0; l < size; l++) { 
      line.push([w[l], x[l], y[l], z[l]]); 
     } 
     a.push(line); 
    } 

    var y = validCoordSets[0]; 
    for(var i = 1; i < n; i++) 
    for(var j = 1; j < n; j++) 
    for(var k = 0; k < n; k++) { 
     var w = validCoordSets[i]; 
     var x = validCoordSets[j]; 
     var z = validCoordSets[k]; 

     line = []; 
     for(var l = 0; l < size; l++) { 
      line.push([w[l], x[l], y[l], z[l]]); 
     } 
     a.push(line); 
    } 

    var z = validCoordSets[0]; 
    for(var i = 1; i < validCoordSets.length; i++) 
    for(var j = 1; j < validCoordSets.length; j++) 
    for(var k = 1; k < validCoordSets.length; k++) { 
     var w = validCoordSets[i]; 
     var x = validCoordSets[j]; 
     var y = validCoordSets[k]; 

     line = []; 
     for(var l = 0; l < size; l++) { 
      line.push([w[l], x[l], y[l], z[l]]); 
     } 
     a.push(line); 
    } 

    return a; 
})()