Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Tic-Tac-Toe游戏——Regex想要比3x3版更多的角色?_Javascript_Arrays_Regex - Fatal编程技术网

Javascript Tic-Tac-Toe游戏——Regex想要比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

我有下面一个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/.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非常感谢。你的解释让我很高兴。奥布里加多。