五子棋ai打分表中ai预测到终局需要多长时间

HTML5五子棋游戏 画面超酷 可设置难度 | HTML5资源教程下次自动登录
现在的位置:
& 综合 & 正文
五子棋AI设计——从门外到门内不得不说的事儿6
第6天——评价的准才能胜券在握
在博弈类游戏中,都可以使用博弈搜索求解最优解,但是最优解的质量如何取决于评估器的质量,也就是说AI对棋局态势的感知能力。
在不考虑时间时,我们可以让AI前瞻若干步直到终局,终局评估器设计起来就很简单,AI胜利给个正1,AI败北给个负1,平局给个0。完全博弈树的叶节点的数量很大,因此产生终局的时间代价是不能容忍的,我们只能让AI前瞻有限步。如何对中间局进行评价,可以理解成AI对于中间局的感知能力。
之前我们介绍了阳线评估器和阴线评估器,并说明了每个评估器的应用场合。对于阳线评估器的设计相对简单,只要讨论几种模式就可以了,每种模式和对应的得分见表1。
表1 阳线模式评分表
阴线评估器的设计相对复杂一些,不仅要考虑一个方向还有考虑两个方向,模式及得分见表2、3。
三连两端为空
三连两端非空
阴线一个方向的模式评分表
相隔45、90
双三连一端为空
三连和二连一端为空
=3两端非空
三连和二连一端非空
三连和一连
双二连两端空
=2两端非空
双二连一端空
双二连两端非空
二连一连一端空
表3 阴线两个方向的模式评分表
表1、2和3的模式仅仅是我能够想到的模式中的一部分,能够简单表示的一部分模式,还有很多其他的模式。因此,另外一种设计评估器的方法就是记棋谱。说到这里,我们不难发现,AI的最高水平要略低于开发者玩该游戏的水平,因此我设计的AI目前仅仅能算是个初学者。同时,每种模式的给分情况也是我根据自己的感觉随便给的,如何设计每种模式的得分又是一个问题。在阅读别人的论文时,主流的评分方法是使用神经网络进行训练,然后利用训练的网络作为评估器每种模式的得分。
讨论了半天,我们还是在原地打转,最最根本的问题并没有得到解决。按照这种技术路线继续走下去,我们设计的AI的水平最好能够达到我们自己的水平,而不能够更高。细细想想,其实min-max搜索,加上alpha-beta剪枝并不是AI的关键,关键是评估器的设计,而评估器的设计实质上是将人的经验形式化转换成计算机的数据结构或者代码。如何让计算机自己学习这一过程,也许才是人工智能的发展方向,目前这种方法充其量还是在模拟人的智能模式。如果能够创造出一种新的智能模式,那么我们又何必挖空心思复现人的智能模式呢,就像地外生命形式一样。如果存在非碳基的生命形式,我们就不会显得如此狭隘,如此孤独,如此自大。如果智能能够被界定成生命的话,那么非人类模式的智能会是什么样,硅基智能吗,计算智能吗,路漫漫啊。
--------------------分割线--------------------
int CWuZiQi::MaxMinValuationOnNonempty( const int oldp[16][16], bool first )
int i, j, k, t, s,
int dx[4] = {1, 1, 0, -1};
int dy[4] = {0, 1, 1, 1};
int tiju[16][16][8][2];
int mark[16][16][8][2];
int res = 0;
int typeq[8][2] = {0};
int type[8] = {0};
int score[8] = {000, 1, 250, 100, 10, 1};
FillMatrix( tiju, 0 );
FillMatrix( mark, 0 );
/****************为双方填写棋型表************/
for ( i = 1; i &= 15; i++ )
for ( j = 1; j &= 15; j++ )
if ( oldp[i][j] != 0 )
for ( k = 0; k & 4; k++ )
// direction
if ( oldp[i][j] == 1 )
if ( mark[i][j][k][0] == 0 )
mark[tx][ty][k][0] = 1;
for ( t = 0; t & 5; t++ )
tx += dx[k];
ty += dy[k];
if ( tx & 15 || tx & 1 || ty & 15 || ty & 1 )
if( oldp[tx][ty] == 1 )
mark[tx][ty][k][0] = 1;
tiju[i][j][k][0] =
if ( cnt == 5 )
typeq[0][0]++;
else if ( cnt == 4 )
typeq[1][0]++;
else if ( cnt == 3 )
typeq[3][0]++;
else if ( cnt == 2 )
typeq[5][0]++;
else if ( cnt == 1 )
typeq[6][0]++;
for ( int ii = 0; ii & 4; ii++ )
mark[i][j][ii][0] = 1;
else if ( oldp[i][j] == 2 )
if ( mark[i][j][k][1] == 0 )
mark[tx][ty][k][1] = 1;
for ( t = 0; t & 5; t++ )
tx += dx[k];
ty += dy[k];
if ( tx & 15 || tx & 1 || ty & 15 || ty & 1 )
if( oldp[tx][ty] == 2 )
mark[tx][ty][k][1] = 1;
tiju[i][j][k][1] =
if ( cnt == 5 )
typeq[0][1]++;
else if ( cnt == 4 )
typeq[1][1]++;
else if ( cnt == 3 )
typeq[3][1]++;
else if ( cnt == 2 )
typeq[5][1]++;
else if ( cnt == 1 )
typeq[6][1]++;
for ( int ii = 0; ii & 4; ii++ )
mark[i][j][ii][1] = 1;
for ( s = 0; s & 2; s++ )
for ( k = 0; k & 4; k++ )
if ( tiju[i][j][k][s] == 3 )
if ( t == 2 )
typeq[2][s] += 1;
else if ( t == 3 )
typeq[2][s] += 3;
else if ( t == 4 )
typeq[2][s] += 6;
for ( k = 0; k & 4; k++ )
if ( tiju[i][j][k][s] == 2 )
if ( t == 2 )
typeq[4][s] += 1;
else if ( t == 3 )
typeq[4][s] += 3;
else if ( t == 4 )
typeq[4][s] += 6;
//PrintMatrix( tiju );
//PrintMatrix( oldp );
for ( i = 0; i & 7; i++ )
if ( first )
type[i] = typeq[i][0] -
typeq[i][1];
type[i] = typeq[i][0] - typeq[i][1];
res += type[i] * score[i];
if ( first )
void CWuZiQi::MaxMinValuationOnEmpty( const int oldp[16][16], int a1[16][16], int a2[16][16] )
int i, j, k, t, s, cnt, ii,
int win[2];
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int type[8][2];
int p[16][16];
for ( i = 0; i & 16; i++ )
for ( j = 0; j & 16; j ++ )
p[i][j] = oldp[i][j];
/****************为双方填写棋型表************/
for ( i = 1; i &= 15; i++ )
for ( j = 1; j &= 15; j++ )
if ( oldp[i][j] == 0 )
for ( ii = 0; ii & 8; ii++ )
for ( jj = 0; jj & 2; jj++ )
type[ii][jj] = 0;
for ( k = 0; k & 8; k++ )
// direction
cnt = 0; tx = ty = barrier = 0;
for ( t = 0; t & 5; t++ )
tx += dx[k]; ty += dy[k];
if ( tx & 15 || tx & 1 || ty & 15 || ty & 1 ) {barrier = 1;}
if( oldp[tx][ty] == 1 ) cnt++;
if ( oldp[tx][ty] == 2 ) barrier = 1;
type[k][0] = cnt * 2 +
cnt = 0; tx = ty = barrier = 0;
for ( t = 0; t & 5; t++ )
tx += dx[k]; ty += dy[k];
if ( tx & 15 || tx & 1 || ty & 15 || ty & 1 ) {barrier = 1;}
if( oldp[tx][ty] == 2 ) cnt++;
if ( oldp[tx][ty] == 1 ) barrier = 1;
type[k][1] = cnt * 2 +
for ( t = 0; t & 2; t++ )
win[t] = 0;
for ( k = 0; k & 8; k++ )
// single line
int t1, s1;
if ( type[k][t] % 2 == 0 ) {t1 = type[k][t] / 2; s1 = 0;}
else {t1 = ( type[k][t] - 1 ) / 2; s1 = 1;}
if ( t1 &= 4 )
win[t] += 100000;
else if ( t1 == 3 && s1 == 0 )
win[t] += 100000;
else if ( t1 == 3 && s1 == 1 )
win[t] += 10000;
else if ( t1 == 2 )
win[t] += 10;
win[t] += 1;
for ( k = 0; k & 8; k++ )
// two line combination, 45 degree, 90 degree and 135 degree
for ( s = 1; s &= 3; s++ )
int t1, t2, s1, s2;
if ( type[k][t] % 2 == 0 ) {t1 = type[k][t] / 2; s1 = 0;}
else {t1 = ( type[k][t] - 1 ) / 2; s1 = 1;}
if ( type[( k + s ) % 8][0] % 2 == 0 ) {t2 = type[( k + s ) % 8][t] / 2; s2 = 0;}
else {t2 = ( type[( k + s ) % 8][t] - 1 ) / 2; s2 = 1;}
int tmp = t1 + t2;
if ( t1 == 0 || t2 == 0 )
if ( t1 &= 4 || t2 &= 4 ) {win[t] += 100000;}
else if ( t1 == 3 || t2 == 3 )
if (( t1 == 3 && s1 == 0 ) || ( t2 == 3 && s2 == 0 )) {win[t] += 100000;}
else if (( t1 == 2 && s1 == 0 ) || ( t2 == 2 && s2 == 0 )) {win[t] += 10000;}
else if (( t1 == 2 && s1 == 1 ) || ( t2 == 2 && s2 == 1 )) {win[t] += 100;}
else if (( t1 == 1 ) || ( t2 == 1 )) {win[t] += 10;}
else if (( t1 == 0 ) || ( t2 == 0 )) {win[t] += 1;}
else if ( t1 == 2 || t2 == 2 )
if (( t1 == 2 && s1 == 0 ) && ( t2 == 2 && s2 == 0 )) {win[t] += 100000;}
else if (( t1 == 2 && s1 == 1 ) && ( t2 == 2 && s2 == 1 )) {win[t] += 100;}
else if (( t1 == 2 && s1 == 1 ) && ( t2 == 2 && s2 == 0 ) || ( t1 == 2 && s1 == 0 ) && ( t2 == 2 && s2 == 1 ))
{win[t] += 10000;}
if (( t1 == 2 && s1 == 0 ) || ( t2 == 2 && s2 == 0 )) {win[t] += 10000;}
else {win[t] += 100;}
else if ( t1 == 1 || t2 == 1 )
{win[t] += 1;}
for ( k = 0; k & 4; k++ )
// two line combination 180 degree
int t1, t2, s1, s2;
if ( type[k][t] % 2 == 0 ) {t1 = type[k][t] / 2; s1 = 0;}
else {t1 = ( type[k][t] - 1 ) / 2; s1 = 1;}
if ( type[( k + 4 ) % 8][0] % 2 == 0 ) {t2 = type[( k + 4 ) % 8][t] / 2; s2 = 0;}
else {t2 = ( type[( k + s ) % 8][t] - 1 ) / 2; s2 = 1;}
int tmp = t1 + t2;
if ( t1 == 0 || t2 == 0 )
if ( tmp &= 4 )
{win[t] += 100000;}
else if ( tmp == 3 )
if ( s1 == 0 && s2 == 0 ) {win[t] += 100000;}
else if ( s1 == 1 && s2 == 1 ) {win[t] += 1;}
else {win[t] += 10;}
else if ( tmp == 2 )
if ( s1 == 0 && s2 == 0 ) {win[t] += 10000;}
else if ( s1 == 1 && s2 == 1 ) {win[t] += 1;}
else {win[t] += 10;}
a1[i][j] = win[0];
a2[i][j] = win[1];
【上篇】【下篇】我的世界五子棋AI怎么做
五子棋AI制作教程
<p诚招我的世界兼职写手,可联系QQ:</p<p小编推荐:</p<p我的世界热门攻略合集资源大全下载更多攻略,敬请关注搞趣网专区。</p
责任编辑【】
关注搞趣网微信公众账号(gao7-_com)领取游戏豪华礼包!
闽ICP B2-&&&&&
福建天志互联信息科技股份有限公司 版权所有 (C)
Gao7.com 搞趣网 福建省通信管理局五子棋AI算法的改进方法_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
五子棋AI算法的改进方法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
&#xe64e;加入VIP
还剩9页未读,
定制HR最喜欢的简历
你可能喜欢求一个AI性能最高的五子棋软件。_五子棋吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:39,552贴子:
求一个AI性能最高的五子棋软件。
只求最高。。。
如何评估性能
求智能水平最高的五子棋软件
没有,都是弱智
瑞星杀毒软件
猴子香蕉五子棋
连珠终结者!很强大,可以杀黑石,不过是收费,免费的也就属蜗牛连珠了,也很强
这个我必须要说一句了,夕阳五子棋。大爷的,昨天晚上到现在跟电脑下了40多局,就赢了两局。
百度titogomoku
奕心,调到最高等级。
手机qq五子棋单机最后一档 我是菜鸟,不喜勿喷 谢谢。
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 五子棋ai算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信