2012-02-02 74 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; 
})()