我一直在练习 javascript,并制作了一个数独游戏。我在数组中 push() 一些数字。
var sudukoNmb = [1,2,3,3,2,1,2,1,3]
我有这种按行和按列读取数字的条件,但我认为这不是正确的方法。
if(sudukoNmb[0] === sudukoNmb[1] || sudukoNmb[0] === sudukoNmb[2] || sudukoNmb[1] === sudukoNmb[2] ||
sudukoNmb[0] === sudukoNmb[3] || sudukoNmb[0] === sudukoNmb[6] || sudukoNmb[3] === sudukoNmb[6] ||
sudukoNmb[1] === sudukoNmb[4] || sudukoNmb[1] === sudukoNmb[7] || sudukoNmb[4] === sudukoNmb[7] ||
sudukoNmb[3] === sudukoNmb[4] || sudukoNmb[3] === sudukoNmb[5] || sudukoNmb[4] === sudukoNmb[5] ||
sudukoNmb[6] === sudukoNmb[7] || sudukoNmb[6] === sudukoNmb[8] || sudukoNmb[7] === sudukoNmb[8] ||
sudukoNmb[2] === sudukoNmb[5] || sudukoNmb[2] === sudukoNmb[8] || sudukoNmb[5] === sudukoNmb[8]) {
console.log('error')
} else {
console.log('correct')
}
有没有其他方法可以最大限度地减少这种情况?
注意:这些数字实际上来自映射到一维数组的二维数组 (3x3) 的行和列索引。 (sudukoNmb[3] 用于第二行的第一个单元格,依此类推...)
最佳答案
相对难以理解您的条件背后的逻辑,但我发现它正在比较存储在一维数组(总共 9 个元素)中的二维数组 (3x3) 的行和列。
因此数组包含以下元素:
0 1 2
3 4 5
6 7 8
而且我们必须检查每一行或每一列,以确保它们在每条水平或垂直线上的值都不相同。例如:
- 第一行是:0,1,2 => 我们将检查:0,1/0,2/1,2
- 第二行是:3,4,5 => 我们要检查:3,4/3,5/4,5
- 第三行是:6,7,8 => 我们要检查:6,7/6,8/7,8
所以行的公式是:check i,(i+1)/i,(i+2)/(i+1),(i+2)
和
- 第一列是:0, 3, 6 => 我们将检查:0,3/0,6/3,6
- 第二列是:1, 4, 7 => 我们将检查:1,4/1,7/4,7
- 第三列是:2, 5, 8 => 我们将检查:2,5/2,8/5,8
所以行的公式是:check i,(i+3)/i,(i+2*3)/(i+3),(i+2*3)
我们可以将两个公式合并为一个更通用的公式:
check i,(i+n) / i,(i+2*n) / (i+n),(i+2*n)
其中行的 n 为 1,列的 n 为 3。
下面的代码可以检查每一列或每一行的值:
var sudukoNmb = [1,2,3, 4,5,6, 7,5,9];
function checkLine(a, i, n) //a:array, i: first cell index, n: offset to get next cell in row or column
{
return (a[i]===a[i+n] || a[i]===a[i+2*n] || a[i+n]===a[i+2*n]);
}
var msg = "OK";
for(var j=0; j<2; j++)
{
//if (checkLine(sudukoNmb, j, 3)) {msg="Error"; break;} //to check columns
//if (checkLine(sudukoNmb, j*3, 1)) {msg="Error"; break;} //to check rows
if (checkLine(sudukoNmb, j, 3) || checkLine(sudukoNmb, j*3, 1))
{msg = "Error"; break;}
}
console.log("Check result is: " + msg);
关于javascript - 如果条件检查数独游戏的行和列,是否有任何其他方法可以最小化我的 Javascript long ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48615951/