标签:
我们能够根据国际象棋的规则吃,创建移动生成器。基本逻辑是,假定一个拉伸己方蠕虫的存在,这是可能没有其他的致密气。这是不是对其他部分可以落子。在其他情况下。必须坚持
另一片落子,考虑到特殊情况,当自己可以提其他片,自己可以下到那里没有气。和一般吃跳棋。胜,无法形成劫争。所以走法生成器就相对非
常简单。
对于怎样确定己方是不是存在一气的棋串,能够利用上一节介绍的算气算法。
int CMoveGenerator::CreatePossibleMove(BYTE position[GRID_NUM][GRID_NUM], int nPly, int nSide) { m_nMoveCount = 0; BYTE antiSide = (nSide + 1) % 2; cleanGlobal(); setGo(position); //检測己方是否有一气的棋窜,有则输出对应走法。 for (int i = 0; i < GRID_NUM; i++) for (int j = 0; j < GRID_NUM; j++){ if(go[i][j]==nSide&&g_gozi[i][j]==0){ str_lib(i,j,go[i][j]); if (goqi==1) { for (int k = 0; k < GRID_NUM; k++) for (int w = 0; w < GRID_NUM; w++){ if (gokong[k][w] == 1){ AddMove(k, w, nPly); } } } } } 64 //正常情况下,寻找敌方棋子周边的空位,紧其气 for (int i = 0; i < GRID_NUM; i++) for (int j = 0; j < GRID_NUM; j++) { if (go[i][j] == antiSide) { if (i > 0 && go[i - 1][j] == NOSTONE){ AddMove(i - 1, j, nPly); } if (i < GRID_NUM - 1 && go[i + 1][j] == NOSTONE){ AddMove(i + 1, j, nPly); } if (j>0 && go[i][j - 1] == NOSTONE){ AddMove(i, j - 1, nPly); } if (j < GRID_NUM - 1 && go[i][j + 1] == NOSTONE){ AddMove(i, j + 1, nPly); } } } return m_nMoveCount; }
可以优化此算法,以后方便兴许的搜索引擎进行剪枝。
给走法设定一个分数。可以提子则此步设为30+提子数。可以打吃则为20+打吃棋子数。可以长气,则为10+长气的棋子数。其它临时设计为0。可以用一个额定长度的优先队列,保留几个分数最佳的走法。
或是必要时进行排序。
搜索时优先优先搜索得分较高的走法,这样大幅度提高搜索算法剪枝的效率。
这段是走法启示的代码
伪码例如以下:
for(int i=0;i<Grid_Num;i++) for(int j=0;j<Grid_Num;j++) { cleanupGlobal(); if(go[i][j]==NOSTONE) { bool isVilid=false; if(i>0&&go[i-1][j]==antiSide) { go[i][j]=nSide; if(g_gozi[i-1][j]==0) { isVilid=true; str_lib(i-1,j,antiSide); switch(goqi){case 0:case 1:....} } } if(i<Grid_Num-1&&go[i+1][j]==antiSide) { go[i][j]=nSide; if(g_gozi[i-1][j]==0) { isValid=true; str_lib(i-1,j,antiSide); switch(goqi){case 0:case 1:....} } }... if(isValid) { sumScore(i,j,nSide); addMove(i,j,nSide); } 44 } } std::sort();
标签:
原文地址:http://www.cnblogs.com/gcczhongduan/p/4591481.html