计算比赛得分"GO"

Calculate the score of the game "GO"

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

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

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

  1. 生活 - 一个群体需要两只眼睛才能生存。如果一群人被其他方式包围并且没有两只眼睛,它可能已经死了。
  2. 组计数顺序 - 正如游戏一般从角落开始,移动到两侧,然后在中间结束,这个顺序也是开始计数的最简单方法分数。一个角落只需要两堵墙就可以创造领地,两边三堵墙,中间四堵墙。
  3. 行号 - 棋子离棋盘边缘最近的组更有可能在得分估计中建立领土:“第 4 行是 'influence' , Line 3 is for 'territory'” 是一句常见的围棋谚语。因此,从角落开始计数,但先数最靠近棋盘边缘的棋子。第一行可能没有任何石头,但第二行可能有一些。