javascript - 如果条件检查数独游戏的行和列,是否有任何其他方法可以最小化我的 Javascript long ?

标签 javascript

我一直在练习 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/

相关文章:

javascript - 获取外部脚本的源代码?

javascript - 如何使用文本输入的 id 和值?

javascript - 使用 Promise 同步函数调用

javascript - 将 HTML 源代码转换为读取流

javascript - 将方法应用于变量

javascript - 早于 9 的 IE 版本引发错误 "Expected identifier, string or number”

javascript - 如何验证 cucumberjs/puppeteer 中不存在的选择器?

javascript - 具有独立回调的同时 API 调用

javascript - 为什么 ng-if 会弄乱我的 javascript 而 ng-show 不会?

javascript - 当浏览器关闭事件被调用时如何重定向到其他页面