【问题标题】:Calculate the score of the game "GO"计算游戏“GO”的分数
【发布时间】:2015-05-26 15:06:54
【问题描述】:

有人知道如何以编程方式计算Go 游戏中的分数吗? 我有一个 19x19 的数组,这个数组的每个元素可以是 0(空点)、1(黑石)或 2(白石)。我不明白如何检查该区域是否属于任何颜色。

【问题讨论】:

  • 到目前为止您尝试过什么?请编辑您的问题并添加您的尝试,以及您遇到的问题。
  • 您是要计算所有“实心”区域,还是要尝试猜测玩家可以识别属于其中一个但内部可能包含敌人石头的区域?
  • 如果它只是识别一个区域是否与一种且只有一种颜色的石头相邻,您应该能够轻松地编程它穿过板阵列的方式,就像您用手指追踪它一样用适当的值标记区域。
  • 围棋有几组不同的评分规则,你想实现哪一组?
  • 我想使用日本的一套规则,其中最终得分是领土大小和捕获的石头数量的总和。我不知道如何识别死石(对手领土内的石头)。

标签: algorithm logic


【解决方案1】:

这是一个重要的问题,因为通常围棋游戏在玩家完成所有必要的移动以明确游戏的“真实”得分/价值是什么之前就结束了。有时游戏的价值可能会有所不同,假设一个玩家玩得不是很好(例如,让对手完成在对手的领土上建立一组有生命的棋子,即使证明有可能杀死这组棋子)。计算未侵入的原始区域是相当明显的,只需检查每个空间是否在每个可能的方向组合(正负水平和垂直)中被板的边缘或一种颜色的碎片“切断”。您可以通过从空白点开始广度优先搜索来更有效地执行此操作,并跟踪在此过程中遇到的颜色(不从占用的点遍历 BFS),一旦找不到更多的空白点,如果找到的彩色碎片都是一种颜色,那么找到的所有空白都属于该颜色,否则它们不属于任何人。然后用下一个未探索的空白点继续广度优先搜索,删除所有先前探索过的空白点。但是,如果对手在既定领土内拥有一块棋子,则理想情况下,该棋子在计算领土时应忽略,实际上甚至被视为已捕获。如果玩家领土上的一组对手的棋子显然会“最终”被捕获,那么情况也是一样的。如果两个玩家陷入这样一种情况,即他们每个人都有一组与对方的棋子相邻的棋子,那么情况就更加微妙了,这样这些棋子就具有“相互生命”,即如果一个玩家试图在努力中移动杀死对方的棋子,对方就可以杀死原玩家的棋子,反之亦然。

【讨论】:

    【解决方案2】:

    除了@user256... 的回答之外,还有一些高级概念可能会帮助您决定如何深入地估算 Go 分数:

    1. 生活 - 一个群体需要两只眼睛才能生存。如果一群人被包围并且没有两只眼睛,它可能已经死了。
    2. 分组计数顺序 - 就像游戏通常从角落开始,移动到两侧,然后在中间结束一样,这个顺序也是开始计算分数的最简单方法。一个角落只需要两堵墙来创建区域,侧面需要 3 堵墙,中间需要 4 堵墙。
    3. 行号 - 棋子最靠近棋盘边缘的组更有可能在得分估算中成为领地:“第 4 行代表‘影响’,第 3 行代表‘领地’”常见的围棋谚语。因此,从角开始数,但首先数最靠近棋盘边缘的棋子。第一行可能没有任何石头,但第二行可能有一些。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      相关资源
      最近更新 更多