javascript - Tic-Tac-Toe 游戏——Regex 想要比 3x3 棋盘中更多的字符吗?

标签 javascript arrays regex

我有下面的 3x3 井字游戏代码。它工作得很好,但有些事情我不明白。

函数的目标是返回:

  • -1 如果棋盘还没有完成(有空位),
  • 1 如果“X”赢了,
  • 2 如果“O”赢了,
  • 如果是猫的游戏(即平局)则为 0。

function isSolved(board) {
   board = board.join('-').replace(/,/g,'');
   if(/222|2...2...2|2....2....2|2..2..2/.test(board)) return 2;
   if(/111|1...1...1|1....1....1|1..1..1/.test(board)) return 1;
   if(/0/.test(board)) return -1;
   return 0;

}

var result = isSolved([[0, 0, 1],[0, 1, 2],[2, 1, 0]]); //board is 3 dimensional array.

console.log(result); // -1

我不理解 if 语句中正则表达式的一部分,即 1....1....1,因为最大输入板子可以带的是9;但是这里好像是 11。这是为什么?

代码绝对没问题,但我不明白发生了什么。你能解释一下吗?

最佳答案

正则表达式查看 11 个字符,因为 board 已加入两个额外的 - 字符:

board = board.join('-')

据推测,原始的 board 是一个二维数组,并且此连接引入的逗号(因为嵌套数组在此过程中被字符串化)被删除:

.replace(/,/g,'');

所以像这样的原始板:

[
    [1, 0, 1],
    [2, 2, 0],
    [0, 0, 0]
]

...用.join("-")变成字符串:

"1,0,1-2,2,0-0,0,0"

...最后清除了逗号:

"101-220-000".

额外的分隔符可以更轻松地找到一些模式而不会引发误报。例如,当与 222 匹配时,可以确定它们将在一行中,而与 1..1..1 的匹配也将同样检测三个可能的垂直 3 行,没有误报,因为它只能有从位置 0、1 或 2 开始的匹配项。1....1....1 的长度为 11 个字符,并且只能匹配对 Angular 线之一的位置 0。最后,1..1..1 也只能匹配一个位置,即位置 2,否则连字符之一会与模式中的 1 冲突。匹配代表相反的对 Angular 线。

进一步改进

可以通过使用反向引用将两个正则表达式合并为一个(节省一些执行时间),并使用一些逻辑将所有可能性连接到一个表达式中:

function isSolved(board) {
   board = board.join('-').replace(/,/g,'');
   var match = board.search(/([12])(\1|...\1...|....\1....|..\1..)\1/);
   return +(board[match] || board.includes("0") && -1);
}

关于javascript - Tic-Tac-Toe 游戏——Regex 想要比 3x3 棋盘中更多的字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55491708/

相关文章:

php - 在 Laravel 中检查请求数组是否为空

c - 使用 realloc 释放 2d 字符数组

div 标签的 JavaScript 正则表达式

javascript - 使用 javaScript 访问 Dynamics CRM/365 Forms 中的其他实体属性

javascript - jquery 动画的替代品?

javascript - 删除函数中的数据绑定(bind)

javascript - 如何将输入的文本分组到数组中并将每 20 个字符包装在一个 div 中

python - 在 python 中使用正则表达式断言

regex - 为什么人们使用正则表达式进行电子邮件和其他复杂的验证?

javascript - Drupal 6 - 将 Javascript 添加到 View