首页 > 解决方案 > 如何使用 3 个子数组在 Javascript 中检测井字游戏获胜者?

问题描述

我是一个初学者,我想做一个井字游戏。我想创建一个函数来查找游戏的获胜者,如果 x 获胜则返回“x”,如果获胜则返回“o”,如果没有人获胜则返回“平局”,如果有两个获胜者则返回“错误”。

function winner(x){
  //x is an array that includes 3 child arrays, every child represents a row of tic tac toe matrix
  // example x =[["x","o","x"],["o","x","o"],["o","o","x"]]
  // It should return "x" because "x" player is the winner
}

我尝试了很多方法,但我仍然无法做到。你能帮助我吗?

标签: javascriptarraystic-tac-toe

解决方案


我假设除了“x”或“o”之外,这些值也可以是“”(以防游戏提前结束)。另外,如果没有获胜者并且游戏仍然有一些空值,那么我认为最好返回“不完整”。

function winner(x) {
  console.log(`${x[0].join(' ')}\n${x[1].join(' ')}\n${x[2].join(' ')}`);

  winners = new Set();

  // columns check
  for (let i = 0; i < 3; i++) {
    if (x[0][i] !== "" && (new Set([x[0][i], x[1][i], x[2][i]])).size === 1) {
      winners.add(x[0][i]);
    }
  }

  // rows check
  for (let i = 0; i < 3; i++) {
    if (x[i][0] !== "" && (new Set(x[i])).size === 1) {
      winners.add(x[i][0]);
    }
  }

  // diagonals check
  if (x[1][1] !== "" && ((new Set([x[0][0], x[1][1], x[2][2]])).size === 1 || (new Set([x[0][2], x[1][1], x[2][0]])).size === 1)) {
    winners.add(x[1][1]);
  }

  if (winners.size === 2) {
    return "error";
  }

  if (winners.size === 0) {
    // completion check
    if (x.every(y => y.every(z => z))){
      return "draw";
    }

    return "incomplete";
  }

  return winners.values().next().value;
}

解释

您会在代码中看到许多创建和操作的 Set 对象。在 Javascript 中设置是确保没有重复项的简单方法。它们还用于代码中以检查传递给它的所有内容是否相同。

最后,获取 Set 中的值是在最后一行完成的。


推荐阅读