这是我无法理解我的编程方式的逻辑。到目前为止,我已经制作了2个玩家网格,其中所有的石头都存放在一个阵列中。我将在此处添加一张图片
正如你所看到的,网格显示黑色有2块白色石头被包围,在这种情况下它们应该被摧毁,请注意它可以是任意数量的包围石头,但在这种情况下它是2。
在右边你还可以看到我将用来检查玩家是否被包围的石头阵列。我试图制作一些pysudo代码,但它变得一团糟,而且过于复杂,这项任务真的很复杂吗?我将如何做到这一点背后的任何建议或逻辑都会得到应用,所以如果网上有人做过类似的事情那也会很好。我甚至不确定像我所做的那样制作阵列是最好的方式,所以如果有更好的方式请告诉我
答案 0 :(得分:2)
算法的一般粗略轮廓:
确定与白色部分相邻的所有斑点(为清晰起见,我们在这里使用白色):
检查所有相邻的斑点是否被黑色部分覆盖。
可以做的大量优化会使这个算法变得更加复杂,专业的Go程序 比这更复杂,但它可以让你开始。
答案 1 :(得分:1)
我建议使用不同的数据模型 - 本质上是一个二维数组,分别为空,黑和白,值为0,+ 1和-1。出于算法的目的,维护一个并行的布尔数组“for liberty”。
您的算法需要多次扫描电路板。在扫描之前,当且仅当位置被占用时,将位置的“has liberty”标志设置为false。在每次扫描中,找到所有具有“自由”为真的单元格,并将单元格标记为左侧,右侧,顶部和底部为“具有自由”;如果位置已被占用,请将此标记限制为相同颜色的相邻位置。扫描完成后,如果电路板上没有任何变化,您就完成了。此时,所有“有自由”的石头都被捕获并被删除。
这是一种简单,低效的算法。像GNU这样的引擎有更复杂的算法,包括跟踪连接石头的“链”或“组”,以及它们的自由数,然后在玩石头时更新它们。如果您打算编写一个去游戏程序,当您读出不同的序列时,您将进行数千或数百次的计算,因此这种优化将变得至关重要。
请注意,你需要为被称为“ko”的情况做一个特殊的套管,以及类似的情况,即石头在一个看似“被捕获”的位置进行,但因为它本身需要其他石头而存活下来。 。如果你只是将石头放在板上,并运行上面的算法,那么正在拍摄的石头和刚刚玩过的石头将被认为是被捕获的,这是错误的。因此,对于最近的石头,你需要一个板级变量,并认为石头始终处于“具有自由”状态,具有处理非法移动的适当逻辑。