ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:243.02KB ,
资源ID:10312144      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10312144.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(人工智能与专家系统.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

人工智能与专家系统.docx

1、人工智能与专家系统 人工智能与专家系统课程设计-迷宫游戏序言-3算法详解-3程序代码内容与说明程序各个全局变量的声明-7 主体程序的实现-8执行结果演示-15设计心得体会-17参考书目-17附录:程序源代码-18序 言“人工智能”也就是所谓的AI(artifical intelligence),它是一门抽象的技术,人工智能程序的编写不需要遵循任何即定的思考模式或者规则,而游戏中的AI完全按照程序员自己的思考逻辑而发展。这就是说,程序员越是聪明越是能够写出更为精明的计算机人工智能程序,这和程序员自身的条件有着很大的关系。如果对于一个很陌生不熟悉的游戏领域,程序员从来没有接触过,这样即使有很高的编

2、程水平,也没有办法实现我们想要达到的目标,根本不可能在游戏中将所有的情况包罗其中。人工智能具有特定的三种思考模式,分别为移动模式,行为模式和策略模式。顾名思义,给定一个物体移动路径的公式,物体按照这样的公式来移动的就是移动模式。这种情况很多见,例如:某个物体追着玩家跑,目标射击等等。它又可以分为固定模式移动,追逐移动,躲避移动。策略型人工智能是AI中比较复杂的一种,最常见的运用策略型AI游戏是棋盘类的游戏,通常计算机必须判断目前情况下所有可走的棋步和可能获胜的情况,并计算目前计算机可走棋步的制胜分数或者是玩家可走棋步的制胜分数,最后决定出最佳的走法。行为型AI在游戏中是经常会运用到的,它的主要

3、意义是物体会随着情况的改变来做出一些行为动作,而这些物体可以是游戏中的主角、怪物或者是四周环境中的物品。而此次迷宫游戏的设计也是属于人工智能中的行为模式。算法详解路径搜寻的概念路径搜寻与行为型人工智能有直接的关系。在迷宫游戏中,涉及路径搜寻时必须设定物体的一些走出迷宫的法则。如前面有路时就往前走,前面的路走过就往没走过的地方走等。这些法则必须确实可以让物体搜索迷宫中的每一块区域来找到出口,若走迷宫的法则设定得不完整,那么物体就有可能在同一个地方兜圈子,永远找不到出口了。此外,为了让物体在走出迷宫后能知道正确走出迷宫的路径,必须给物体一张地图来记录所走过的路径,这张图就是一个链表结构,当物体成功

4、走出迷宫后,整个链表就是正确走出迷宫的路径。如图1所示 图 1图1中,实线部分为小球走迷宫的最短路径,依照走迷宫的规则每移动到新一格时,该区域就被增加到链表中,而当走过的区域并非正确路径时(图中虚线部分),则从链表中删除。例如:上图中虚线部分为小球所走过的区域,但小球进入该区域后发现是死路,因此必须倒退,每倒退一格时,就表示该格不是正确路径,因此从链表中删除;最后,当小球走出迷宫后,正确路径便会记录在链表中。搜寻最佳路径在这个迷宫路径搜寻的程序中,我以一颗小球来走迷宫,小球会自动搜寻到迷宫的入口,接着自动找寻出口,当找到出口后便记录着正确走出迷宫的路径,按F2键察看此最短路径。定义迷宫的方式使

5、用一个整数的二维数组maze88来存储整个迷宫的状态。如图2 出口 图 2定义数组时,设定出口元素值为3,入口的元素值为2,墙元素值为1,通道的元素值为0。图2中,代表入口的数组元素为maze01,同时,以变量m,n分别代表数组一维与二维的索引值,具体如下所示:mazemn=3 / 出口mazemn=2 / 入口mazemn=1 / 墙mazemn=0 / 通道双向链表的使用在程序中我使用双向链表记录小球所走过的路径,结构定义如下:struct list /定义链表结构 int m; int n; struct list*next; /指向下一结点 struct list*back; /指向前

6、一个结点; typedef struct list node; /定义结点 typedef mode*pointer; /定义动态指针当小球走迷宫时,主要王没有走过的格子走,程序使用一个二维的布尔数组pass88来记录格子是否走过,小球走向未走过的格子时,这一格会被加到链表里,而当小球走到其上、下、左、右有墙或者都已经走过的格子时,此时必须倒退,而每倒退一格就表示那一格是错误的格,因此将其从链表中删除,直到最后走出迷宫时,链表中每一结点便是正确的行进路线。如图3: 图3图中,虚线部分是小球所走过的错误路径,在走进错误区域后,都是死路。因此小球必须沿原先进入的路径后退。在后退后,原先加到链表中的

7、错误结点也会同时从链表中删除,而后退到有其他未走过的格子可以走时,就往那一个格子前进,最后找到出口后,正确的行进路线的结点便记录在链表中。走迷宫的规则先试着往下走,若下一格有墙或者走过,则试着往右走若右一格有墙或者走过,则试着往左走若左一格有墙或者走过,则试着往上走若上一个有墙或者走过,此时表示上、下、左、右都有未走过的格,便必须往后退,回到上一结点位置并删除目前结点以下列出依各条规则所设定出的算法:1)试图往下走的程序代码:if(下一格是墙)/*试图往右走的程序代码*/else if(下一格走过)/*试图往右走的程序代码*/else /往下走并新增结点2)试图往右走的程序代码:if(右一格是

8、墙)/*试图往左走的程序代码*/else if(右一格走过)/*试图往左走的程序代码*/else /往右走并新增结点3)试图往左走的程序代码:if(左一格是墙)/*试图往上走的程序代码*/else if(左一格走过)/*试图往上走的程序代码*/else /往左走并新增结点4)试图往上走的程序代码:if(上一格是墙)/回上一个结点并删除目前结点else if(上一格走过)/回上一个结点并删除目前结点else /往上走并新增结点将上面4组算法结合起来,就得到整个走迷宫的判断式结构了 程序内容说明: 本迷宫游戏的主要功能如下:程序执行式自动搜寻入口与出口按F1键可重新进行搜寻按F2键辉县是正确走迷宫

9、的路径若迷宫无出口,则搜寻结果会显示无出口的信息程序代码内容与说明一 程序各个全局变量的声明int maze88 = 1,1,1,1,1,1,1,1,2,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,1,3,1,1,1,1,1,1;BOOL pass88;int i,j,m,n,lastm,lastn;BOOL start= true,search= true,go;pointer ptr,preptr,first;char str10;说明:1)第1、

10、2行程序代码定义大小为88迷宫数组的内容,其中值为2与3的元素就是迷宫的入口与出口2)第3行程序代码定义一个pass数组,用来记录迷宫中各个格子是否走过,举例来说,若maze45走过,则pass45会被设定为true3)第4行程序代码定义的格个整数变量用途说明如下 变量名称 说明i 计数变量j 计数变量m 小球所在位置的第一个索引值n 小球所在位置的第二个索引值lastm 上一次小球所在位置的第一个索引值lastn 上一次小球所在位置的第二个索引值4)第5行程序代码所定义的3个布尔变量start、search、go分别用以表示程序开始,重新搜寻以及显示最短路径5)第6行程序代码定义了ptr、p

11、reptr与first动态指针,分别代表目前结点、上一个结点与第一个节点。二 主体程序的实现canvasFrame:canvasFrame() /*建立窗口与加载图文件的程序代码*/ for(i=0;i7;i+) for(j=0;jm = m; ptr-n = n; ptr-next = NULL; ptr-back = NULL; first = ptr;说明:1)第3-10行程序代码为一个双层循环,用来搜寻二位数组中,元素值为2的元素;第6-8行程序代码判断若找到了此元素,则结束循环,此时I与j的值便是代表迷宫入口的索引值2)第11、12行程序代码将i,j的值赋予给m、n,这是第一个链表结

12、点中所要存储的值3)第13行程序代码建立第一个节点的指针ptr,接着14、15行程序代码设定其中的成员变量m与n的值,第16、17行程序代码则将结点的前后指针指向NULL。如此,第一个结点结构如下:mnbacknext 其中结点的back指针是用以指向链表中的上一个结点,next指针则是指向下一个结点,如此便形成双向链表,而小球在走迷宫时才能够前进与后退4)第18行程序代码则设定first等于ptr,用来记录链表第一个结点的位置void canvasFrame:OnTimer(UINT nIDEvent) if(start) Start(); /开始搜寻 else if(search) Sea

13、rch(); /进行搜寻 if(go) Go(); /显示最短路径 CFrameWnd:OnTimer(nIDEvent);说明:在OnTimer函数中则是会依目前程序的状况来执行开始搜寻,显示最短路径等于自定义函数。程序于一开始进行搜寻时便会执行Start函数,将小球的图案显示于入口上。接下来每次进行搜寻而小球移动时,会执行Search函数,而当用户按下F2键时,则会调用Go函数来显示走出迷宫最短路径void canvasFrame:Start() CClientDC dc(this); mdc-SelectObject(tile); for(i=0;i=7;i+) for(j=0;jSel

14、ectObject(ball); dc.BitBlt(ptr-n*40,ptr-m*40,40,40,mdc,0,0,SRCCOPY); start = false; lastn = ptr-n; lastm = ptr-m;说明:1)在start函数中,第4-8行程序代码会先贴上迷宫中的墙。使用双层循环在条件式mazeij = 1成立时,则以左上角的贴图坐标(j*40,i*40,)来进行贴上墙的动作2)第10行程序代码则以ptr所指结点中m与n成员变量的值来计算贴图坐标,此时ptr所指结点为第一个结点,因此贴图后,小球会出现在迷宫入口位置上3)接下来第11行程序代码将start变量设定为fa

15、lse,第12、13行程序代码则将结点m与n的值记录在lastm与lastn中,以便下次执行OnTimer时可以覆盖掉前一次的贴图void canvasFrame:Search() CClientDC dc(this); mdc-SelectObject(tile); for(i=0;i=7;i+) for(j=0;jSelectObject(ball); lastn = ptr-n; lastm = ptr-m; if(mazem+1n=1) /下一格是墙 /*判断行进方向与变更链表内容的程序代码*/ else if(passm+1n) /下一格走过 if(mazemn+1 = 1) /右一

16、格是墙 if(mazemn-1 =1) /左一格是墙 if(mazem-1n = 1) /上一格是墙 if(ptr-back != NULL) ptr = ptr-back; free(ptr-next); ptr-next = NULL; m = ptr-m; n = ptr-n; else if(passm-1n) /上一格走过 if(ptr-back != NULL) ptr = ptr-back; free(ptr-next); ptr-next = NULL; m = ptr-m; n = ptr-n; else m-=1; /往上一格 ptr-next = (pointer)mal

17、loc(sizeof(node); ptr-next-m = m; ptr-next-n = n; preptr = ptr; ptr-next-next = NULL; passmn = true; ptr = ptr-next; ptr-back = preptr; else /*判断行进方向与变更链表内容的程序代码*/ else m+=1; /往下一格 ptr-next = (pointer)malloc(sizeof(node); ptr-next-m = m; ptr-next-n = n; preptr = ptr; ptr-next-next = NULL; passmn = t

18、rue; ptr = ptr-next; ptr-back = preptr; dc.BitBlt(lastn*40,lastm*40,40,40,mdc,0,0,WHITENESS); dc.BitBlt(ptr-n*40,ptr-m*40,40,40,mdc,0,0,SRCCOPY); if(ptr-back = NULL) dc.TextOut(120,320,找不到出口); search = false; if(mazemn = 3) dc.TextOut(120,320,找到出口); search = false; 说明:在search()函数中主要是进行迷宫出口的搜寻与小球的移动,

19、而当搜寻完毕后,便显示是否找到出口的信息1)第4-8行程序代码会先贴上迷宫中墙的部分2)第1214行程序代码则是路径搜寻的判断式,由于整个判断式内容相当冗长,在此仅列出部分来作说明3)第12行程序代码判断目前为止的下一个是否有墙,即mazem+1n是否等于1,如果有墙接下来的程序代码便试图往其他的方向走4)若目前位置的下方没有墙,此时第14行程序代码会以passm+1n是否为true来判断下一格走过或者没有走过。如果条件式成立,表示下一格走过,接下来的程序代码同样会试图往其他的方向走。倘若条件式不成立,表示下一格未走过,便执行第54-63行的程序代码,在链表中新增一个结点5)如果目前位置的下一

20、格走过且第15-17行程序代码都成立,就表示已走到了死路,小球必须往后退,也就是必须从链表中删除错误路径的结点。6)第19-26行程序代码进行删除结点的动作,第19行程序代码判断ptrback是否为NULL,若为NULL,则表示目前结点为链表的第一个结点,并不删除该结点;若目前结点不是第一个结点,便依底下图标过程来删除结点。执行第21行程序代码: NULL ptr ptr执行第22行程序代码: 释放其后面所指结点的存储单元ptr执行第23行程序代码: NULLptr第24、25行程序代码则依目前ptr所指的结点来重设m与n的值7)当有未走过的格子可走时,此时就必须在链表的最后加上代表新格子的结

21、点,如第40-51行与第53-64行的程序代码8)以第40-51行往上一动一格的程序代码为例,我们来说明加入新结点的方式,第42行程序代码将m值减1代表上一个格子,而新增结点的过程则如底下的图标所示。执行第43行程序代码: 新结点 ptr执行第44、45行程序代码: ptr执行第46行程序代码: ptr preptr执行第47行程序代码: NULL ptr preptr执行第49行程序代码: NULL preptr ptr 将ptr指向下一个结点 ptr执行第50行程序代码: NULL preptr ptr完成以上步骤之后,在链表中便新增一个结点,m与n的值则是代表新的一格在数组中的索引值,而

22、第48行程序代码是设定massmn为true,表示此格已走过9)第65行程序代码以上一次的m与n的值lastm和lastn来覆盖上一次的小球贴图,第66行程序代码则以目前结点的m与n值来贴上小球到所移动的格子上。10)第67行程序代码判断小球是否会到第一个结点,便表示这个迷宫没有出口,而第一个结点的back指针指向NULL,因此69行程序代码显示找不到出口的信息,并将Search设为false。11)在每次计算m与n值之后,若mazemn元素值为3,则表示小球移动到了定义为出口的地方,第72行判断式成立,接下来便显示找到出口的信息,同时将Search设定为false。void canvasFr

23、ame:Go() CClientDC dc(this); m = ptr-m; n = ptr-n; mdc-SelectObject(tile); for(i=0;i=7;i+) for(j=0;jSelectObject(ball); dc.BitBlt(n*40,m*40,40,40,mdc,0,0,SRCCOPY); if(mazemn = 3) dc.TextOut(120,320,最短路径); go = false; else ptr = ptr-next;说明:当用户按下F2键后便会将go变量设定为true,并将链表的指针移回第一个结点。OnTimer函数中就会不断地调用Go函数

24、来进行小球贴图显示正确走出迷宫的路径:1)第4、5行程序代码取出目前结点m与n的值2)第7-10行程序代码贴上迷宫中的墙3)第12行程序代码依m与n的值贴上小球图4)第13行判断式判断mazemn是否等于3,若等于3则表示已走到了出口,显示最短路径的信息,并将go设定为false;否则第19行程序代码将指针移到链表的下一个结点,已进行下一次小球的移动void canvasFrame:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) CClientDC dc(this); if(nChar = VK_ESCAPE) PostMessage(WM_C

25、LOSE); if(nChar = VK_F1) start = true; search = true; go = false; for(i=0;i=8;i+) /清空数组 for(j=0;jn*40,ptr-m*40,40,40,mdc,0,0,WHITENESS); while(ptr-back) /删除结点 ptr = ptr-back; free(ptr-next); ptr-next = NULL; m = ptr-m; n = ptr-n; if(nChar = VK_F2) if(ptr-back = NULL) dc.TextOut(120,320,此迷宫无出口); else ptr = first; /移动指针到第一个结点 go = true; search = false; CFrameWnd:OnKeyDown(nChar, nRepCnt, nFlags);OnKeyDown函数用于处理按下按键信息,用户可按下ESC键来结束程序,按F1键重新进行搜寻,按F2键显示走出迷宫的路径。说明:1)第7行程序代码判断若用户按下F1键,则将start、search变量设定为true,go变量设定为false,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1