首页 > 代码库 > 人机博弈-吃子棋游戏(三)走法生成

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

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

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

常简单。

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

  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 }

 

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