-1

我正在制作一款基于亚洲棋盘游戏“围棋”的游戏。我目前正在尝试实现捕获系统。基本上,一旦所有的自由都被敌人包围了,石头就会被拿走。在屏幕截图中,黑色的石头应该被移除。http://imgur.com/unHedko

在此处输入图像描述

同样,如果您将石头连接在一起,则自由组合在一起,例如,这就是您捕获两块石头的方式。http://imgur.com/pPBVRkC这里也是黑色被捕获的另一个例子。/lbg8BSC

在此处输入图像描述

我有一个 19x19 的 2D 数组,用于存储我所有的石头位置。黑色由 1 表示,而白色为 2。这是我从第一张图像中打印出来的数组。

0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000002000000000
0000000021200000000
0000000002000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000

如您所见,中间的黑色石头被白色石头包围。在这种情况下,很容易检查那块石头是否被包围,但是一旦你有多个石头,就像上面的其他两个屏幕截图一样,我不知道该怎么做。任何帮助是极大的赞赏。

4

2 回答 2

0

我认为你可以递归地做到这一点。

假设您遍历数组,然后得到一个 1。您检查 1 周围的所有内容,检查 (2),检查左侧 (2),检查 (1)。当你到达那个额外的 1 时,你调用了对该位置的检查。为简单起见,我将使用一个临时数组,将之前的 1 更改为 2。所以现在你检查上(2),左(2),下(2),右(2)等,如果两个1都对被包围感到满意,你把它们变成2。

如果您不了解递归,那么这个解释非常好:Understanding recursion

于 2013-06-06T18:50:38.050 回答
0

您可以做的一件事是检查所有相同颜色的自由件并跟踪已检查的件,如果您用完了要检查的件并且没有自由件,则该组件已被捕获。

所以本质上:

  1. 从一块开始 (x,y)
  2. 检查片的左侧(x-1,y)
    • 如果相同的颜色(并且尚未检查)检查该片的自由度(可以递归地执行此操作)
    • 如果空增加自由计数
    • 如果相反的颜色什么都不做
  3. 对下面的 (x,y+1)、right(x+1,y) 和 top(x,y-1) 件重复上述操作
  4. 一旦我们检查了所有部分,将其标记为“已检查”(可以是单独的布尔数组或其他东西)
于 2013-06-06T18:53:38.217 回答