人工智能课程设计.doc

上传人:精*** 文档编号:864717 上传时间:2023-10-02 格式:DOC 页数:20 大小:82.87KB
下载 相关 举报
人工智能课程设计.doc_第1页
第1页 / 共20页
人工智能课程设计.doc_第2页
第2页 / 共20页
人工智能课程设计.doc_第3页
第3页 / 共20页
人工智能课程设计.doc_第4页
第4页 / 共20页
人工智能课程设计.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、人工智能课程设计 -五子棋一引言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七参考文献20一引言人工智能也就是所谓的AI(ArtificialIntelligence),它是一门很抽象的技术,AI程序的编写不需要依据任何既定的思考模式或者规则。尤其是游戏中的AI可以完全依程序设计者本身的思考逻辑制作。我个人认为人

2、工智能的核心应该是使计算机具有自动的处理事件的能力,而我们的所有的研究也应该围绕着这一方向。我们今天讨论的是策略类的人工智能。 策略类人工智能可以说是AI中比较复杂的一种,最常见的策略类AI游戏就是棋盘式游戏。在这类游戏中,通常的策略类AI程序都是使计算机判断目前状况下所有可走的棋与可能的获胜状况,并计算当前计算机可走棋步的获胜分数或者玩家可走棋步的获胜分数,然后再决定出一个最佳走法。下面我们先介绍一下五子棋的AI构想。 1.1五子棋简介下面就五子棋的背景和规则做一些简单的介绍。五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Goban

3、g”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。五子棋的规则如下:棋盘:采用同围棋盘一样的15 路或19 路线的棋盘,为了减小问题的规模,本系统将采用15 路线的

4、棋盘。下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。无子的交叉点又被称为空点。输赢判断:黑、白双方有一方的5个棋子在横、竖或斜方向上连接成一线即为该方赢。1.2五子棋的AI构想在由AI所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率。一个完整的五子棋的AI构想必须:1、能够知道所有的获胜组合2、建立和使用获胜表3、设定获胜的分数4、使电脑具有攻击和防守的能力 (一),求五子棋的获胜组合 在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为10*10: 1、

5、计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:6*10=60 2、计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:6*10=60 3、计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 4、计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36 这样所有的获胜组合数为:60+60+36+36=192 (二)、建立和使用获胜表 我们已经计算出了一个10*10的五子棋盘会有192种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要

6、作用是:1、判断当前的获胜方式是否有效;2、判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 (三)、分数的设定 在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 原理:我们判定当前讨论的空格与当前讨论的点有几种获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 这种决策有一些缺陷,因为如果只根据这个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的

7、获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 (四)、攻击与防守 以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 事实上,这个AI构想是很强大的如果你不是很厉害的五子棋高

8、手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。二.开发工具可行性分析本程序采用开发工具它是Visual B的简称。提到,就不能不先提一下Visual Basic是Windows环境下的一种简单、易学的编程语言,由于其开发程序的快速、高效,深受程序员的喜爱。VB.NET的特点:1、真正成为面向对象以及支持继承性的语言。2、窗体设计器支持可视化继承,并且包含了许多新的特性,比如自动改变窗体大小、资源本地化支持、数据类工具内在支持XML数据。3、直接建立在.NET的框架结构上,因此开发人员可以充分利用所有.NET平台特性,也可以与其他的.NET语言交互。

9、4、为Windows应用程序提供了XCOPY部署,开发者不再需要为DLL的版本问题担忧。 三需求分析 人工智能的第一大成就是下棋程序,在下棋程度中应用的某些技术,如向前看几步,把困难的问题分解成一些较容易的子问题,发展成为搜索和问题归纳这样的人工智能基本技术。今天的计算机程序已能够达到下各种方盘棋和国际象棋的锦标赛水平。但是,尚未解决包括人类棋手具有的但尚不能明确表达的能力。如国际象棋大师们洞察棋局的能力。另一个问题是涉及问题的原概念,在人工智能中叫问题表示的选择,人们常能找到某种思考问题的方法,从而使求解变易而解决该问题。到目前为止,人工智能程序已能知道如何考虑它们要解决的问题,即搜索解答空

10、间,寻找较优解答。 在设计本系统时考虑到用户需要的是一个操作简便界面简单的游戏软件。同时要提供人机和人人这样的功能。特别是人机部分,要考虑到不同级别的用户。电脑智能不能太低需要有一定的智能下棋功能。 人机对战:选择和电脑对弈的等级操作,同样也可以执行网络联机的悔棋等功能,只是因为是人机所以无需通过确认。四程序设计游戏中提供两种选择模式:人机对战和人人对战。在人机对战中玩家通过选择不同的等级和电脑一决高下,可以向后悔棋。在人人对战中双方通过选择一方作为服务器,通过弹出对话框设置本地应用程序监听端口,而另外一方则作为客户端,通过连接服务器选项,在弹出的对话框中设置要连接的服务器的IP地址和端口号。

11、当双方都提示连接成功后,两方才可以进行下棋。如要悔棋则需要通过对方的同意。同时还可以实现在线聊天。AI的不同等级是以不同的搜索深度确定的。4.1程序设计特点五子棋游戏程序由于规则简单操作简便等特点,自然就成为程序员对人工智能研究的首选对象。所以网络上关于这类的程序很多,但是由于主要都是采用搜索穷举技术作为解决方案,这将使得问题的规模变的很庞大如当搜索深度为3时,每走一步电脑在将最坏的情况下需要搜索的点将达225*225*225=11390625个。即使采用的剪枝技术,其某些点的响应的时间也是让人无法忍受的,如开局时,因为这个时候每个点都是空的,没有可以剪枝的点,必须遍历真个盘面,所以很耗时间,

12、大约需要30多秒的时间,这个显然是不可接受的。为了程序设计和玩家的忍受时间的需要。不得不减小深度,所以绝大部分都采用深度为2的检索,很明显深度越低系统的智力也相对的降低,需要代价的。本程序的一个主要特点是,采用了高效的优化方法,使得在相同的搜索规模中所花费的计算时间大幅度的减小。响应时间明显得到提高。即使搜索深度达到4的时候,其响应时间在绝大部分的情况下还是可以接受的。4.2.程序总体设计结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用

13、层次图或结构图描绘软件的结构。1、系统模型主界面用户选择操作 调用系统功能单机模式2、结构图初级模块人机模块界面模块中级模块用户高级模块五代码分析这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。下面对该次设计中的主要代码进行做个分析:5.1 初始化赋值系统Subinitplayenvironment() player.FileName=.musiczhyu01.mid player.Play() theplayflag=True /游戏有效 Label1.

14、Visible=False /游戏状态标签不显示 PictureBox1.Refresh() /清空picturebox1的内容 yuandian(130,130) /调用绘图函数绘制当前电脑先走的位置 Dimi,j,m,nAsInteger Fori=0To9 Forj=0To9 table(i,j)=0 Next Next /桌面初始化 Fori=0To191 pflag(i)=True cflag(i)=True Next /获胜标志初始化 table(4,4)=1 /由于我们设定电脑先手,并下了4,4位所以将其值设为1 5.2初始化获胜组合n=0 Fori=0To9 Forj=0To5

15、 Form=0To4 pwin(j+m,i,n)=True cwin(j+m,i,n)=True Next n=n+1 Next Next Fori=0To9 Forj=0To5 Form=0To4 pwin(i,j+m,n)=True cwin(i,j+m,n)=True Next n=n+1 Next Next Fori=0To5 Forj=0To5 Form=0To4 pwin(j+m,i+m,n)=True cwin(j+m,i+m,n)=True Next n=n+1 Next Next 5.3重新设定玩家的获胜标志由于电脑已下了4,4位所以我们需要重新设定玩家的获胜标志 Fori=

16、0To5 Forj=9To4Step-1 Form=0To4 pwin(j-m,i+m,n)=True cwin(j-m,i+m,n)=True Next n=n+1 Next Next Fori=0To191 Ifpwin(4,4,i)=TrueThen pflag(i)=False EndIf Next EndSub5.4处理鼠标事件 1、模块名称:themousedown 2、描述:此函数主要实行以下功能: (1)判定当前游戏标志是否有效。 (2)将实际坐标转化成虚拟坐标。 (3)绘制玩家的棋子。 (4)执行检查获胜函数。 (5)执行电脑算法函数。 Subthemousedown(ByV

17、alxAsInteger,ByValyAsInteger) Iftheplayflag=FalseThen ExitSub EndIf /检查游戏状态是否有效 Dimi,jAsInteger Dimzhx,zhyAsInteger zhx=Int(x-10)/30) zhy=Int(y-10)/30) Fori=0To9 Forj=0To9 Iftable(zhx,zhy);0Then ExitSub EndIf Next Next /检查当前鼠标点击的格子是否有效 DimmycolorAsColor DimgAsSystem.Drawing.Graphics g=PictureBox1.Cr

18、eateGraphics mycolor=Color.White Dimbrush1AsSystem.Drawing.Brush=NewSolidBrush(mycolor) g.FillEllipse(brush1,zhx*30+10,zhy*30+10,30,30) /绘制玩家的棋子 table(zhx,zhy)=2 Fori=0To191 Ifcwin(zhx,zhy,i)=TrueThen cflag(i)=False EndIf Next /重设电脑的获胜标志 checkwin() /检查当前玩家是否获胜 diannao() /调用电脑算法 EndSub 5.5 获胜检查算法1、模块

19、名称:checkwin 2、描述:此模块执行以下功能:(1)检查是否和棋。 (2)检查电脑是否获胜。 (3)检查玩家是否获胜。 Subcheckwin() Dimi,j,k,m,nAsInteger DimcaAsInteger DimpaAsInteger DimcnormalAsInteger=0 Fori=0To191 Ifcflag(i)=FalseThen cnormal=cnormal+1 EndIf Next Ifcnormal=190Then Label1.Visible=True Label1.Text=和棋,请重新开始! PictureBox1.Refresh() thep

20、layflag=False ExitSub EndIf /设定和棋规则 Fori=0To191 Ifcflag(i)=TrueThen ca=0 Forj=0To9 Fork=0To9 Iftable(j,k)=1Then Ifcwin(j,k,i)=TrueThen ca=ca+1 EndIf EndIf Next Next Ifca=5Then Label1.Visible=True Label1.Text=电脑获胜,请重新开始 PictureBox1.Refresh() theplayflag=False ExitSub EndIf EndIf Next /检查电脑是否获胜 Fori=0

21、To191 Ifpflag(i)=TrueThen pa=0 Forj=0To9 Fork=0To9 Iftable(j,k)=2Then Ifpwin(j,k,i)=TrueThen pa=pa+1EndIf EndIf Next Next Ifpa=5Then Label1.Visible=True Label1.Text=玩家获胜,请重新开始 PictureBox1.Refresh() theplayflag=False ExitSub EnEndIf Next /检查玩家是否获胜 EndSub5.6电脑算法(1)1、模块名称:diannao 2描述:此程序主要执行以下功能: (1)初始

22、化赋值系统。 (2)赋值加强算法。 (3)计算电脑和玩家的最佳攻击位。 (4)比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 (5)执行检查获胜函数。 Subdiannao() Dimi,j,k,m,nAsInteger DimdcAsInteger DimcabAsInteger DimpabAsInteger Fori=0To9 Forj=0To9 pscore(i,j)=0 cscore(i,j)=0 Next Next /初始化赋值数组 Fori=0To191 Ifcflag(i)=TrueThen cab=0 Forj=0To9 Fork=0To9 Iftable(j,k)=1Th

23、en Ifcwin(j,k,i)=TrueThen cab=cab+1 EndIf Next Next SelectCasecab Case3 Form=0To9 Forn=0To9 Iftable(m,n)=0Then Ifcwin(m,n,i)=TrueThen cscore(m,n)=cscore(m,n)+5 EndIf EndIf Next Next Case4 Form=0To9 Forn=0To9 Iftable(m,n)=0Then Ifcwin(m,n,i)=TrueThen yuandian(m*30+10,n*30+10) table(m,n)=1 Fordc=0To19

24、1 Ifpwin(m,n,dc)=TrueThen pflag(dc)=False checkwin() ExitSub EndIf Next EndIf EndIf Next Next EndSelect EndIf Next Fori=0To191 Ifpflag(i)=TrueThen pab=0 Forj=0To9 Fork=0To9 Iftable(j,k)=2Then Ifpwin(j,k,i)=TrueThen pab=pab+1 EndIf EndIf Next Next SelectCasepab Case3 Form=0To9 Forn=0To9 Iftable(m,n)=

25、0Then Ifpwin(m,n,i)=TrueThen pscore(m,n)=pscore(m,n)+30 EndIf EndIf Next Next Case4 Form=0To9 Forn=0To9 Iftable(m,n)=0Then Ifpwin(m,n,i)=TrueThen yuandian(m*30+10,n*30+10) table(m,n)=1 Fordc=0To191 Ifpwin(m,n,dc)=TrueThen pflag(dc)=False checkwin() ExitSub EndIf Next EndIf EndIf Next Next EndSelect

26、EndIf Next 5.7电脑算法(2)1、赋值系统Fori=0To191 Ifcflag(i)=TrueThen Forj=0To9 Fork=0To9 Iftable(j,k)=0Then Ifcwin(j,k,i)=TrueThen Form=0To9 Forn=0To9 Iftable(m,n)=1Then Ifcwin(m,n,i)=TrueThen cscore(j,k)=cscore(j,k)+1 EndIf EndIf Next Next EndIf EndIf Next Next EndIf Next Fori=0To191 Ifpflag(i)=TrueThen Forj

27、=0To9 Fork=0To9 Iftable(j,k)=0Then Ifpwin(j,k,i)=TrueThen Form=0To9 Forn=0To9 Iftable(m,n)=2Then Ifpwin(m,n,i)=TrueThen pscore(j,k)=pscore(j,k)+1 EndIf EndIf Next Next EndIf EndIf Next Next EndIf Next 2、分值比较算法Dima,b,c,dAsInteger DimcsAsInteger=0 DimpsAsInteger=0 Fori=0To9 Forj=0To9 Ifcscore(i,j);csT

28、hen cs=cscore(i,j) a=i b=j EndIf Next Next Fori=0To9 Forj=0To9 Ifpscore(i,j);psThen ps=pscore(i,j) c=i d=j EndIf Next Next Ifcs;psThen yuandian(a*30+10,b*30+10) table(a,b)=1 Fori=0To191 Ifpwin(a,b,i)=TrueThen pflag(i)=False EndIf Next Else yuandian(c*30+10,d*30+10) table(c,d)=1 Fori=0To191 Ifpwin(c,

29、d,i)=TrueThen pflag(i)=False EndIf Next EndIf checkwin() EndSub六心得体会这个课设题对我来说有一定的挑战性,因为我自己也不知道自己到底学到了一个什么样的境界。但可以肯定,这个课设题的要求绝对在我的能力范围以上。之所以选择这个题目是想逼着自己去查更多的资料,学到更多的东西。结果也确实是这样的,我在这次课设中学到了不少东西,也理解了许多原来不理解的东西。尽管做的并不是那么的完善。总结这次课设,我还是收获不少。虽然遇到了不少的问题,但是我都通过查阅资料把大部分问题都解决了,并且在跟同学的交流中也学到了一些他们的设计思路,也知道今后要加强哪些方面的知识。七参考文献(1) 人工智能研究方法及途径 熊才权 2005年第三期(2) 人工智能技术导论 廉师友 西安电子科技大学出版社 2007.8(3) 五子棋中的博弈智能设计 张海峰 2004 现代电子技术(4) 智能五子棋的设计与实现 严小卫 莫建文 1999第4期 广西师范大学学报:自然科学版20

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 课程设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922