文档介绍:五子棋人工智能算法及其实现
摘要:
五子棋游戏以其优秀的人工智能深受广大玩家的喜爱,而对于初步探究人工智能的编程爱好者来说,编制五子棋程序因其规则简单而大受欢迎,然而它却要求程序员对五子棋规则有相当深入的了解。程序员考虑得越周到,其五子棋程序就越智能。
五子棋游戏软件设计的主要内容是:根据五子棋的基本规则,要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一个可能落子的点分别计算其重要程度,也就是该点的分值,然后通览全盘随机选出数值最大的一点,因为有时候分值最大的一点可能不止一个,计算机随机选择分值最大的一点,可以保证它在每盘棋中选择的落子点的位置有所不同,因此玩家不会用同一种棋局反复赢计算机。
本文论述了采用数值搜索法的人机对弈五子棋程序的分析与设计,并采用面向对象的开发工具VC++来具体实现。
关键词:五子棋,AI,VC++,面向对象
前言
曾几何,游戏成为千万家长心中恶魔!千万人欲食之而后快!无法否认,游戏,特别是网游带来了太多不健康的负面影响。最厉害的是沉迷于其中,它使无数的人,尤其是青少年浪费了金钱,更浪费了自己宝贵的时间,致使游戏影响到正常的生活。对于关心网迷的我,也曾听说过有人因盗窃他人游戏物品而被打的血流不止;也曾和无数少年一样,午夜依旧留恋在网吧里面;也会因此和家人、老师闹的不开心。事实上,这不是游戏的错,也不是游戏代理商的错,这是玩家的错,是玩家的心态问题,游戏就像是一个清水,你放点墨汁就是黑,你放点丹朱就是红。事实上,游戏的解除疲劳的作用非常明显,我写这个程序就是为广大没联上网的朋友娱乐奉献绵薄之力。对于五子棋的对战程序,互联网上有不少。例如,腾讯的QQ游戏、联众游戏等。但是这些多是人和人的对战,缺少人和计算机对战的。开发人机对战,有利于我们更加深入了解人工智能的意义。以及对算法的研究。
正文
为什么要开发一个五子棋人机对战程序?
随着个人计算机的普遍,越来越多的人和家庭有计算机了。对于任何一个计算机使用者来说,游戏是必不可少的,它不紧可以益智,还可以使人放松。而五子棋人机对战程序就是这样一个游戏。
开发一个人机对战游戏有什么现实意义?
虽然网上的五子棋程序很多,但是大多没有人工智能的人人对战,对于没有入网的计算机,这个程序将会成为他的解除疲劳,轻松娱乐的好游戏。通过对该游戏的研究,加深对人工智能的认识和对算法的研究。
为什么要选用Visual c++ ?
Visual c++ ,是一种面向对象的程序设计工具。Vc包含大量的控件,这些控件可用于界面设计和实现各种功能,从而大大减少程序员的工作量,同时也简化了工作截面的设计过程,从而提高程序的实用性和可靠性。
主程序设计过程概要
启动Visual C++ 选择新建MFC AppWizard(exe)工程并将工程命名为chess。
选择基于对话框的运用程序类型,点Finish.
在resourceview视图中,新建一个菜单栏并将菜单栏的ID命名为IDR_MAINMENU
在resourceview视图,插入Bitmap并将图片与IDB名字一一对应
将DIALOG中的IDD_ABOUTBOX设置成
现在我们将切换到classview视图,往程序中添加代码了。
主程序设计算法概要
在本次“五子棋“程序的编写中,只编写了人机对弈部分,运用了博弈树进行搜索,在选取最优的走步时使用极大极小分析法,考虑到搜索的时间复杂度和空间复杂度,在程序中只进行了2步搜索,即计算机在考虑下一步的走法时,只对玩家进行一步的推测。(程序中的棋盘规格为15*15)
下面对具体做法进行描述:
1. 数据结构定义:
棋盘定义:int board[15][15];
在15*15的棋盘上,获胜的情况总共有572种,
在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为15*15。
(1)计算水平方向的获胜组合数,每一列的获胜组合是:11,共15列,所以水平方向的获胜组合数为:11*15=165
(2)计算垂直方向的获胜组合总数,每一行的获胜组合是:11,共15行,则垂直方向的获胜组合数为:11*15=165
(3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为11+(10+9+……+2+1)*2=121
(4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为11+(10+9+……+2+1)*2=121,这样所有的获胜组合数为:165+165+121+121=572
计算机和玩家的获胜组合情况bool ctable[15][15][572],
bool ptable[15