- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在寻找可能有效的算法来检测在 19x19 棋盘上玩的五子棋(五连胜)游戏中的“获胜”情况。当其中一名玩家设法连续获得五颗且不超过五颗“石头”(水平、对 Angular 或垂直)时,就会发生获胜情况。
我可以轻松访问以下数据:
我是用 javascript 做的,但任何不使用低级内容(如内存分配)或高级(python)数组操作的解决方案都是好的。
我发现了类似的问题(Detect winning game in nought and crosses),但那里给出的解决方案仅适用于小板(5x5 等)。
最佳答案
没有过多循环的简单易懂的解决方案(仅提供伪代码,如果您需要更多解释,请告诉我):
我假设你的二维数组是这样运行的:
board = [
[...],
[...],
[...],
...
];
即内部数组代表棋盘的水平行。
我还假设数组由“b”、“w”和“x”填充,分别代表黑色 block 、白色 block 和空方 block 。
我的解决方案有点分而治之,所以我将其分为以下 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' 函数。像这样的对 Angular 线:
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
位置。现在是移调的问题,我们又回到了水平测试。您需要对相反方向的对 Angular 线执行相同的操作,但这次将行 i
移动 length - 1 - i
位置,或者在您的情况下,18 - i
个位置。
附带说明一下,我的解决方案非常适合函数式编程,这意味着如果您有函数式编程工具,可以很容易地对其进行编码,尽管这不是必需的。我建议使用 underscore.js因为在许多不同的游戏算法中,您很可能需要基本工具,例如 map
、reduce
和 filter
。例如,我关于测试水平线的部分可以使用 map
用一行 javascript 编写:
_(board).map(function (row) {return row.join("")}).join("x").test(/(b{5,5})|(w{5,5})/);
关于javascript - 棋盘游戏获胜情况 - 搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4312391/
我有一个棋盘格,并将其连接到 JPanel: import javax.swing.*; import java.awt.Graphics; import java.awt.Color; public
我看不出有什么问题,我正在尝试将 gameBoard 数组(这不是数组吗?- 请参阅构造函数)传递到 findPiece 方法中,但它说了不是一个数组,我应该在这里传递什么来获得未更新的板?抱歉,我是
所以我想检查输入的位置在棋盘中是否有效, //returns true if the position is in the range of A1-H8 private boolean isValid
将单一职责原则应用于棋盘应用程序,Piece 接口(interface)/类应该负责什么? 我确信它需要知道它的颜色、类型和有效 Action 。但是它是否也应该知道它在棋盘中的位置(x/y)?或者,
我需要使用 J 打印棋盘,给定奇数的函数需要创建一个 NxN 矩阵并在每个其他框中放置一个“X”。我已经制作了矩阵,但我无法弄清楚其他盒子部分。 到目前为止我所拥有的 N =: 3 checker =
我目前有一个一维棋盘坐标数组(例如 ["B1","D1","F1","H1","E8"] 用于棋盘游戏。我已将数组“位置”初始化为是上面的值,但这可以是游戏任何时候的任何值。该数组的长度根据用户给定的
我想使用canvas和通过覆盖方法onDraw在android studio中动态绘制一个8×8的棋盘,我几乎已经成功了,但我遇到了一个非常烦人的问题。 我已经制作了一个自定义 View ,我的目标是
所以我开始了一个 TicTacToe 项目,而且我是一个初学者,所以我不知道如何做很多事情。这是半个小时编码的结果。 我似乎在调试 Player2 不轮流的原因时遇到问题。 所以它要求添加更多细节,然
我正在制作棋盘游戏,但无法 move 它们。棋子会根据骰子的结果 move 。下面是我尝试做的,但它不起作用。(来自 button[].addActionListener(new ActionList
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
谁能告诉我如何使用 JavaScript、表格标签或 生成棋盘 (8x8)? 到目前为止,我得到了以下内容: div { border:1px solid black; width:20px;
大家好,我最近开始做一个国际象棋应用程序,除了 GUI 之外,我已经设置好了所有的东西。出于某种原因,我无法让电路板显示瓷砖,我也不知道为什么。 (推测)我认为我的问题与我对 DOM 的使用有关。对我
我试图创建一个带有表格的棋盘 (HTML/CSS)。我在表格边框方面遇到了麻烦。我只希望电路板有边框,排除行号和列字母。 我该怎么做? table { border-bottom: solid 2
我是 java 和 android 的新手,但我正在寻找一个可以走上正轨的好教程。我想编写一个函数,用于在我的应用程序当前 View 的背景中绘制/重绘白底黑棋盘图案。我不想使用实际图像,因为我希望能
我正在尝试使用 GUI 的 NetBeans IDE 在 Java 中制作国际象棋游戏,但我无法使棋子停留在棋盘上方,当我尝试时,棋盘就会被推开。我对这两个图像都使用了标签。如何让棋子停留在棋盘上方而
我试图为 Tic Tac Toe 游戏编写代码。我编写了以下代码来显示游戏板,但出现了问题,并且没有显示所需的输出。你能帮我找出错误在哪里吗? 这里: 0代表空白, 1代表X和 2代表O。 publi
我的任务是通过 paintComponent 方法创建一个 10x10 可调整大小的棋盘。 我的问题是第一行正确,但下一行不显示,我根本不知道我的错误在哪里 GrafikPanel 类: import
我在这里尝试使用 javascript 棋盘:http://chessboardjs.com/ .不幸的是,我不知道 javascript 或 CSS,并且对 HTML 很生疏,所以我不理解文档,即使
我正在尝试在棋盘(见附图)和基于 cordova 的 Android 国际象棋游戏(lichess)之间传输数据。两个设备都将通过 USB 数据线连接。 android 的 cordova 应用程序是
我使用以下 CSS 代码创建了一个棋盘图案: .testcheckerboard{ width: 200px; height: 100px; background-color: white
我是一名优秀的程序员,十分优秀!