迷宫游戏设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能与专家系统
课程设计
---------迷宫游戏
目录
序言-------------------------------------------------------------3
算法详解-------------------------------------------------------3
程序代码内容与说明
程序各个全局变量的声明---------------------------------7
主体程序的实现----------------------------------------------8
执行结果演示------------------------------------------------15
设计心得体会------------------------------------------------17
参考书目------------------------------------------------------17
附录:程序源代码------------------------------------------18
序言
“人工智能”也就是所谓的AI(artifical intelligence),它是一门抽象的技术,人工智能程序的编写不需要遵循任何即定的思考模式或者规则,而游戏中的AI完全按照程序员自己
的思考逻辑而发展。这就是说,程序员越是聪明越是能够写出更为精明的计算机人工智能程序,这和程序员自身的条件有着很大的关系。如果对于一个很陌生不熟悉的游戏领域,程序员从来没有接触过,这样即使有很高的编程水平,也没有办法实现我们想要达到的目标,根本不可能在游戏中将所有的情况包罗其中。
人工智能具有特定的三种思考模式,分别为移动模式,行为模式和策略模式。顾名思义,给定一个物体移动路径的公式,物体按照这样的公式来移动的就是移动模式。这种情况很多见,例如:某个物体追着玩家跑,目标射击等等。它又可以分为固定模式移动,追逐移动,躲避移动。策略型人工智能是AI中比较复杂的一种,最常见的运用策略型AI游戏是棋盘类的游戏,通常计算机必须判断目前情况下所有可走的棋步和可能获胜的情况,并计算目前计算机可走棋步的制胜分数或者是玩家可走棋步的制胜分数,最后决定出最佳的走法。行为型AI在游戏中是经常会运用到的,它的主要意义是物体会随着情况的改变来做出一些行为动作,而这些物体可以是游戏中的主角、怪物或者是四周环境中的物品。
而此次迷宫游戏的设计也是属于人工智能中的行为模式。
算法详解
路径搜寻的概念
路径搜寻与行为型人工智能有直接的关系。在迷宫游戏中,涉及路径搜寻时必须设定物体的一些走出迷宫的法则。如前面有路时就往前走,前面的路走过就往没走过的地方走等。这些法则必须确实可以让物体搜索迷宫中的每一块区域来找到出口,若走迷宫的法则设定得不完整,那么物体就有可能在同一个地方兜圈子,永远找不到出口了。
此外,为了让物体在走出迷宫后能知道正确走出迷宫的路径,必须给物体一张地图来记录所走过的路径,这张图就是一个链表结构,当物体成功走出迷宫后,整个链表就是正确走出迷宫的路径。如图1所示
图 1
图1中,实线部分为小球走迷宫的最短路径,依照走迷宫的规则每移动到新一格时,该区域就被增加到链表中,而当走过的区域并非正确路径时(图中虚线部分),则从链表中删除。例如:上图中虚线部分为小球所走过的区域,但小球进入该区域后发现是死路,因此必须倒退,每倒退一格时,就表示该格不是正确路径,因此从链表中删除;最后,当小球走出迷宫后,正确路径便会记录在链表中。
●搜寻最佳路径
在这个迷宫路径搜寻的程序中,我以一颗小球来走迷宫,小球会自动搜寻到迷宫的入口,接着自动找寻出口,当找到出口后便记录着正确走出迷宫的路径,按[F2]键察看此最短路径。
●定义迷宫的方式
使用一个整数的二维数组maze[8][8]来存储整个迷宫的状态。如图2
入口
出口
图 2
定义数组时,设定出口元素值为3,入口的元素值为2,墙元素值为1,通道的元素值为0。图2中,代表入口的数组元素为maze[0][1],同时,以变量m,n分别代表数组一维与二维的索引值,具体如下所示:
maze[m][n]=3 // 出口
maze[m][n]=2 // 入口
maze[m][n]=1 // 墙
maze[m][n]=0 // 通道
●双向链表的使用
在程序中我使用双向链表记录小球所走过的路径,结构定义如下:
struct list //定义链表结构
{
int m;
int n;
struct list*next; //指向下一结点
struct list*back; //指向前一个结点
};
typedef struct list node; //定义结点
typedef mode*pointer; //定义动态指针
当小球走迷宫时,主要王没有走过的格子走,程序使用一个二维的布尔数组pass[8][8]来记录格子是否走过,小球走向未走过的格子时,这一格会被加到链表里,而当小球走到其上、下、左、右有墙或者都已经走过的格子时,此时必须倒退,而每倒退一格就表示那一格是错误的格,因此将其从链表中删除,直到最后走出迷宫时,链表中每一结点便是正确的行进路线。如图3:
图3
图中,虚线部分是小球所走过的错误路径,在走进错误区域后,都是死路。因此小球必须沿原先进入的路径后退。在后退后,原先加到链表中的错误结点也会同时从链表中删除,而后退到有其他未走过的格子可以走时,就往那一个格子前进,最后找到出口后,正确的行进路线的结点便记录在链表中。
●走迷宫的规则
✧先试着往下走,若下一格有墙或者走过,则试着往右走
✧若右一格有墙或者走过,则试着往左走
✧若左一格有墙或者走过,则试着往上走
✧若上一个有墙或者走过,此时表示上、下、左、右都有未走过的格,便必须往后退,
回到上一结点位置并删除目前结点
以下列出依各条规则所设定出的算法: