javascript - 如何使用 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
}
我尝试了很多方法,但我仍然无法做到。你能帮助我吗?
解决方案
我假设除了“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 中的值是在最后一行完成的。
推荐阅读
- ios - ScrollView 内的 UITableView 无限滚动
- gpu - 基本 GPU 架构
- c++ - 从向量和成对向量中擦除元素的区别
- list - Haskell Monad - 列表中的 Monad 是如何工作的?
- oracle - 如何在没有 dbms_output 和 utl_file 的情况下“打印”变量 - Oracle
- vim - 有没有实现拆分长双引号句子的方法或插件?
- python-3.x - 如何通过定义函数来显示乘法表
- javafx - Javafx - 伪类中的伪类
- python - rasa_core 包中的 tensorflow 安装错误
- c# - 扩展方法中的“where T:class”VS常规类