gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:59:16 25 4
gpt4 key购买 nike

我有下面的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com