五子棋的估值函数

五子棋软件


#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

看不懂........