【数字图像处理】带AI的井字棋游戏

来源:互联网 发布:下载打字的软件 编辑:程序博客网 时间:2024/05/17 01:38

源代码下载:http://download.csdn.net/detail/jsgaobiao/9464292


老师看了Alpha狗和李世石的比赛,一拍大腿就把作业题给改了。。。也是醉


Ø  【作业要求】

写一个matlab程序,完成一个人工智能任务

 

例如:

数学逻辑(幻方,汉诺塔,海盗分金,各种过河问题…)

棋类博弈(井字棋,奥赛罗,五子棋,象棋,围棋…)

文字游戏(微软小冰,吟诗作赋,对联猜谜…)

……

 

基本要求:

突出程序的智能特性(思考,推理,自学习…)

可以考虑简化的游戏规则(如小棋盘…)

如能和图像处理结合更佳…

总结策略的特色与不足…

 

Ø  【作业内容】

使用博弈树上的Negmax算法,加上Alpha-Beta剪枝,实现了井字棋游戏的AI。

井字棋游戏是一种简单的棋类游戏,在3*3的棋盘上,两人轮流下子,谁的棋子先连成3颗一条直线(可以横着、竖着、斜着),谁就赢了。

 

Ø  【作业思路】

一、          算法介绍

(1)    博弈树上的Negmax算法

使用博弈树搜索时,有一个假设,就是博弈双方都足够聪明,每次都会选择对自己最优的策略进行决策。

Negmax算法是基于MinMax算法进行的改进。MinMax算法中,对每种棋盘局面都有一个估价函数,对A方有利的估价为正数,对B方有利的估价为负数。因此,当A方落子时,必然会选择使得局面估价函数最大的一步,对应了Max;反之,当B方落子时,必然会选择使得局面估价函数最大的一步,对应了Min。

而Negmax算法是在博弈树搜索时,将每个子节点返回的估价值取相反数,再进行局面估价。这样,对于A和B而言,都是选择使得估价最大的一种取法,可以使得对于局面的处理方式保持统一。

(2)    估价函数

估价函数是算法中非常重要的一部分。我采用的估价函数是将所有空着的格子填充成当前玩家的棋子,并计算所有的行、列、对角线有多少连成3个的棋子,并将这些棋子的总个数作为估价值。如果某一方在当前局面下已经胜利,那么估价值设为无穷大(程序中使用一个很大的数值即可)。

(3)    可视化

 

我使用了plot函数来绘制棋盘和棋子,并加上了鼠标操作。

其中,棋盘是绘制了若干蓝色的直线,棋子是绘制了圆形,通过填充颜色来区分白子和黑子,实现方法如下:


鼠标的控制是在Userinput.m函数中实现的,我通过ginput()函数获取鼠标的坐标位置,并据此判断鼠标当前落在哪一个棋盘格子内,从而获取用户的落子位置。实现方式如下:

 

其中,需要注意的是,外层套了一个while(true)的循环,并在循环内检测鼠标位置是否落在棋盘区域内。这样可以保证用户在随意点击鼠标时,不会被误判为落子。

最后还有胜负和平局的判断:

 

Ø  【总结】

博弈树是很多二人对抗游戏都可以采用的一种AI决策方式,但是整棵博弈树的搜索所产生的状态空间是巨大的并且在时间和空间上难以承受的。

本次作业算法的一个特点就是采用了Negmax和Alpha-Beta剪枝,这样大大减少了博弈树的状态空间,可以使程序检测更多的状态,从而获得更优的决策方案。经过测试,人几乎赢不了这个井字棋的AI,也说明了该算法在井字棋的规则下已经足够优秀。

由于井字棋3*3的棋盘比较小,导致AI完全可以选择非常优的策略,所以有一点不足就是这个游戏的趣味性就会有些欠缺。如果扩大棋盘,或者改变一下规则,比如连成4子才算胜利等,可能会更有趣。

1 0