Javascript Tic-Tac-Toe游戏——Regex想要比3x3版更多的角色?
我有下面一个3x3井字游戏的代码。它工作得很好,但有些事情我不明白 函数的目标是返回:Javascript Tic-Tac-Toe游戏——Regex想要比3x3版更多的角色?,javascript,arrays,regex,Javascript,Arrays,Regex,我有下面一个3x3井字游戏的代码。它工作得很好,但有些事情我不明白 函数的目标是返回: -1如果电路板尚未完成(存在空白点) 1如果“X”赢了 2如果“O”赢了 如果是猫的游戏(即平局),则为0 功能已解决(电路板){ 线路板=线路板。连接('-')。替换(/,/g'); 如果(/222 | 2…2…2 | 2…2…2 | 2…2…2/.test(board))返回2; 如果(/111 | 1…1…1 | 1…1…1 | 1..1..1/.test(board))返回1; if(/0/.t
- -1如果电路板尚未完成(存在空白点)
- 1如果“X”赢了
- 2如果“O”赢了
- 如果是猫的游戏(即平局),则为0
功能已解决(电路板){
线路板=线路板。连接('-')。替换(/,/g');
如果(/222 | 2…2…2 | 2…2…2 | 2…2…2/.test(board))返回2;
如果(/111 | 1…1…1 | 1…1…1 | 1..1..1/.test(board))返回1;
if(/0/.test(board))返回-1;
返回0;
}
var结果=已解决([[0,0,1],[0,1,2],[2,1,0]])//电路板是三维阵列。
console.log(结果);//-1
正则表达式将查看11个字符,因为板
已添加了两个额外的-
字符:
board = board.join('-')
据推测,原始的电路板是一个2D数组,此连接引入的逗号(因为嵌套数组在该过程中被字符串化)将通过以下方式删除:
.replace(/,/g,'');
所以像这样的原始板:
[
[1, 0, 1],
[2, 2, 0],
[0, 0, 0]
]
001-012-210
001-012-210
…被转换为带有的字符串。join(“-”)
:
…并最终清除了逗号:
"101-220-000".
附加的分隔符使查找某些模式更容易,而不会引起误报。例如,当存在与222
的匹配时,可以确保它们将在一行中,而与1..1..1
的匹配同样会检测到三个可能的垂直三行,而不会出现误报,因为它只能具有从位置0、1或2开始的匹配。1…1…1
长度为11个字符,并且只能在其中一条对角线的位置0处匹配。最后,1..1..1
也只能在一个位置匹配,即位置2,否则其中一个连字符将与模式中的1
冲突。匹配表示相反的对角线
进一步改进
可以使用back引用将两个正则表达式合并为一个(节省一些执行时间),并使用一些逻辑将所有可能的正则表达式连接到一个表达式中:
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);
}
在执行join
和replace
操作后,board
将是如下所示的字符串:
[
[1, 0, 1],
[2, 2, 0],
[0, 0, 0]
]
001-012-210
001-012-210
每行由-
分隔
111
案例正在测试一行X
1…1…1
案例正在测试一列X。有3个点,因为还有-
字符
1..1..1
案例正在测试是否有一个满是X的对角线。
匹配任何字符,以便
222
匹配
-------------
| 2 | 2 | 2 |
-------------
| | | |
-------------
| | | |
-------------
OR
-------------
| | | |
-------------
| 2 | 2 | 2 |
-------------
| | | |
-------------
OR
-------------
| | | |
-------------
| | | |
-------------
| 2 | 2 | 2 |
-------------
-------------
| 2 | . | . | .
-------------
| 2 | . | . | .
-------------
| 2 | | |
-------------
OR
-------------
| | 2 | . | .
-------------
| . | 2 | . | .
-------------
| . | 2 | |
-------------
OR
-------------
| | | 2 | .
-------------
| . | . | 2 | .
-------------
| . | . | 2 |
-------------
和2…2…2
匹配
-------------
| 2 | 2 | 2 |
-------------
| | | |
-------------
| | | |
-------------
OR
-------------
| | | |
-------------
| 2 | 2 | 2 |
-------------
| | | |
-------------
OR
-------------
| | | |
-------------
| | | |
-------------
| 2 | 2 | 2 |
-------------
-------------
| 2 | . | . | .
-------------
| 2 | . | . | .
-------------
| 2 | | |
-------------
OR
-------------
| | 2 | . | .
-------------
| . | 2 | . | .
-------------
| . | 2 | |
-------------
OR
-------------
| | | 2 | .
-------------
| . | . | 2 | .
-------------
| . | . | 2 |
-------------
板外的
与分离器-
匹配
在正则表达式中,可选模式由
分隔,并且
与任何一个字符完全匹配
中的板已转换为字符串,如下所示:
[
[1, 0, 1],
[2, 2, 0],
[0, 0, 0]
]
001-012-210
001-012-210
这意味着玩家1
获胜,当
- 它们填充了一行,这意味着字符串包含子字符串
111
- 它们填充了一列,这意味着字符串是
1xx-1xx-1xx
,x1x-x1x-x1x
或xx1-xx1-xx1
。在这些情况下,每个1
之间正好有三个字符,这与正则表达式中的1…1…1
匹配
- 它们填充了一个对角线,这意味着字符串是
xx1-x1x-1x
或1xx-x1x-xx1
。在这些情况下,每个1
之间正好有两个或四个字符,由1..1..1
或1..1..1
匹配
什么是.test(board)
?@SaadAnees此:。语法是regexObj.test(str)
@trincol非常感谢。你的解释让我很高兴。奥布里加多。