在一行获胜逻辑(Javascript)中重构5

Refactor 5 in a Row Win Logic (Javascript)

本文关键字:Javascript 重构 获胜 一行      更新时间:2023-09-26

我很难把我的获胜逻辑转换成更简洁的东西。我已经尝试过使用for循环来迭代板。我的板是使用uls和lis构建的9x9:

   <ul>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
    <li class="board open"></li>
  </ul> 

还有一个由uls和lis组成的不可见网格,这是玩家移动的显示方式。li的背景图像变为该玩家的石头:

  <ul>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
    <li class="grid open"></li>
  </ul>

我的获胜逻辑检查行,列和对角线的5在一行中,但我只是找到了每一个可能的获胜情况,并手动写入。下面是行获胜函数的一个示例:

    return  checkSquares([squares[0],squares[1],squares[2],squares[3],squares[4]]) ||
      checkSquares([squares[1],squares[2],squares[3],squares[4],squares[5]]) ||
      checkSquares([squares[2],squares[3],squares[4],squares[5],squares[6]]) ||
      checkSquares([squares[3],squares[4],squares[5],squares[6],squares[7]]) ||
      checkSquares([squares[4],squares[5],squares[6],squares[7],squares[8]]) ||
      checkSquares([squares[9],squares[10],squares[11],squares[12],squares[13]]) ||
      checkSquares([squares[10],squares[11],squares[12],squares[13],squares[14]]) ||
      checkSquares([squares[11],squares[12],squares[13],squares[14],squares[15]]) ||
      checkSquares([squares[12],squares[13],squares[14],squares[15],squares[16]]) ||
      checkSquares([squares[13],squares[14],squares[15],squares[16],squares[17]]) ||
      checkSquares([squares[18],squares[19],squares[20],squares[14],squares[22]]) ||
      checkSquares([squares[19],squares[20],squares[21],squares[22],squares[23]]) ||
      checkSquares([squares[21],squares[22],squares[23],squares[24],squares[25]]) ||
      checkSquares([squares[22],squares[23],squares[24],squares[25],squares[26]]) ||
      checkSquares([squares[27],squares[28],squares[29],squares[30],squares[31]]) ||
      checkSquares([squares[28],squares[29],squares[30],squares[31],squares[32]]) ||
      checkSquares([squares[29],squares[30],squares[31],squares[32],squares[33]]) ||
      checkSquares([squares[30],squares[31],squares[32],squares[33],squares[34]]) ||
      checkSquares([squares[31],squares[32],squares[33],squares[34],squares[35]]) ||
      checkSquares([squares[36],squares[37],squares[38],squares[39],squares[40]]) ||
      checkSquares([squares[37],squares[38],squares[39],squares[40],squares[41]]) ||
      checkSquares([squares[38],squares[39],squares[40],squares[41],squares[42]]) ||
      checkSquares([squares[39],squares[40],squares[41],squares[42],squares[43]]) ||
      checkSquares([squares[40],squares[41],squares[42],squares[43],squares[44]]) ||
      checkSquares([squares[45],squares[46],squares[47],squares[48],squares[49]]) ||
      checkSquares([squares[46],squares[47],squares[48],squares[49],squares[50]]) ||
      checkSquares([squares[47],squares[48],squares[49],squares[50],squares[51]]) ||
      checkSquares([squares[48],squares[49],squares[50],squares[51],squares[52]]) ||
      checkSquares([squares[49],squares[50],squares[51],squares[52],squares[53]]) ||
      checkSquares([squares[54],squares[55],squares[56],squares[57],squares[58]]) ||
      checkSquares([squares[55],squares[56],squares[57],squares[58],squares[59]]) ||
      checkSquares([squares[56],squares[57],squares[58],squares[59],squares[60]]) ||
      checkSquares([squares[57],squares[58],squares[59],squares[60],squares[61]]) ||
      checkSquares([squares[58],squares[59],squares[60],squares[61],squares[62]]) ||
      checkSquares([squares[63],squares[64],squares[65],squares[66],squares[67]]) ||
      checkSquares([squares[64],squares[65],squares[66],squares[67],squares[68]]) ||
      checkSquares([squares[65],squares[66],squares[67],squares[68],squares[69]]) ||
      checkSquares([squares[66],squares[67],squares[68],squares[69],squares[70]]) ||
      checkSquares([squares[67],squares[68],squares[69],squares[70],squares[71]]) ||
      checkSquares([squares[72],squares[73],squares[74],squares[75],squares[76]]) ||
      checkSquares([squares[73],squares[74],squares[75],squares[76],squares[77]]) ||
      checkSquares([squares[74],squares[75],squares[76],squares[77],squares[78]]) ||
      checkSquares([squares[75],squares[76],squares[77],squares[78],squares[79]]) ||
      checkSquares([squares[76],squares[77],squares[78],squares[79],squares[80]]);

如你所见,它长得出奇。我试过做一个嵌套的for循环,每次应该比较5个正方形,但我得到一个无限循环:

    for(var a = 0; a < squares.length; a++){
     for(var b = 1; b < squares.length; b++){
       for(var c = 2; c < squares.length; c++){
        for(var d = 3; d < squares.length; d++){
          for(var e= 4; e < squares.length; e++){
            if((a + b + c+ d+ e) % 5 == 0){ 
           return checkSquares([squares[a],squares[b],squares[c],squares[d],squares[e]]);
          }
         } 
        }
       }
      }
     }  

我可能试图用一种非常复杂的方式来实现这个重构。所以,我很感谢任何建议。谢谢! !

你不需要检查每个正方形与其他正方形;81 * 80 * 78 * 77 * 76支票(3074591520)太大了。即使没有复杂的算法,只要减少问题空间,你也可以走得很远:

  1. Check rows (9 * (9 - 4) = 45 checks)
  2. 检查列(相同,45个检查)
  3. 检查/对角线的胜利(懒得做数学,但相同的数量级)
  4. 检查'对角线

所以不需要太多的工作,你可以将其更改为100次检查,这将更快,并且你的循环将只是循环遍历行,列和对角索引:

// Rows
for (var row = 0; row < 9; row++) {
  for (var col = 0; col < 5; col++) {
    var i = row * 9 + col;
    checkSquares([
      squares[i  ], 
      squares[i+1],
      squares[i+2],
      squares[i+3],
      squares[i+4]
    ]);
  }
}
// Cols
for (var col = 0; col < 9; col++) {
  for (var row = 0; row < 5; row++) {
    checkSquares([
      squares[(row    ) * 9 + col], 
      squares[(row + 1) * 9 + col],
      squares[(row + 2) * 9 + col],
      squares[(row + 3) * 9 + col],
      squares[(row + 4) * 9 + col]
    ]);
  }
}
// etc