迷宫游戏的设计与实现论文.docx

上传人:b****3 文档编号:27142122 上传时间:2023-06-27 格式:DOCX 页数:43 大小:125.68KB
下载 相关 举报
迷宫游戏的设计与实现论文.docx_第1页
第1页 / 共43页
迷宫游戏的设计与实现论文.docx_第2页
第2页 / 共43页
迷宫游戏的设计与实现论文.docx_第3页
第3页 / 共43页
迷宫游戏的设计与实现论文.docx_第4页
第4页 / 共43页
迷宫游戏的设计与实现论文.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

迷宫游戏的设计与实现论文.docx

《迷宫游戏的设计与实现论文.docx》由会员分享,可在线阅读,更多相关《迷宫游戏的设计与实现论文.docx(43页珍藏版)》请在冰豆网上搜索。

迷宫游戏的设计与实现论文.docx

迷宫游戏的设计与实现论文

迷宫游戏的设计与实现

摘要设计和实现的迷宫游戏是在VC环境下用C语言编写的,主要是设计迷宫有一个入口和一个出口,游戏者在进入迷宫后,只能从出口出去,否则失败,该程序支持键盘操作,迷宫大小是由游戏者来确定的,可以自动随机的生成迷宫地图,迷宫游戏设计了一个视野窗口,可以支持游戏者漫游到视野范围外的迷宫,游戏者可以从左侧的入口进去,在右下侧的出口退出,遇到墙壁,则游戏者不能通过。

游戏者在迷宫中探索出口的过程中可以使用上,下,左,右键这几个键手动的搜索迷宫的出口。

迷宫的地图是使用绘图函数显示在屏幕上的,是调用easyX函数库来实现的,所以本文最重要的一个部分就是在介绍屏幕显示下的图形模式,和在这种模式下,所调用的一些绘图函数。

 

关键词:

迷宫;回溯;绘图函数

 

Abstract:

DesignandimplementationofthemazegamewritteninCintheVCenvironmentismainlydesignedmazehasoneentranceandoneexit,afterenteringthemaze,theplayercanonlyexit,orelsefail,theprogramsupportskeyboardoperation,mazesizeisdeterminedbytheplayerautomaticallyrandomlygeneratedmazemap,mazegame,designavisionwindow,theplayercansupportroamingtothefieldofviewoutsideofthemaze,theplayercangofromtheleftsideoftheentranceintherighttheundersideoftheexportexitencounteredthewall,theplayercannot.Thegameinthemazetoexploretheexportprocesscanusetheup,down,left,right-exportofafewkeystomanuallysearchthemaze.MapofthemazeisdisplayedonthescreenusingthedrawingfunctionistoachievetocalleasyXlibrary,sothisarticlethemostimportantpartistheintroductionscreendisplaygraphicsmode,andinthismode,thecalldrawingfunctions.

 

Keyword:

maze;lookbackupon;drawfunction

引言

迷宫的问题原本是一个经典的实验心理学的问题,其大概的内容是实验心理学家将老鼠放入从没有顶的大盒子的入口处让其由此进入迷宫。

迷宫中被隔板隔成有很多的分区设置,前进的方向可以形成很多的障碍,有可能某一次走入的那个位置,可能会将小老鼠带入到死胡同,从而要重新的探索新的方向去寻找到出口,而此时给老鼠动力的是一位心理学家在迷宫的唯一的出口处放置的一块奶酪来吸引老鼠,从而给了老鼠外界的动力,让其发现从迷宫中通向迷宫的出口的位置。

当然,心理学家做这个实验是为了研究老鼠在迷宫中寻找出口时的种种表现,去研究这些表现是反映出它在那个时刻是什么样的心理反映,从而去研究这些心里反映说明的问题,还有在这种在老鼠不知道出口的情况下,老鼠是如何识别这条道路是否已经走过,从而心理学家们可以去研究老鼠的学习能力,这只是最初时为了进行学术研究而设置的。

有了这样一个启发,后来有的程序员开发出了各种迷宫的小游戏,这种迷宫的小游戏是趣味性的游戏,可能不用太多的思考能力,但是要的是一种耐心,往往游戏者迟迟走不出,或是走了很久,以为快到出口的地方时,结果进入了死胡同,还要返回去再来,会容易让人产生不耐烦的心态,因为要逐一的去试探各种可能的方向。

但是这种经典的小游戏并没有因此而失去它的魅力,反而吸引了更多的玩家,现在程序的设计者也更加注重提高游戏的趣味性,比如,游戏者的标志是很炫的卡通人物,或是迷宫的障碍物设计的很有意思。

这次我设计的这个迷宫游戏用的是比较简单的方法,是在VC环境下用C语言编写的,并没有用到VC中的API和MFC这种面向对象的方法去编程,当然这两种环境下编出来的界面会更加的漂亮,这次是调用easyX库函数来实现迷宫的界面的,所以在程序中用到了调用到了很多的绘图函数。

设计的迷宫是有一个入口和一个出口,游戏者在进入迷宫后,只能从出口出去,否则失败,该程序支持键盘操作,迷宫大小是由游戏者来确定的,可以自动随机的生成迷宫地图,迷宫游戏设计了一个视野窗口,并不是所有的迷宫地图都可以整个的出现在游戏者的视野范围内,这样做的目的是,如果游戏者事先能浏览整个的迷宫地图的话,就可以大概看一下地图,这样就会很容易走出去,失去游戏本身的趣味性,当游戏者要到视野范围外的迷宫地图时,这时迷宫游戏可以支持游戏者漫游到视野范围外的迷宫。

除了有漫游的功能,还有一个是还可以用三种不同的颜色去标识已经走过的路径,方便让走入死胡同的游戏者可以沿原路返回后,因为忘记刚才走过的路,又一次走入刚才走过的死胡同,这种情况会经常发生。

比如每到一个叉路口,这时可以用黄色来标记,表示暂时的记住来过这个地方,如果后来到了到了死胡同,这个黄色标记中通往死路的这个方向可以用红色标记,用此来表示这条路不通,以后可以不走。

当游戏开始后,游戏者可以从左侧的入口进去,如果能找到出口的话就会在右下侧的出口退出,墙壁则是障碍物的标识,游戏者是不能通过的。

游戏者在迷宫中探索出口的过程中可以使用上,下,左,右或是'A',W','S','D'这几个键手动的搜索迷宫的出口。

迷宫的地图是使用绘图函数显示在屏幕上的,除了描述了迷宫游戏的设计思路和所使用到的数据结构,本文还有最重要的一个部分就是介绍在屏幕显示的图形模式,和在这种模式下,所调用的一些绘图函数。

1迷宫游戏的概要设计

1.1工具介绍

编写迷宫游戏用的是visualC++6.0和EasyX2011惊蛰版,程序所用语言是C语言。

VisualC++6.0是微软开展的Win32应用程序(Windows95/98/2000/XP/NT)、集成工具,面向对象的可视化的一个集成工具。

其最大的优点是提供一个强大的MFC类库——是一个很强大的c++类层次结构,它是由封装了很多类和函数的Windows程序标准由MFC类来提供MFC类等内容,而且MFC为这些提供一个用户界面标准的实现,程序员必须要做的是通过预定义的接口的特定应用程序特定的东西来填满这个框架可以简化编程工作,大大减少了程序员编写的工作量,使得编程变得更加容易。

2011EasyX惊蛰版是2011年3月6日发布的,据作者自己介绍,之前的easyX一直用的是该版本的发布时间来标记该版本的,说是正好发布的那一天,正是二月二,中国农历的节日龙抬头,也是二十四节气中的惊蛰,所以这也是2011惊蛰版的来历,在这个新的版本中,作者对其作了大量的更新,使其用起来更加的方便和功能更加强大,新增加的很多功能中,在这次设计程序中,就用到了新增加的两个函数,GetWorkingImage函数/SetWorkingImage函数和InputBox函数。

另外,在新版中凡是和圆弧有前的函数,都改为用了弧度制,在以前BGI(BasicGraphicsInterface)图形接口文件是使用的是角度制,如果每个程序都需要将弧度制转换为角度制无疑是很麻烦的,所以现在使用弧度制省去了很多的麻烦。

除了新增加的功能,还有部分的功能作了调整,以下只介绍我们在程序中会用到的几个函数,arc函数由画圆弧调为画椭圆弧,精简putimage函数,可以设置当前绘图图像的宽高,cleardevice函数清屏幕内容不在是局限于裁剪的区域,还有部分bug的修正,例如对文字和绘图的稳定性的提高,也修正了以前版本在退出程序时会产生崩溃的一些问题。

在其他的方面是提高了程序的兼容性和对帮助文件的更新【21】。

1.2游戏的主要功能

建立一个大小为任何迷宫的m*n,m,n是由用户输入的数字,自动生成一个m*n迷宫。

并完成了组织和存储的迷宫,和迷宫路由算法。

迷宫有一个入口和出口,以及支持键盘操作。

游戏者从左上侧找到入口,右下侧找到出口。

迷宫的屏幕上显示的障碍物图形是由随机种子自动生成的,并使用图形函数显示在屏幕上。

程序响应键盘操作,四个方向键来选择路径,若碰到墙上,则不能通过。

走过的路径,可以进行标记【18】。

1.3程序调用的头文件的介绍

#include文件的扩展名为.h的文件是头文件,在程序中使用头文件有多种好处,比如可以减少整个的代码的长度,一般把这些公用的内容编译在一起,提供公共的代码。

有些函数库的功能可以通过头文件来调用,有些函数库的源代码是不方便或者不准向外界公开的,所以向用户调用头文件时,连接头文件的接口会来调用有关的库函数的,会从中取出相应的代码,可以和用户的程序链接生成可执行的动态连接库文件,所以不必向外界公开代码,同时也不影响用户的使用,而且又增强了用户程序的可读性。

在本次的程序中开头调用了graphics.h,conio.h,time.h这三个头文件,这三个头文件都是在本次的迷宫设计中与取随机数后自动生成迷宫,绘制迷宫图形和读取游戏者输入的相关命令,系统返回的相关命令相关的头文件,下面大概介绍一下这三个头文件:

graphics.h是easyX图形库,在图形库里主要为程序提供的是图形模式函数。

Conio.h为程序提供的是字符模式函数。

可以通过控制台进行数据的输入和输出,例如是对一些响应一些用户的键盘操作,conio这几个字母实际上是控制台输入输出操作的简写。

Time.h是提供日期和时间的头文件,是从系统时钟获取时间的方式【21】。

2easyX的介绍

EasyX是针对C++的图形库,可以帮助C语言初学者快速上手图形和游戏编程。

2.1为什么要用easyX

大多数程序员学习C语言编程是从TC开始学习,主要是介于TC的编程环境因为太老了,所以容易给新手造成一种学习上的环境的压力,比如想复制和粘贴某段代码时是很不方便的,这种外界性的压力容易让刚开始学习C语言的学习者对学习产生一些不好的情绪。

面VC有杰出的编辑和调试的环境。

并且它易于下载到免费的版本。

但不幸的是,VC只能做一些类似于文本的练习,比如想画一条直线或圆类的图是很难的,想注册窗口类和构造消息循环都是在刚开始学习时不容易上手的。

所以通常我们在刚开始接触到C语言时,老师一般的推荐我们使用TC,因为给容易上手。

现在为了给每个人一个更好的学习平台,为了更好的体现出VC的优越性,所以一些程序开发者编写了easyX库,现在有了这个库函数,可以在VC环境下方便的进行图形的绘制,这个函数库的出现给C语言的开发者提供一个更方便的开发平台。

2.2easyX

首先介绍一下easyX的安装环境,操作系统的版本:

windows2000及以上的系统。

编译环境的版本是:

visualC++6.0/2008/2010。

安装时解压后,可以执行setup.hta,可以根据提示安装。

但如果想手动安装,可以将include和lib文件夹下的文件分别拷贝到VC对应的include和lib文件夹内即可。

在include文件夹下只有一个文件是graphics.h,而如果你用的版本是VC6.0,lib文件夹下的文件只需要用graphics6.lib和graphics6u.lib这两个文件。

如果你用的是VC2008及以上版本lib文件夹下的文件就需要graphics6.lib、graphics6u.lib、graphics9.lib、graphics9u.lib这四个文件。

或者也可将include和lib文件夹放到任意位置,然后在去修改VC中的lib和include的引用路径也可以。

总之,能让VC找到这几个文件即可。

在以上所说的这几个文件,后缀名为h的是程序需要引用的头文件,后缀名为lib的是程序的库文件。

卸载该程序时要注意,由于该安装程序并不改写注册表,因此在“添加删除程序”中不会看到easyX的卸载项。

如需卸载,可以执行setup.hta,并跟随提示卸载。

新的版本的安装程序并不能确保完全卸载旧版本,所以可以保留相应版本的安装程序。

3迷宫中的数据结构

数据结构对编写出一个高效的程序是非常有用的,它对分析即将处理的对象的特性和各对象之间的关系都有一种明确的思路。

在通常我们都是用“穷举求解”的方法,从入口出发,顺着某一方向向前探索,如果能走得通,就继续往前走,不行的话就原路退回,到交叉口换另外一个方向再续继探索,直到所有可能的通路都探索到【16】。

程序中最后用了数据结构中的递归,递归函数就是一个函数直接的调用自己或者是通过一系列的调用语句间接地调用自己,在程序设计中,递归函数是一个非常好而且有力的工具,通过调用它可以省去很多繁琐的步骤,这其中的原因有三条:

1.可以定义很多递归的数学函数。

2.有的数据结构的本身也具有递归的特性。

3.有时候用递归求解比用迭代更加的简单和方便。

有时候在用到递归函数时,通常需要多次的调用,递归函数的执行有点类似于汇编程序中主程序和子程序这间的接口和信息的交换,而在高级语言中,这种函数和被调用函数之间的信息交换是通过栈来执行的。

在来看看,当一个运行着的函数调用另一个函数时,系统做了哪些工作。

首先,系统会将主调函数的所有的实参数和返回地址等一些信息通过栈来保存起来。

其次,系统要为分配存储区给被调用的函数的局部变量。

最后,将控制权转移到被调用函数的入口【15】。

而当被调用函数返回参数到调用函数之前,系统会做好这些工作:

将被调用函数的计算结果保存,将分配给被调用函数的存储区释放,根据被调用前保存的返回地址将控制权重新交回到调用函数。

当有多个函数嵌套调用时,都是按照后调用先返回的原则,而这些信息的传递和控制权的移交都是通过栈来实现的,系统会安排一个栈自动保存的程序运行期间所需的数据,当调用一个函数时,系统就会在栈顶为其分配一个存储区间,有函数退出来时,会释放这个存储空间。

而且当前的正在运行的函数的数据区总是在栈顶的。

在实际的程序的执行过程中,主被调函数之间传递的不一定是一个数值,也有可能是参数的地址。

递归函数在运行时有点像调用多个嵌套的函数,调用的函数和被调用的函数是同一个函数,所以就有种类似于层次的感觉,比如,从主函数开始调用递归函数时就开始进入第一层,每次都这样的迭加,直至进入了第n+1层,相反地,如果退出时,就是第n+1层退回了第n层。

如果递归的情况复杂的话,为了确保程序在执行时的正确性,系统会自动的为该递归函数建立一个递归工作栈,这个递归工作栈在数据存储区中,在每一层的递归信息中都会有一个工作记录,这个工作记录包括了这个函数中所有的实参数,局部变量还有递归结束后要返回的地址。

当每进入一个递归层时,就会在栈顶产生一个新的工作记录,退出一个工作记录时,就会相应地从栈顶弹出一个工作记录,在当前正在执行的工作记录称为活动记录。

递归函数的好处是可以使结构很清晰,可读性也高,对用户编程和调试程序都带来了很大的方便,而且也不需要用户来管理栈。

介绍了一下回溯算法,也被称为启发式方法,选择的搜索方法,通过最优选择条件提出搜索,你可以达到预期的目标,但在探索下一个步骤,如果不是最优的选择或低于目标,您可以返回到前一步骤,特别是退出这个死胡同返回到上一步重新开始的方法被称为回溯和满足这一状态的点称为“回溯点”,这是一种方法,一个系统性寻找问题的解决办法【13】。

回溯是一个相对简单的和常用的搜索策略。

基本的想法是用假定的步骤来解决一个问题可能会有N个步骤,每一步都多种的解决方案,那么一旦每一步按照一定的顺序来测试每一步的各种方法,所有这些方法都失败了,那么就回去测试其余的方式。

简言之,如果你不能进一步,你将回返,从而对于其他道路在尝试。

一般步骤使用回溯算法来解决这个问题:

第一是定义一个解决方案空间,它包含问题的解决办法,那就是,每一步都以不同的方式出现,然后使用适当的搜索的方法来组织解决方案空间,然后用深度优先的方法对解空间进行搜索,然后使用评估函数来避免转移到不可能生成子空间的解决方案。

解决方案空间通常是解决方案的动态搜索过程中产生的,这是回溯的一个特性。

完全访问分为两种情况:

第一,没有考虑到问题的本质性质,按照预定的秩序,建立一个良好的规则,这是盲目搜索的方法,如迷宫和八皇后问题。

另一个是考虑问题给予独特的性质,就可以选择合适的规则来提高搜索的效率。

即启发式搜索[5]。

我们在解决一个迷宫问题时,使用试探或者回溯开始从入口,沿着一个方向前进探索,如果我们穿过,你可以继续向前;否则返回沿着上一步的路线的另一个方向,继续探索,直到所有可能的路径都已经试探完毕,也没有找到出口,这表明迷宫中不存在从始至终的通道。

从入口进入迷宫,无论哪个位置的迷宫,比如规定东是首选方向,如果在某一位置我们可以通过并继续往东走,如果在一个位置,在往东走不通时,将向南、西、北、在三个方向依次走去走一趟年盾哪个能走通,直到走向出口。

一个位置,在四个方向上都是死胡同,可以返回到之前的位置,在这个位置,对别的方向,都试一次,如果这个位置没有方向可以试,再后退一步,所沿的四个方向试探过后,最后回到起点,这表明这个迷宫根本不通[11]。

迷宫的障碍不仅是指墙壁封锁了道路,已走的道路不能重复去走,不有没有走过的道路一旦经过。

为了确保在任何位置都可以用相同的路线返回,就要用一个结构栈来保存路径,这个结构栈是后进先出的堆栈,可以将当前位置的入口到走出出口的一个正确的路径保存在栈中。

但在解决迷宫的路径中,该路径必须是一个简单的路径。

该路径不能重复的出现在同一位置。

该算法的基本思想是:

迷宫的当前位置通过堆栈可以被放置在这个位置即当前路径,并继续移动到下一个地点,以探索,然而,如果现在的位置不可通,即将堆栈头部的元素从堆栈弹出,以恢复原来的方向,然后继续往这个方向向另外的几个方向去探索,如果四个方向的通道都是不可通的,就可以从堆栈中将当前路径上的这个路径上删除。

用回溯算法实现了迷宫,使用堆栈的方法可以有效地解决了路径识别和迷宫问题,如果能走出迷宫的随机模拟矩阵,你可以给它的轨迹的路径【7】。

图是一种比较复杂的数据结构,在图的结构中结点之间的关系可以是任意的其实也就是说任何的两个数据元素都可能是有关系的。

图的遍历是指我们从图中的某一点出发,去访问其他的顶点,而且每个顶点只能被访问一次[6]。

4迷宫游戏中调用的函数

4.1绘图函数的基本知识的介绍

在我们初学C语言时,一般学习的都是用语言去处理字符和数值,但是C语言也是可以绘制图形的。

虽然C语言只是可以画出一些简单的图形,例如直线、圆和椭圆弧等一些较容易画出的基本的图形。

一些复杂的图形又是由这些简单的图形组成的,所以我们只要能会调用一些常用的图形函数,就可以完成绘图功能,我们就可以轻松的画出一些我们想要的漂亮的图形。

在C语言中数据显示在屏幕上的方式分为两种分别是纯文本模式(显示文本)、图形模式(显示图形),在C语言中文本的模式是屏幕的默认模式。

为了易于把计算机屏幕上显示的内容表达出来,我们一般都是把坐标的原点定为屏幕的左上方,行为X坐标,列为y坐标,这些和中学时在数学中学习的建一个平面直角的坐标系很相像,所以很好理解,唯一有点不同的是,左上方是屏幕上的直角坐标系的原点坐标【20】。

下面除了要介绍画出一些图形的方法,还要介绍一下在图形模式下如何显示一些字符类的提示信息。

因为整个屏幕上只有图形的话,没有一此字符的提示这样会给游戏者带来操作上的不便。

所以在图形模式下能够有字符显示会使操作的界面更友好。

在C语言中的基本的绘图步骤是:

第一步是将屏幕模式设为图形模式,第二步是调用图形库中的绘图函数,第三步是关闭图形模式(屏幕模式返回到字符模式或文本模式)【20】。

在前面我们说过在C语言中文本的模式是屏幕的默认模式,所以在编写程序刚开始第一步先要考虑的是应该如何把这种模式转变,这里调用了这样一个函数initgraph(640,480);这个函数就可以改屏幕的模式为图形模式,后面的参数是说这个屏幕的分辨率是640×480,就是这个屏幕的每行每列分别有640个象素和480象素。

关闭图形模式是用closegraph函数,在绘图结束后可以用这个函数来关闭图形模式,此时将恢复系统默认模式【21】。

有些函数的参数会调用到背景颜色值,这些颜色的符号名和色彩值都可以再本程序用到的easyX2011版中的easyX帮助文档中查到,这里就不逐一介绍了。

用程序中用到的语句举个例子,比如程序中绘制界面背景色时用到了setcolor(CYAN);就是把整个界面的背景底色设置为青色,其实这个语句还可以描述为setcolor(3);这里的3就是色彩值,所以这个参数的有效值可以是颜色的符号名,也可以是色彩值【21】。

4.2程序中用到的绘图函数

Welcome函数是绘制游戏界面,InitImage函数,初始化游戏图片InitGame函数,初始化游戏数据,GetMazeSize函数,提示用户输入迷宫大小,MakeMaze函数,生成迷宫:

初始化(注:

宽高必须是奇数),TravelMaze函数;生成迷宫:

遍历(x,y)四周,MAPITEMGetMazeItem函数,获取指定坐标的迷宫元素,Paint函数,绘制视野范围内的迷宫,GetCmd函数,获取用户输入的命令,DispatchCmd函数,处理用户输入的命令OnUp函数是向上移动,OnLeft函数是向左移动,OnRight函数是向右移动,OnDown函数是向下移动,OnMark函数,在地图中做标记CheckWin函数,检查是否到出口Quit函数,询问用户是否退出游戏【21】。

本程序中调用了两种随机函数srand函数和rand函数。

在程序的开头用了srand((unsigned)time(NULL))产生随机数的原因是初始化随机函数种子。

这个函数的意思是拿当前的系统时间作为种子,是为了达到程序要的效果,每次时间是变化的,所以种子也是变化的,可以每次生成不同的随机序列,有不同的地图序列,所以每次游戏者的系统时间不一样,会生成不同的随机序列。

中间的参数的数据类型为unsigned,说明数据可以为任意数据。

在程序的后面还会用到rand函数,rand函数是真正的随机数的生成器,rand函数与srand函数的区别是在我们用rand函数来产生随机数时,如果我们没有在rand函数之前调用过srand函数,系统会默认的认为1是随机数的初始值,但是如果用户在这之前调用了srand函数,则srand函数就给初始的参数的指定了一个固定的数。

程序开头定义全局变量g-imgMap是迷宫地图,g-szMap是迷宫地图的尺寸,g-imgSight(360,280)是游戏的视野,g-rtSight是游戏的视野的范围,g-imgItem(180,20)是地图元素,g-imgGPS是迷你地图,用于显示游戏者在地图中的位置,g-ptGPS是迷你地图的显示位置,g-szGPS是迷你地图的尺寸,g-ptPlayer是游戏者的位置。

下面介绍一下在绘制迷宫过程中用到的绘图函数:

setcolor函数,这个函数的功能是将当前图形屏幕的当前的笔画颜色置为color,一

般来说,只有当我们当前的画笔色和背景色不同时,才能显示出来我们所

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

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

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