看看棋盘游戏是否被捕获的逻辑(去)

时间:2017-05-31 00:58:03

标签: javascript

我开发了一个在线版本的棋盘游戏go,一个日本游戏,玩家轮流将它们放在网格上。当一个玩家的石头被对手包围时,它们就会被摧毁。

这是我无法理解我的编程方式的逻辑。到目前为止,我已经制作了2个玩家网格,其中所有的石头都存放在一个阵列中。我将在此处添加一张图片go

正如你所看到的,网格显示黑色有2块白色石头被包围,在这种情况下它们应该被摧毁,请注意它可以是任意数量的包围石头,但在这种情况下它是2。

在右边你还可以看到我将用来检查玩家是否被包围的石头阵列。我试图制作一些pysudo代码,但它变得一团糟,而且过于复杂,这项任务真的很复杂吗?我将如何做到这一点背后的任何建议或逻辑都会得到应用,所以如果网上有人做过类似的事情那也会很好。我甚至不确定像我所做的那样制作阵列是最好的方式,所以如果有更好的方式请告诉我

2 个答案:

答案 0 :(得分:2)

算法的一般粗略轮廓:

  1. 确定与白色部分相邻的所有斑点(为清晰起见,我们在这里使用白色):

    • 创建两个桶(数组):要检查的白色部分,相邻的点
    • 拿任何白色的东西,把它放入白色的桶里
    • 对于白色碎片桶中的所有白色碎片,确定它们的相邻斑点(上,下,左,右)
      • 如果那个地方没有没有白色,那么将该地点放入相邻景点桶中
      • 如果那个地方有一块白色的东西,就把它放进白色的桶里
      • 重复此过程,直到您的白色碎片桶为空(您已找到组中的所有白色碎片)
    • (确保在此过程中对您的存储桶进行重复数据删除,这样您就不会在圈子中乱跑了)
  2. 检查所有相邻的斑点是否被黑色部分覆盖。

  3. 可以做的大量优化会使这个算法变得更加复杂,专业的Go程序 比这更复杂,但它可以让你开始。

答案 1 :(得分:1)

我建议使用不同的数据模型 - 本质上是一个二维数组,分别为空,黑和白,值为0,+ 1和-1。出于算法的目的,维护一个并行的布尔数组“for liberty”。

您的算法需要多次扫描电路板。在扫描之前,当且仅当位置被占用时,将位置的“has liberty”标志设置为false。在每次扫描中,找到所有具有“自由”为真的单元格,并将单元格标记为左侧,右侧,顶部和底部为“具有自由”;如果位置已被占用,请将此标记限制为相同颜色的相邻位置。扫描完成后,如果电路板上没有任何变化,您就完成了。此时,所有“有自由”的石头都被捕获并被删除。

这是一种简单,低效的算法。像GNU这样的引擎有更复杂的算法,包括跟踪连接石头的“链”或“组”,以及它们的自由数,然后在玩石头时更新它们。如果您打算编写一个去游戏程序,当您读出不同的序列时,您将进行数千或数百次的计算,因此这种优化将变得至关重要。

请注意,你需要为被称为“ko”的情况做一个特殊的套管,以及类似的情况,即石头在一个看似“被捕获”的位置进行,但因为它本身需要其他石头而存活下来。 。如果你只是将石头放在板上,并运行上面的算法,那么正在拍摄的石头和刚刚玩过的石头将被认为是被捕获的,这是错误的。因此,对于最近的石头,你需要一个板级变量,并认为石头始终处于“具有自由”状态,具有处理非法移动的适当逻辑。