吴昊品游戏核心算法 Round 10 —— 关于先前发布的围棋算法(模拟)中目数统计函数的全解析(感谢林安泽)

经过与华科ACM林安泽交流后得知,作者没有考虑到如下两种情况:(1)在收官阶段,实地如何计算在内(2)在终盘结束的时候,是不可能有没有归属的空格的,所有的空位置是都有归属的,这也是围棋的常识,看来作者貌似不会下围棋哦!^_^ 

  首先,源码中有一个问题,就是c=qipan[j][i].color应该改为c=qipan[i][j].color,在此基础上,这段代码主要是统计 白子的数目,因为围棋中黑子让白子3又3/4个子,具体为什么这样将在之后的吴昊系列中讲解。那么,我们可以看到,只需要单方面地统计白子的总数目就可以 了。首先将三个数组都置为0,从第一行开始扫描。如果一开始是空白的话,就直接算作空白的了。当遇到黑子或者白子的时候,我们开始统计区域,这里将k设为 区域标识。不过,这里有一个问题,作者还是缺乏围棋的基本常识,围棋是用了围地的,而不是用来吃子的,该统计确实是可以统计中盘的一些势力范围,但是不可 能统计最终收官之后的情况,因为整个流程的“思维”就不是围地的“思维”。基于以上一点,我们再来看标程,其实,作者本人也只是实现了一种情况。首先,忽 略黑棋的区域中有白棋的可能,这是基于前面的代码所实现的。因为,每次吃子的时候,就将里面的白子都清除了。这样,我们考虑每一行的“一段黑子”,可以发 现,只要收尾都为黑,那么中间的空格都是黑子的了。这也就是为什么每次都要将空位置都置0,这也是为了防止黑所拥有的空格被白计算了。

  附上这段源代码:

  

 1 int summ(void)
 2  {
 3    int i=0,j=0,c=2,k=2;
 4    //计数白子,黑子,空白的数目
 5    sum[0]=0;
 6    sum[1]=0;
 7    sum[2]=0;
 8    for (i=1;i<=19;i++)
 9    {    //从最外层开始搜索
10      k=qipan[i][1].color;
11      for (j=1;j<=19;j++)
12      {
13        c=qipan[j][i].color;
14        switch (c)
15        {
16          case 2:
17            if (k==2) sum[2]++;
18            else sum[k]++;
19            break;
20          case 0:
21            if (k==0)
22            {
23              sum[c]++;
24            }
25            else if(k==2)
26            {
27              sum[c]=sum[c]+sum[2]+1;
28              k=c;
29              sum[2]=0;
30            }
31            else if(k==1)
32            {
33              sum[c]++;
34              k=c;
35              sum[2]=0;
36            }
37            break;
38          case 1:
39            if (k==1)
40            {
41              sum[c]++;
42            }
43            else if(k==2)
44            {
45              sum[c]=sum[c]+sum[2]+1;
46              k=c;
47              sum[2]=0;
48            }
49            else if(k==0)
50            {
51              sum[c]++;
52              k=c;
53              sum[2]=0;
54            }
55            break;
56        }
57      }
58    }
59    return sum[0];
60  }

 

posted on 2013-02-27 21:49  吴昊系列  阅读(650)  评论(0)    收藏  举报

导航