围棋中气的判断

| Comments

围棋玩法

围棋本身的规则是非常简单的。判断一个子能不能落在某个点是最基本的问题。
如果不能吃掉对方但这个子周围还有气(空点)的话,是可以落子的。
如果能吃掉对方但不是打劫这种特殊情况的话,也是可以落子的。
我们先不考虑打劫这种情况,问题就归结为如何判断某个子是否有气,而杀子就是判断四周的子是否有气。

用递归来判断

假设有个方法try2kill(r,c),它可以用来判断r行c列的子是否有气,如果没气返回true,否则返回false。

递归过程如下:

  1. 判断四周是否存在一个气,就是有个空格(0),如果有返回false。
  2. 否则,给当前点记录为预杀状态(x)(表示自己周围没有明显的气)
  3. 再依次判断四周的点,对每个点例如左边(left):
  4. 如果左边未出边界且和当前点是同一颜色(但并非预杀状态),则调用try2kill进行判断
  5. 如果其中一个点有气(try2kill返回false),则直接返回false
  6. 如果四周都判断完,没有发现明显的气,则返回true(这样所有预杀状态的都是没气的,都会被杀掉)

打劫处理

打劫有个特殊的地方就是不能立即回提,本质上是不能在对弈过程中出现同形。
一个比较简单有效的办法就是,记录落子次序和每次的吃子数(通过上面的判断逻辑)。 这两个记录都是很容易记录的。判断是否打劫违规就是当前手和上一手的吃子数是否都为1。 且当前落子点对应上手的死子点,当前死子点对应上手的落子点。
这些条件符合的话,这就是一次违规。

后续

有了这些判断逻辑,要实现整个走法已经不是问题了,有兴趣的可以试试。
当然,围棋最复杂的地方还是人工智能领域,现阶段的电脑围棋还是比较弱的。

Comments