ai五子棋的实现

打印 上一主题 下一主题

主题 1784|帖子 1784|积分 5352

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、棋型模式分析
构造有'0'和'1'构成的序列,来一一映射棋型如:‘活四’、‘冲三’、‘冲四’、‘活三’、‘活二’、‘冲二’等等。
思索:如何构造这样的序列?
对于一个棋子的得分评估,我是应该用'00001','00010','00100'类似这样的方式来映射吗?
假如以这样的方式对应,当我遇到活二的棋型时,我评估棋局时会出现这样的情况,盘算机有可能会把它当作两个孤立棋子的分数举行评估,即分别对应'00001'和'10000'两个棋型的分数举行相加才是活二的应有的分数。
以是有以下评估棋型的方式,假如我想按棋子数目来分类,并举行棋型分数评估,我以一种对称的方式举行则比较好,五位序列代表冲棋形式,六位代表活四形式。
点击查看代码
  1. //Key-val分值表
  2. std::vector<Pattern> patterns = {
  3.     { "11111",  50000 },
  4.     { "011110", 4320 },
  5.     { "011100", 720 },
  6.     { "001110", 720 },
  7.     { "011010", 720 },
  8.     { "010110", 720 },
  9.     { "11110",  720 },
  10.     { "01111",  720 },
  11.     { "11011",  720 },
  12.     { "10111",  720 },
  13.     { "11101",  720 },
  14.     { "001100", 120 },
  15.     { "001010", 120 },
  16.     { "010100", 120 },
  17.     { "000100", 20 },
  18.     { "001000", 20 },
  19. };
复制代码
得分函数:点击查看代码[code]int aiJudge::getScore(bool color, int x, int y, int g[][N]){    int ans = 0;    int dir = -1;    int nowcolor = color ? 1 : -1;    //获取8联通方向的棋子排布    while (++dir < 4) {        std::deque S;        S.push_back(1);        int sign = -1;        for (int i = 1; i < 4; ++i) {            int tx = x + sign * i * dx[dir], ty = y + sign * i * dy[dir];            if (!posIsLegal(tx, ty)){                S.push_front(2);                break;            }            if (g[tx][ty] == 0) {                S.push_front(0);            }            if (g[tx][ty] == nowcolor)                S.push_front(1);            if (g[tx][ty] == -nowcolor) {                S.push_front(2);                break;            }        }        sign = -sign;        for (int i = 1; i ACSearch(s);        for (int j = 0; j
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表