一个简单易懂的解决方案,没有过多的循环(仅提供伪代码,如果您需要更多解释,请告诉我):
我假设你的二维数组是这样运行的:
board = [
[...],
[...],
[...],
...
];
即内部数组代表棋盘的水平行。
我还假设数组由“b”、“w”和“x”填充,分别代表黑色块、白色块和空方格。
我的解决方案有点分而治之,所以我将其分为以下 3 种情况。请耐心等待,一开始它可能看起来比简单地运行多个嵌套循环更复杂,但这个概念很容易理解、阅读,并且使用正确的方法,编码非常简单。
水平线
让我们首先考虑仅当线是水平线时才检测获胜情况的情况 - 这是最简单的。首先,使用board[0].join("") 之类的东西将一行连接成一个字符串。对每一行执行此操作。你最终得到一个这样的数组:
rows = [
"bxwwwbx...",
"xxxwbxx...",
"wwbbbbx...",
...
]
现在加入这个数组,但在元素之间插入一个“x”来分隔每一行:rows.join("x")。
现在您有一个代表您的棋盘的长字符串,只需应用一个正则表达式即可找到长度正好为 5 的连续“w”或“b”:superString.test(/(b{5,5})|(w{5,5})/)。如果测试返回true,你就有了胜利的局面。如果没有,让我们继续讨论垂直线。
垂直线
你想重用上面的代码,所以为它创建一个函数testRows。测试垂直线的过程完全相同,但您要转置板,使行变为列,列变为行。然后你应用相同的testRows 函数。转置可以通过将值复制到一个新的二维数组中来完成,或者通过编写一个简单的 getCol 函数并在 testRows 中使用它来完成。
对角线
再一次,我们想重用“testRows”函数。像这样的对角线:
b x x x x
x b x x x
x x b x x
x x x b x
x x x x b
可以转换成这样的垂直:
b x x x x
b x x x
b x x
b x
b
通过将行i 移动i 位置。现在这是一个移调的问题,我们又回到了水平测试。您需要对相反方向的对角线执行相同操作,但这次将行 i 移动 length - 1 - i 位置,或者在您的情况下,移动 18 - i 位置。
函数式javascript
附带说明一下,我的解决方案非常适合函数式编程,这意味着如果你有函数式编程工具,它可以很容易地编码,尽管这不是必需的。我建议使用underscore.js,因为在许多不同的游戏算法中,您很可能需要map、reduce 和filter 等基本工具。例如,我关于测试水平线的部分可以使用 map 用一行 javascript 编写:
_(board).map(function (row) {return row.join("")}).join("x").test(/(b{5,5})|(w{5,5})/);