五子棋 AI

tfzxyinhao 2011-12-28 11:47:12
最近一段时间不能上网,准备写一个五子棋娱乐一下,画棋子和鼠标定位这之类的都做好了,现在该做AI了,的棋盘是21*21的
每个没有棋子的地方我都会评估这个位置落子的权值,评估权值的的情况如下

每个棋子有八个方向,每个方向的五个之内的的位置的落子状况进行判断,如果这个位置靠近边缘,则从这个位置的某个方向到边缘之间的落子状况进行评估,分为此方向上还有四个位置,三个位置,两个位置,一个位置和零个位置的情况

1.这个方向上还有四个位置:此种情况又可细分四个位置上都有子的时候(1)己方1子对方3子 使用取对数得到4种情况,(2)己方2子对方2子 取对数得到4种情况 (3)己方3子对方1子 有4种情况 (4)己方4子 此时只有一种情况 (5)对方4子 只有一种情况.
当四个位置只有三个有子的时候 (1)己方3子 有4种情况 (2)己方2子对方1子..........

当这样分析下去的时候 确实只要有时间一定可以把所有情况都列出来,并且对每一种情况都做考虑,那对当前局面的评估会非常精细,此时的棋力应该是最强的了,但是显得没技术含量,并且分支条件非常之多,不利于编码,问下有没有其他的好的方法.?
...全文
2069 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
某大一菜鸟 2012-07-14
  • 打赏
  • 举报
回复
总体来说设计三个算法:搜索,评估,走法生成
搜索短发推荐Mdf(t)..
tfzxyinhao 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]

我之前就正好写了一个人工智能五子棋

计算机或者玩家每走一步,计算机都要准确的计算并且记录每个落子处的分数,只有这样改计算机下子的时候才能准确估量出往哪里下胜算比较大,或者是输的几率比较小。
下面我以(i,j)为例大概讲一下怎么计算分数。假设(i,j)上面没有下子即为空,并且该计算机下子了,这时候,如果说这时候win[0][]==1,则加分5,如果为2,则加分10,这样循环下去,如果……
[/Quote]
求交流,邮箱:tfzxyinhao#qq.com
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 的回复:]
引用 34 楼 的回复:

我之前就正好写了一个人工智能五子棋

计算机或者玩家每走一步,计算机都要准确的计算并且记录每个落子处的分数,只有这样改计算机下子的时候才能准确估量出往哪里下胜算比较大,或者是输的几率比较小。
下面我以(i,j)为例大概讲一下怎么计算分数。假设(i,j)上面没有下子即为空,并且该计算机下子了,这时候,如果说这时候win[0][]==1,则加分5,如果为2,则加分……
[/Quote]

LZ我发一份给你 这个是我当年写的五子棋AI版
写了3种难度 1-简单版 2-困难版 3-专家版
2种模式 1-普通模式 可以选择难度和AI对战
2-挑战模式 AI会升级
AI 代码比较多 也算是比较全的AI了 楼主可以好好看看

代码你发到你邮箱了
蓝齐儿 2012-06-26
  • 打赏
  • 举报
回复
我之前就正好写了一个人工智能五子棋

计算机或者玩家每走一步,计算机都要准确的计算并且记录每个落子处的分数,只有这样改计算机下子的时候才能准确估量出往哪里下胜算比较大,或者是输的几率比较小。
下面我以(i,j)为例大概讲一下怎么计算分数。假设(i,j)上面没有下子即为空,并且该计算机下子了,这时候,如果说这时候win[0][]==1,则加分5,如果为2,则加分10,这样循环下去,如果等于5的话,就不用说了直接计算机获胜,至于为什么win[][]的值不一样,给的赋值也不一样,那是因为,win[][]的值越大,这时候计算机获胜的几率也就越大。
这样子计算计算机获胜的几率的同时,也要以同样的计算方法来计算玩家获胜的几率,然后再两个相比较一下,都取其最大值,最后选择胜算最大的一点下子。这就是人工智能的思路。


这是我的计算机决策的想法看看能不能帮到你
qq53465612 2012-04-17
  • 打赏
  • 举报
回复
求介绍此款软件[Quote=引用 21 楼 的回复:]
以前手上有个程序是五子棋的,无禁手的话,黑手百分百胜。电脑AI控制的。我的棋力一般,只是学校没对手。没胜过那个AI。
[/Quote]
DeDeWo 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 aaa20090987 的回复:]

想写五子棋AI的话,这里有一篇文章,将它实现就可以写出一个比较高水平的五子棋AI了(可以打败大部分业余选手)
地址:http://blog.csdn.net/aaa20090987/article/details/7068021
[/Quote]
我找到这篇帖子,只为说明一句,最重要的并不是递归了多少次,而是在于计算机的有策略的选择哪些位置落子,计算机的策略是程序员赋给它的,也就是程序员必须设置好计算机在递归几次后出现哪些棋型应该优先下哪一步,在递归数次后找到必赢点下是不可能的,除非玩家非常菜(若是玩家非常菜,只需考虑一步就可击败他了)。看了这篇文章,我将以前写的AI重写了一遍,深搜40个位置(剪掉大部分),经过多次测试,发现搜索2层(其中包括枚举并模拟玩家思考,这里也是暴利搜索,加上已有的策略算是预测3步)是最优的。搜索的深度越深,棋力大大减弱,后面我发现了原因,深搜的时候并不能找到必赢点边返回,不管是成5还是活4,都应该只是赋与权值,对于每一层每一种棋型都应该赋予权值,而不是简单的搜索,如果搜索的层数很深,那么中间的赋值策略非常复杂,并不仅仅是程序上的实现,而是你对五子棋有非常深的研究,否则写不出能下赢中级棋手的五子棋AI,不知写这篇文章的作者写的五子棋的棋力如何?期待指教
tfzxyinhao 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 aaa20090987 的回复:]

想写五子棋AI的话,这里有一篇文章,将它实现就可以写出一个比较高水平的五子棋AI了(可以打败大部分业余选手)
地址:http://blog.csdn.net/aaa20090987/article/details/7068021
[/Quote]看看先
AAA20090987 2012-02-28
  • 打赏
  • 举报
回复
想写五子棋AI的话,这里有一篇文章,将它实现就可以写出一个比较高水平的五子棋AI了(可以打败大部分业余选手)
地址:http://blog.csdn.net/aaa20090987/article/details/7068021
nuptxxp 2012-02-27
  • 打赏
  • 举报
回复
讨论了这么久,有人能给出一个简单AI的算法思路吗?
DeDeWo 2012-02-27
  • 打赏
  • 举报
回复
寒假在家没网很郁闷我就写了一个,很简单,无禁手,计算机执黑先下(这个你懂的),这是文章的地址,后面有源码的下载地址,前50盘我赢了6盘,后面每十盘我最多输1盘,只要你细心下棋的话就会发现这个AI不是你的对手,有时间还想用高级一点的博弈算法重新写AI,http://blog.csdn.net/aihahaheihei/article/details/7276338
tfzxyinhao 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 kingdomxbtx 的回复:]

用经典的A星算法,设定权值,然后设定一个搜索树的最大层数,就可以了。
[/Quote]这里不需要寻路啊,再说了 我还要考虑相邻的两子之间是否有子,是谁的子,A星在这里没用
kingdomxbtx 2012-02-13
  • 打赏
  • 举报
回复
用经典的A星算法,设定权值,然后设定一个搜索树的最大层数,就可以了。
tfzxyinhao 2012-02-13
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 xdxiaofeng 的回复:]

我原来也做过五子棋的项目,还做过象棋,在嵌入式设备里面实现的。

你的思考方向有点问题。
你如果要实现AI,请看看博弈树的内容,代码实现的时候用交叉递归http://www.dzsc.com/dzbbs/20051125/200765201046390265.html。

像你这样的思路的话,能搜索的深度太浅,棋力肯定不高。
[/Quote]不会吧 我觉得我所有情况都考虑到了 不过目前只是第一层搜索而已 如果把第一层做完了 其他的就好说了,如果第一层做好了 基本是无敌的(先下)
Fenice 2012-02-10
  • 打赏
  • 举报
回复
怎么能用IF嵌套呢,应该写一棵查找树
帖子不能编辑 2012-02-09
  • 打赏
  • 举报
回复
我原来也做过五子棋的项目,还做过象棋,在嵌入式设备里面实现的。

你的思考方向有点问题。
你如果要实现AI,请看看博弈树的内容,代码实现的时候用交叉递归http://www.dzsc.com/dzbbs/20051125/200765201046390265.html。

像你这样的思路的话,能搜索的深度太浅,棋力肯定不高。
yaoweijq 2012-01-29
  • 打赏
  • 举报
回复
+1
另外各种开局+黑33禁手
3手交换5手两打
......
[Quote=引用 21 楼 wide288 的回复:]
以前手上有个程序是五子棋的,无禁手的话,黑手百分百胜。电脑AI控制的。我的棋力一般,只是学校没对手。没胜过那个AI。
[/Quote]
wide288 2012-01-29
  • 打赏
  • 举报
回复
以前手上有个程序是五子棋的,无禁手的话,黑手百分百胜。电脑AI控制的。我的棋力一般,只是学校没对手。没胜过那个AI。
超级大笨狼 2012-01-25
  • 打赏
  • 举报
回复
考虑下位运算?

21个点的话,int32足够表示一行
(21行+21列+2*21斜)*2黑白=168个整数,一维数组存储就可以
用冗余的数字来存储相应信息。
二进制代表黑或白棋子是否存在
判断连通,用模板去与运算就可以。

不过这样做有什么好处,我还没想通。
zhaopeng2511 2012-01-24
  • 打赏
  • 举报
回复
//这里给你个大体思路吧

int a[N][N]={0}; // 棋盘

struct chess // 棋子
{
int x;
int y; // x,y表示当前坐标的位置
int bw; // 1表示白棋准备落子,2表示黑棋落子,无棋为0
int IsWin; // 是否胜出……
// int oldX;
// int oldY; // 落子前保存上次落子的x,y坐标,即另一方上次落子坐标
}chess;

int IsWin(int x,int y) //判断输赢函数
{
int i;
int n0,n1; //用来统计子数
int x0,y0,x1,y1;

for(i=0;i<4;i++)
{
n0=n1=0;
switch(i)
{
case 0: //统计横向棋子数
for(x0=x+1,y0=y;x0<N&&a[x0][y0]==a[x][y];x0++)
n0++;
for(x1=x-1,y1=y;x1>=0&&a[x1][y1]==a[x][y];x1--)
n1++;
break;
case 1: //纵向
for(x0=x,y0=y-1;y0>=0&&a[x0][y0]==a[x][y];y0--)
n0++;
for(x1=x,y1=y+1;y1<N&&a[x1][y1]==a[x][y];y1++)
n1++;
break;
case 2: //斜下
for(x0=x-1,y0=y-1;y0>=0&&x0>=0&&a[x0][y0]==a[x][y];x0--,y0--)
n0++;
for(x1=x+1,y1=y+1;x1<N&&y1<N&&a[x1][y1]==a[x][y]);x1++,y1++)
n1++;
break;
case 3: //斜上
for(x0=x-1,y0=y+1;y0<N&&x0>=0&&a[x0][y0]==a[x][y];x0--,y0++)
n0++;
for(x1=x+1,y1=y-1;x1<N&&y1>=0&&a[x1][y1]==a[x][y]);x1++,y1--)
n1++;
break;
}
if(n0+n1>=4) //判断棋子是否满5,要包落子a[x][y]
break;
}
if(n0+n1>=4)
return 1;
else
return 0;
}


if(a[chess.x][chess.y]==0) //判断是否能落子
chess.IsWin=IsWin(chess.x,chess.y); //判断输赢……
else
{}

if(chess.IsWin) //根据输赢来进行相应操作……
{}
else
chess.bw^=1; // 换另一方走棋

//备注:剩下的就是界面实现及键盘操作响应了,自己完成吧,还有按方向键chess的x,y坐标也相应变化,时间有限 ,想再详细的话那就是我写的了,而不是你写,这里就给你列个大冈吧。自己慢慢写,多想想……
zhaopeng2511 2012-01-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 tfzxyinhao 的回复:]

引用 16 楼 zhaopeng2511 的回复:

C/C++ code
//这里给你个大体思路吧

int a[N][N]={0}; // 棋盘

struct chess // 棋子
{
int x;
int y; // x,y表示当前坐标的位置
int bw; // 1表示白棋准备落子,2表示黑棋落子,无棋为0
i……
[/Quote]

五子棋还要考虑中间有间格的情况吗?我怎么不道有这种规则呀,真有的话那也没办法,你就一个case和个case的情况加下去吧,也不是很难,稍增加修改一下就行,写不来的话到时我可以帮你试试……
加载更多回复(16)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧