1、1人工智能课程设计-五子棋姓 名: 徐 慧班 级:计 091(杏)学 号:0913023001指导老师:管致锦2一引言 31.1 五子棋简介 .31.2 五子棋的 AI 构想 .3二.开发工具可行性分析 5三需求分析 6四程序设计 64.1 程序设计特点 .64.2.程序总体设计 7五代码分析 85.1 初始化赋值系统 85.2 初始化获胜组合 .95.3 重新设定玩家的获胜标志 .95.4 处理鼠标事件 .105.5 获胜检查算法 125.6 电脑算法(1) .145.7 电脑算法(2) .17六心得体会 20七参考文献 203一引言人工智能也就是所谓的 AI(Artificial Inte
2、lligence),它是一门很抽象的技术,AI 程序的编写不需要依据任何既定的思考模式或者规则。尤其是游戏中的 AI可以完全依程序设计者本身的思考逻辑制作。我个人认为人工智能的核心应该是使计算机具有自动的处理事件的能力,而我们的所有的研究也应该围绕着这一方向。我们今天讨论的是策略类的人工智能。 策略类人工智能可以说是 AI 中比较复杂的一种,最常见的策略类 AI 游戏就是棋盘式游戏。在这类游戏中,通常的策略类 AI 程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。下面我们先介绍一下五子棋的 AI
3、 构想。 1.1 五子棋简介下面就五子棋的背景和规则做一些简单的介绍。五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠” ,英译为 “Renju”,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写) ,亦有“ 连五子 ”、 “五子连” 、 “串珠” 、 “五目”、 “五目碰” 、 “五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有
4、东方的神秘和西方的直观;既有“场 ”的概念,亦有 “点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋的规则如下:棋盘:采用同围棋盘一样的 15 路或 19 路线的棋盘,为了减小问题的规模,本系统将采用 15 路线的棋盘。下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。无子的交叉点又被称为空点。输赢判断:黑、白双方有一方的 5 个棋子在横、竖或斜方向上连接成一线即为该方赢。41.2 五子棋的 AI 构想在由 AI 所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率。一个完整的五子棋的 AI 构想必须:1、能
5、够知道所有的获胜组合2、建立和使用获胜表3、设定获胜的分数4、使电脑具有攻击和防守的能力 (一),求五子棋的获胜组合 在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为 10*10: 1、计算水平方向的获胜组合数,每一列的获胜组合是:6,共 10 列,所以水平方向的获胜组合数为:6*10=60 2、计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共 10 行,则垂直方向的获胜组合数为:6*10=60 3、计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 4、计算反对角线方向的获胜组合总数
6、,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 这样所有的获胜组合数为:60+60+36+36=192 (二)、建立和使用获胜表 我们已经计算出了一个 10*10 的五子棋盘会有 192 种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要作用是:1、判断当前的获胜方式是否有效;2、判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 (三)、分数的设定 5在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 原理:我们判定当前讨论的空格与当前讨论的点有几种
7、获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 这种决策有一些缺陷,因为如果只根据这个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 (四)、攻击与防守 以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置
8、。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 事实上,这个 AI 构想是很强大的如果你不是很厉害的五子棋高手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。二.开发工具可行性分析本程序采用 开发工具它是 Visual B 的简称。提到 ,就不能不先提一下 Visual Basic 是 Windows 环境下的一种简单、易学的编程语言,由于其开发程序的快速、高效,深受程序员的喜爱。VB.NET
9、 的特点:1、真正成为面向对象以及支持继承性的语言。2、窗体设计器支持可视化继承,并且包含了许多新的特性,比如自动改变窗体大小、资源本地化支持、数据类工具内在支持 XML 数据。63、直接建立在.NET 的框架结构上,因此开发人员可以充分利用所有.NET 平台特性,也可以与其他的.NET 语言交互。4、为 Windows 应用程序提供了 XCOPY 部署,开发者不再需要为 DLL 的版本问题担忧。 三需求分析人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。今天的计算机程序已能够达到下各
10、种方盘棋和国际象棋的锦标赛水平。但是,尚未解决包括人类棋手具有的但尚不能明确表达的能力。如国际象棋大师们洞察棋局的能力。另一个问题是涉及问题的原概念,在人工智能中叫问题表示的选择,人们常能找到某种思考问题的方法,从而使求解变易而解决该问题。到目前为止,人工智能程序已能知道如何考虑它们要解决的问题,即搜索解答空间,寻找较优解答。 在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件。同时要提供人机和人人这样的功能。特别是人机部分,要考虑到不同级别的用户。电脑智能不能太低需要有一定的智能下棋功能。人机对战:选择和电脑对弈的等级操作,同样也可以执行网络联机的悔棋等功能,只是因为是人机所以无
11、需通过确认。四程序设计游戏中提供两种选择模式:人机对战和人人对战。在人机对战中玩家通过选择不同的等级和电脑一决高下,可以向后悔棋。在人人对战中双方通过选择一方作为服务器,通过弹出对话框设置本地应用程序监听端口,而另外一方则作为客户端,通过连接服务器选项,在弹出的对话框中设置要连接的服务器的 IP地址和端口号。当双方都提示连接成功后,两方才可以进行下棋。如要悔棋则需要通过对方的同意。同时还可以实现在线聊天。AI 的不同等级是以不同的搜索深度确定的。4.1 程序设计特点7五子棋游戏程序由于规则简单操作简便等特点,自然就成为程序员对人工智能研究的首选对象。所以网络上关于这类的程序很多,但是由于主要都
12、是采用搜索穷举技术作为解决方案,这将使得问题的规模变的很庞大如当搜索深度为 3 时,每走一步电脑在将最坏的情况下需要搜索的点将达225*225*225=11390625 个。即使采用的剪枝技术,其某些点的响应的时间也是让人无法忍受的,如开局时,因为这个时候每个点都是空的,没有可以剪枝的点,必须遍历真个盘面,所以很耗时间,大约需要 30 多秒的时间,这个显然是不可接受的。为了程序设计和玩家的忍受时间的需要。不得不减小深度,所以绝大部分都采用深度为 2 的检索,很明显深度越低系统的智力也相对的降低,需要代价的。本程序的一个主要特点是,采用了高效的优化方法,使得在相同的搜索规模中所花费的计算时间大幅
13、度的减小。响应时间明显得到提高。即使搜索深度达到 4 的时候,其响应时间在绝大部分的情况下还是可以接受的。4.2.程序总体设计结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。1、系统模型选择操作调用单机模式系统功能用户 主界面82、结构图五代码分析这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根
14、据它们写出实际的程序代码。下面对该次设计中的主要代码进行做个分析:5.1 初始化赋值系统Sub initplayenvironment() player.FileName = “.musiczhyu01.mid“ player.Play() theplayflag = True /游戏有效 Label1.Visible = False /游戏状态标签不显示 PictureBox1.Refresh() /清空 picturebox1 的内容 yuandian(130, 130) /调用绘图函数绘制当前电脑先走的位置 Dim i, j, m, n As Integer For i = 0 To 9
15、 For j = 0 To 9 table(i, j) = 0 Next Next /桌面初始化 界面模块用户人机模块初级模块中级模块高级模块9For i = 0 To 191 pflag(i) = True cflag(i) = True Next /获胜标志初始化 table(4, 4) = 1 /由于我们设定电脑先手,并下了4,4 位所以将其值设为 1 5.2 初始化获胜组合 n = 0 For i = 0 To 9 For j = 0 To 5 For m = 0 To 4 pwin(j + m, i, n) = True cwin(j + m, i, n) = True Next n
16、 = n + 1 Next Next For i = 0 To 9 For j = 0 To 5 For m = 0 To 4 pwin(i, j + m, n) = True cwin(i, j + m, n) = True Next n = n + 1 Next Next For i = 0 To 5 For j = 0 To 5 For m = 0 To 4 pwin(j + m, i + m, n) = True cwin(j + m, i + m, n) = True Next n = n + 1 Next Next 105.3 重新设定玩家的获胜标志由于电脑已下了 4,4 位所以我
17、们需要重新设定玩家的获胜标志 For i = 0 To 5 For j = 9 To 4 Step -1 For m = 0 To 4 pwin(j - m, i + m, n) = True cwin(j - m, i + m, n) = True Next n = n + 1 Next Next For i = 0 To 191 If pwin(4, 4, i) = True Then pflag(i) = False End If Next End Sub5.4 处理鼠标事件 1、模块名称: themousedown 2、描述:此函数主要实行以下功能: (1)判定当前游戏标志是否有效。
18、(2)将实际坐标转化成虚拟坐标。 (3)绘制玩家的棋子。 (4)执行检查获胜函数。 (5)执行电脑算法函数。 Sub themousedown(ByVal x As Integer, ByVal y As Integer) If theplayflag = False Then 11Exit Sub End If /检查游戏状态是否有效 Dim i, j As Integer Dim zhx, zhy As Integer zhx = Int(x - 10) / 30) zhy = Int(y - 10) / 30) For i = 0 To 9 For j = 0 To 9 If table
19、(zhx, zhy) ; 0 Then Exit Sub End If Next Next /检查当前鼠标点击的格子是否有效 Dim mycolor As Color Dim g As System.Drawing.Graphics g = PictureBox1.CreateGraphics mycolor = Color.White Dim brush1 As System.Drawing.Brush = New SolidBrush(mycolor) g.FillEllipse(brush1, zhx * 30 + 10, zhy * 30 + 10, 30, 30) /绘制玩家的棋子
20、table(zhx, zhy) = 2 For i = 0 To 191 If cwin(zhx, zhy, i) = True Then cflag(i) = False End If Next 12/重设电脑的获胜标志 checkwin() /检查当前玩家是否获胜 diannao() /调用电脑算法 End Sub 5.5 获胜检查算法1、模块名称: checkwin 2、描述: 此模块执行以下功能:(1)检查是否和棋。 (2)检查电脑是否获胜。 (3)检查玩家是否获胜。 Sub checkwin() Dim i, j, k, m, n As Integer Dim ca As Integ
21、er Dim pa As Integer Dim cnormal As Integer = 0 For i = 0 To 191 If cflag(i) = False Then cnormal = cnormal + 1 End If Next If cnormal = 190 Then Label1.Visible = True Label1.Text = “和棋,请重新开始! “ PictureBox1.Refresh() theplayflag = False 13Exit Sub End If /设定和棋规则 For i = 0 To 191 If cflag(i) = True T
22、hen ca = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 1 Then If cwin(j, k, i) = True Then ca = ca + 1 End If End If Next Next If ca = 5 Then Label1.Visible = True Label1.Text = “电脑获胜, 请重新开始“ PictureBox1.Refresh() theplayflag = False Exit Sub End If End If Next /检查电脑是否获胜 For i = 0 To 191 If pflag
23、(i) = True Then pa = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 2 Then If pwin(j, k, i) = True Then pa = pa + 1End If End If Next Next If pa = 5 Then 14Label1.Visible = True Label1.Text = “玩家获胜 ,请重新开始“ PictureBox1.Refresh() theplayflag = False Exit Sub En End If Next /检查玩家是否获胜 End Sub5.6 电脑算法(
24、1)1、模块名称:diannao 2 描述: 此程序主要执行以下功能: (1)初始化赋值系统。 (2)赋值加强算法。 (3)计算电脑和玩家的最佳攻击位。 (4)比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 (5)执行检查获胜函数。 Sub diannao() Dim i, j, k, m, n As Integer Dim dc As Integer Dim cab As Integer Dim pab As Integer For i = 0 To 9 For j = 0 To 9 pscore(i, j) = 0 cscore(i, j) = 0 Next Next /初始化赋值数组
25、For i = 0 To 191 15If cflag(i) = True Then cab = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 1 Then If cwin(j, k, i) = True Then cab = cab + 1 End If Next Next Select Case cab Case 3 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If cwin(m, n, i) = True Then cscore(m, n) = cscore(m, n) +
26、 5 End If End If Next Next Case 4 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If cwin(m, n, i) = True Then yuandian(m * 30 + 10, n * 30 + 10) table(m, n) = 1 For dc = 0 To 191 If pwin(m, n, dc) = True Then 16pflag(dc) = False checkwin() Exit Sub End If Next End If End If Next Next End Sele
27、ct End If Next For i = 0 To 191 If pflag(i) = True Then pab = 0 For j = 0 To 9 For k = 0 To 9 If table(j, k) = 2 Then If pwin(j, k, i) = True Then pab = pab + 1 End If End If Next Next Select Case pab Case 3 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If pwin(m, n, i) = True Then 17pscore(
28、m, n) = pscore(m, n) + 30 End If End If Next Next Case 4 For m = 0 To 9 For n = 0 To 9 If table(m, n) = 0 Then If pwin(m, n, i) = True Then yuandian(m * 30 + 10, n * 30 + 10) table(m, n) = 1 For dc = 0 To 191 If pwin(m, n, dc) = True Then pflag(dc) = False checkwin() Exit Sub End If Next End If End
29、If Next Next End Select End If Next 5.7 电脑算法(2)1、赋值系统 18For i = 0 To 191 If cflag(i) = True Then For j = 0 To 9 For k = 0 To 9 If table(j, k) = 0 Then If cwin(j, k, i) = True Then For m = 0 To 9 For n = 0 To 9 If table(m, n) = 1 Then If cwin(m, n, i) = True Then cscore(j, k) = cscore(j, k) + 1 End I
30、f End If Next Next End If End If Next Next End If Next For i = 0 To 191 If pflag(i) = True Then For j = 0 To 9 For k = 0 To 9 If table(j, k) = 0 Then If pwin(j, k, i) = True Then For m = 0 To 9 For n = 0 To 9 If table(m, n) = 2 Then 19If pwin(m, n, i) = True Then pscore(j, k) = pscore(j, k) + 1 End
31、If End If Next Next End If End If Next Next End If Next 2、分值比较算法 Dim a, b, c, d As Integer Dim cs As Integer = 0 Dim ps As Integer = 0 For i = 0 To 9 For j = 0 To 9 If cscore(i, j) ; cs Then cs = cscore(i, j) a = i b = j End If Next Next For i = 0 To 9 For j = 0 To 9 If pscore(i, j) ; ps Then ps = p
32、score(i, j) c = i 20d = j End If Next Next If cs ; ps Then yuandian(a * 30 + 10, b * 30 + 10) table(a, b) = 1 For i = 0 To 191 If pwin(a, b, i) = True Then pflag(i) = False End If Next Else yuandian(c * 30 + 10, d * 30 + 10) table(c, d) = 1 For i = 0 To 191 If pwin(c, d, i) = True Then pflag(i) = Fa
33、lse End If Next End If checkwin() End Sub六心得体会这个课设题对我来说有一定的挑战性,因为我自己也不知道自己到底学到了一个什么样的境界。但可以肯定,这个课设题的要求绝对在我的能力范围以上。之所以选择这个题目是想逼着自己去查更多的资料,学到更多的东西。结果也确实是这样的,我在这次课设中学到了不少东西,也理解了许多原来不理解的东西。尽管做的并不是那么的完善。21总结这次课设,我还是收获不少。虽然遇到了不少的问题,但是我都通过查阅资料把大部分问题都解决了,并且在跟同学的交流中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。七参考文献(1) 人工智能研究方法及途径 熊才权 2005 年第三期(2) 人工智能技术导论 廉师友 西安电子科技大学出版社 2007.8(3) 五子棋中的博弈智能设计 张海峰 2004 现代电子技术(4) 智能五子棋的设计与实现 严小卫 莫建文 1999 第 4 期 广西师范大学学报:自然科学版