码迷,mamicode.com
首页 > 其他好文 > 详细

人机博弈-吃子棋游戏(三)走法生成

时间:2014-10-12 18:30:18      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   sp   div   on   

我们可以根据吃子棋的规则,创建走法生成器,主要的逻辑是,如果己方存在一气的棋串,则可以无需紧对方的气,也就是可以不用贴着对方的棋子落子。其他情况下,必须贴

着对方的棋子落子,考虑到某些特殊情况,当己方能提对方棋子时,己方就可以下到没有气的地方,并且一般的吃子棋,先提子者胜,无法形成劫争。所以走法生成器就相对非

常简单。

对于如何确定己方是不是存在一气的棋串,可以利用上一节介绍的算气算法。

  1 int CMoveGenerator::CreatePossibleMove(BYTE position[GRID_NUM][GRID_NUM], int nPly, int nSide)
  2 {
  3     m_nMoveCount = 0;
  4     
  5     BYTE antiSide = (nSide + 1) % 2;
  6     cleanGlobal();
  7     setGo(position);
  8 
  9     
 10     
 11     //检测己方是否有一气的棋窜,有则输出相应走法。
 12     
 13     for (int i = 0; i < GRID_NUM; i++)
 14     for (int j = 0; j < GRID_NUM; j++){
 15         
 16         if(go[i][j]==nSide&&g_gozi[i][j]==0){
 17            str_lib(i,j,go[i][j]);
 35          
 36            if (goqi==1)
 37                 {
 38                 
 39                 for (int k = 0; k < GRID_NUM; k++)
 40                 for (int w = 0; w < GRID_NUM; w++){
 41 
 42                 if (gokong[k][w] == 1){
 43                 AddMove(k, w, nPly);
 44 
 45                 }
 46 
 47 
 48                 }
 49 
 50                 
 51                 }
 52         
 53         }
 54        
 58     }
 59     64     
 65     //正常情况下,寻找敌方棋子周边的空位,紧其气
 67 
 68             for (int i = 0; i < GRID_NUM; i++)
 69             for (int j = 0; j < GRID_NUM; j++)
 70             {
 71             
 72 
 73             if (go[i][j] == antiSide)
 74             {
 75                 
 76                 if (i > 0 && go[i - 1][j] == NOSTONE){
 77                     
 79                     AddMove(i - 1, j, nPly);
 80                     
 81                     
 82                 }
 83                     
 84                 if (i < GRID_NUM - 1 && go[i + 1][j] == NOSTONE){
 85                   
 87                     AddMove(i + 1, j, nPly);
 88                     
 89                 }
 90                     
 91                 if (j>0 && go[i][j - 1] == NOSTONE){
 92                   
 94                     AddMove(i, j - 1, nPly);
 95                     
 96                     
 97                 }
 98                     
 99                 if (j < GRID_NUM - 1 && go[i][j + 1] == NOSTONE){
100                   
102                     AddMove(i, j + 1, nPly);
103                    
104                 }
105                     
106                 
107             }
108             
109             
110 
111         }
112 
113 
114     
115     return m_nMoveCount;
116 }

 

人机博弈-吃子棋游戏(三)走法生成

标签:style   blog   color   io   os   for   sp   div   on   

原文地址:http://www.cnblogs.com/tangzhenqiang/p/4020739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!