五子棋的估值函数
#1 五子棋的估值函数 作者:有志青年 发表时间:2007-4-24 10:03:50
今天总算是把五子棋的估值函数写完了, 基本上是完全参考了王小春的>...
总的来说他的算法是很简单的, 主要目的是让读者理解(尽管这样,我也花了不少时间去理解)...他的基本思想是对当前的静态局面进行评估...
用一个15*15的二维数组来表示一个棋盘, 每个元素有三种值, 白(1), 黑(2), 无棋子(0).
对棋盘进行扫描, 当遇到一个不是空的位置之后对它进行4个方向的分析--水平, 垂直, 左对角, 右对角. 具体是把当前的棋子在的行, 列和对角转化到一个一维的数组中. 由一个analysisLine(int TempArray[], int len , int nCurPos)来计算其中的各种棋型, 并保存到一个m_lineRecord数组之中去...再把m_lineRecord中的值转化到一个三维数组m_analysisTable[j][k], i,j是当前棋子的位置, k是方向, 有四个取值...当完成了所有的扫描工作之后是由m_typeRecord[side][棋型]来记录个中棋型的数量, 最后再对这个数组进行扫描, 对不同的棋型进行不同的给分...最后还会有个位置分数的加权, 可以对计算机刚开始的走棋形成指导...多的不说了..把代码帖上
CEvaluation::Evaluation(int position[][GRID_NUM], bool bWhiteTurn)
{
int PosValue[GRID_NUM][GRID_NUM] =
{
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,1,2,2,2,2,2,2,2,2,2,2,2,1,0},
{0,1,2,3,3,3,3,3,3,3,3,3,2,1,0},
{0,1,2,3,4,4,4,4,4,4,4,3,2,1,0},
{0,1,2,3,4,5,5,5,5,5,4,3,2,1,0},
{0,1,2,3,4,5,6,6,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,7,6,5,4,3,2,1,0},
{0,1,2,3,4,5,6,6,6,5,4,3,2,1,0},
{0,1,2,3,4,5,5,5,5,5,4,3,2,1,0},
{0,1,2,3,4,4,4,4,4,4,4,3,2,1,0},
{0,1,2,3,3,3,3,3,3,3,3,3,2,1,0},
{0,1,2,2,2,2,2,2,2,2,2,2,2,1,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
for(int i = 0; i
int chessType;
for(i = 0; i
case FIVE:
m_nTypeCount[chessType][FIVE]++;
break;
case FOUR:
m_nTypeCount[chessType][FOUR]++;
break;
case SFOUR:
m_nTypeCount[chessType][SFOUR]++;
break;
case THREE:
m_nTypeCount[chessType][THREE]++;
break;
case STHREE:
m_nTypeCount[chessType][STHREE]++;
break;
case TWO:
m_nTypeCount[chessType][TWO]++;
break;
case STWO:
m_nTypeCount[chessType][STWO]++;
break;
}//end the calculation of the types of in the chess board
}
}
}//end calculation
if(bWhiteTurn)
{
if(m_nTypeCount[BLACK][FIVE])
{
//black side has five in a row return the max negative num
return -9999;
}
if(m_nTypeCount[WHITE][FIVE])
{
//white has five in a row return max positive num
return 9999;
}
}
else
{
if(m_nTypeCount[BLACK][FIVE])
{
//black side has five in a row return the max negative num
return 9999;
}
if(m_nTypeCount[WHITE][FIVE])
{
//white has five in a row return max positive num
return -9999;
}
}
int nWhiteValue = 0, nBlackValue = 0;
if(bWhiteTurn)
{//if it is the turn of the white side
if(m_nTypeCount[WHITE][FOUR])
{
return 9990;
}
if(m_nTypeCount[WHITE][SFOUR])
{
return 9980;
#2 Re:五子棋的估值函数 作者:我爱棋 发表时间:2007-6-6 11:14:38
看不懂........