我正在编写一个正在运行的Tic Tac Toe程序,并且我已经完成了很多工作。 除非我的获胜条件太长且丑陋。 看起来像这样。

function checkWin(){
  if(board[0].textContent === "X" &&
    board[1].textContent === "X" &&
    board[2].textContent === "X"
  ) { alert("Win")}
  else if (
    board[3].textContent === "X" &&
    board[4].textContent === "X" &&
    board[5].textContent === "X"
  ) { alert("Win")}
   else if (
    board[6].textContent === "X" &&
    board[7].textContent === "X" &&
    board[8].textContent === "X"
  ) { alert("Win")}

}

我只写一些获胜条件,因为如果我写完整的东西,那会更长。 我想知道如何编写较短的版本。 我当时想做一个数组并遍历整个数组,但是我不知道怎么做。 将会是这样。

var winConditions = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8 ],[0,4,8],[6,4,2]

但是如何使用checkWin遍历winConditions并使它等于X和O?

#1楼 票数:0

做循环和求和。 当然,这可以优化:

var winConditions = [ /* what you defined */ ];

function winTest(board, side) {
  for(var i = 0; i < winConditions.length; i++) { 
    var sum = 0;
    var w = winConditions[i];

    for(var b = 0; b < w.length; b++) {
      if(board[w[b]].textcontent === side) {
        sum++
      }
    }

    if(sum === 3) {
      return true;
    }
  }
  return false;
}

// then, call it :
var result = winTest(board, 'X');

#2楼 票数:0

使用ES6

 function checkWin(player){ // player = 'X' or 'O' const horizontal = [0,3,6].map(i=>{return[i,i+1,i+2]}); const vertical = [0,1,2].map(i=>{return[i,i+3,i+6]}); const diagonal = [[0,4,8],[2,4,6]]; var allwins = [].concat(horizontal).concat(vertical).concat(diagonal); let res = allwins.some(indices => { return board[indices[0]] == player && board[indices[1]] == player && board[indices[2]] == player}) return res; } // OOO // XXO // XXO var board=["X","X","O","X","X","O","O","O","O"]; console.log(checkWin("X"),"Expect: false"); // false console.log(checkWin("O"),"Expect: true"); // true // negative test case var board = []; console.log(checkWin("X"),"Expect: false"); // false // wierd case of only 1 player // XXX var board = ["X","X","X"] console.log(checkWin("X"),"Expect: true"); //true 

#3楼 票数:0

在惰性版本中,您可以将它们连接为一个字符串,并使用RegExp对其进行测试:

function checkWin()
{
    var str = ""
    for (var i = 0; i < 9; i++)
        str += board[i].textContent

    if (/(X...?)\1X|^(...)*XXX|^..X.X.X/.test(str))
        alert("Win")
}

  ask by KDO translate from so

未解决问题?本站智能推荐:

2回复

使用嵌套for循环重构函数-Javascript

我需要在我创建的函数中删除嵌套的 for 循环。 我的函数接收一个关联数组,我根据某些属性返回一个新数组,以便对消息进行分组以供以后使用。 比如我有两个学校,很多学生。 所以我根据性别和年级对它们进行分组。 我不知道如何重构这个函数,因为我对算法不太了解。 我的逻辑是否需要完全擦除或需要再次完成都没
3回复

无限循环和阵列旋转[重复]

这个问题已经在这里有了答案: Python 6中的 循环列表迭代器 所以我有这个清单, 列表: [0,0,1,0,1]; 我需要使用for的算法来显示所有列表( list[i] )。 当我处于第一个数组位置时,可以执行list[i-2] and list[i-1]
3回复

如何为此做好循环?

我有这个数组: 我需要爆炸所有13个值的数组,并得到这个: 所以,这是我的代码: 问题是我没有按行获得我的13个值的好行:( 能帮我吗?
1回复

Javascript-如果条件循环指向数组,则在其中跳过循环代码

在示例1中,运行该结果将导致执行第4行,然后直接跳过第5行。在示例2中,将第4行更改为引用实际值而不是引用数组将允许执行第5行。 如何使示例1正常工作? 为什么示例2起作用而不是示例1? 我在另一个实例中使用了相同的for循环,但使用了另一个数组,效果很好。 因此,问题可能出在数组本
2回复

将单个for循环转换为嵌套循环

我试图将单个 for 循环分成多个循环。 我能够将单个循环变成两个循环,如下所示: console.config({ maxEntries: Infinity }); // looping 0-100 let q = 100; for (let i of [...Array(q % 10 =
1回复

Javascript-这个函数和循环有什么问题?

几天前我开始学习编码,我的第一个程序几乎完成了。 但是,我现在最后遇到了一个问题,我似乎无法弄清楚自己出了什么问题。 该程序应该帮助我按工作日和一天中的时间对一堆日期进行排序。 日期写为“YYMMDD-”,然后是一天中的时间(仅小时),例如“170109-06”。 我有我想在数组 ( time )
6回复

循环检查条件的Javascript

我想创建一个函数,该函数将生成一个不在数组中的0到9之间的随机数。 到目前为止,我的代码: 我只想返回一个数字。 我该怎么做呢? 谢谢。
1回复

Javascript-使用for循环将字符从字符串推到数组

在您查看我的问题之前,请注意,我是一个新手,我目前正在学习Codecademy的javascript课程,但是我对这一点非常执着,这在某些人看来可能很愚蠢。 只是想让我了解如何使用for循环进行链接。 尝试将我的名字中的所有字符从字符串中推送到数组“ hits”。 我真的很感谢一些指导