安徽大学
本科毕业论文(设计、创作)
题 目: 面向过程的推箱子设计
学生姓名: 王** 学号: P010***** 院(系): 电子信息工程专业 专业: 电子信息工程 入学时间: 2010 年 9 月 导师姓名: 李** 职称/学位: 副教授/硕士 导师所在单位: 电子信息工程学院 完成时间: 2014 年 6 月
面向过程的推箱子设计
摘 要
推箱子游戏是一款很有趣味的游戏,目的在于训练玩家的逻辑思维能力。游戏中通过控制人物上下左右移动,将箱子推到指定的地点,从而通关游戏。本文主要介绍了推箱子游戏的游戏规则、需求分析、流程设计以及游戏中的主要算法的分析、设计和实现。并通过游戏规则分析,确定任务流程,展开设计.最终在VC6.0和OpenCV上实现图像加载、显示和游戏交互。本次设计实现了推箱子游戏的基本功能。
关键词:推箱子;图像处理;OpenCV
- I -
Procedure Oriented Sokoban Design
Abstract
Sokoban game, a very interesting game, which is aimed at training logical thinking ability of player。 By controlling the porters moved from top to bottom, or left to right, and push the box to the specified location, and complete the game at last。 This paper mainly introduces the rules and features of Sokoban game, analysis of the demand of it’s design, execution process, analysis and implementation of algorithm design in the game. This design was analyzed by rules of the game, determining the task flow and analysis the system, and finally realized image load, display, mutual in VC6.0 and OpenCV。 The design realized the basic functions of Sokoban game。
Keywords: Sokoban; image processing; OpenCV
- II -
目 录
1 引言 ............................................................................................................................................. 1 2 推箱子游戏概述 ......................................................................................................................... 2 2。1 游戏起源 ............................................................................................................................... 2 2.2 游戏的操作方法 ...................................................................................................................... 2 2.3 游戏规则 .................................................................................................................................. 2 3 使用软件简介 ............................................................................................................................. 2 3.1 VC6.0简介 ............................................................................................................................... 2 3.2 OpenCV简介 ........................................................................................................................... 2 4 任务描述 ..................................................................................................................................... 3 4。1 界面显示 ............................................................................................................................... 3 4。2 实现键盘操作 ....................................................................................................................... 3 4。3 图像变化显示 ....................................................................................................................... 3 4。4 游戏胜负的判断 ................................................................................................................... 3 5 系统分析 ..................................................................................................................................... 3 5。1 界面设计 ............................................................................................................................... 3 5。2 数据组织 ............................................................................................................................... 3 5.3 游戏执行流程图 ...................................................................................................................... 4 5。4 程序中各个函数的简要介绍 ............................................................................................... 4 6 推箱子游戏算法的设计和实现 ................................................................................................. 5 6。1 地图的绘制与读取 ............................................................................................................... 5 6。2 查找人物坐标 ....................................................................................................................... 5 6.3 键盘操作 .................................................................................................................................. 6 6.4 游戏胜利的判断 ...................................................................................................................... 7 6.5 整合与测试 .............................................................................................................................. 7 7 结束语 ......................................................................................................................................... 8 主要参考文献 ................................................................................................................................. 9 致 谢 ........................................................................................................................................... 10
1 引言
目前,在中国乃至全世界,游戏产业已经逐渐成为微控制器领域的一个相当庞大的分支。随着网络和智能手机的兴起,各种网络游戏和手机游戏在国内层出不穷。从魔兽世界、英雄联盟到水果忍者、神庙逃亡,巨大的市场需求量使游戏行业在中国飞速发展。未来,游戏必将成为网络竞争中的主角,它的商业利益和商业价值是无法估量的。中国,一个人口众多的国家,随着人们生活水平的提高,温饱已不是最终的目的,我们寻求的是更加多姿多彩的生活,那我们又怎能错过游戏这一最佳休闲娱乐项目呢?所以游戏在我国的发展前景一片大好[1]。
经典的推箱子是一个来自日本的古老游戏,目的在于训练人的逻辑思维能力。在一个狭小的仓库中,要求把箱子推到指定的位置,稍有不慎就会出现箱子无法移动或通道被堵住的情况。所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务.目前,推箱子作为一个经典游戏,非但没有没落,还被很多编程爱好者开发出了各种版本、各种类型。本次毕业设计我将就推箱子游戏做一个研究。通过本次设计让我能更好的将理论与实践相结和,加深对理论的理解,同时培养我的动手意识,强化专业知识,为以后研究更加复杂的设计打下坚实的基础。本设计主要是基于VC6。0和OpenCV软件实现的。
- 1 -
2 推箱子游戏概述
推箱子已被改编成各种版本,有松鼠推箱子、小狐狸推箱子、机器人推箱子、吉豆推箱子以及3D推箱子等,但玩法基本相同。 2.1 游戏起源
经典的推箱子游戏是一个来自日本的古老游戏,1981年由日本人今林宏行首创,在1982年12月由Thinking Rabbit公司首次发行,名“仓库番\",目的是训练人的逻辑思维能力[2]。推箱子游戏是目前比较流行的游戏之一,很多操作系统和流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多趣味性。游戏中箱子只可以推,不可以拉,并且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。目前市场上有着各种版本的推箱子,并且可以在多个平台运行。 2。2 游戏的操作方法
在游戏中会出现一个封闭的围墙,围墙里有一个人物、若干个箱子和箱子的放置点.玩家需要利用方向键控制人物的上下左右移动,来推动界面中的箱子到达指定的箱子放置点. 2。3 游戏规则
游戏中箱子只能推动而不能拉动,并且一次只能推动一个箱子.注意不要把箱子推到死角,否则就无法再推动它了。当玩家把全部的箱子都推到箱子的放置点时,玩家顺利通过当前游戏关卡,并进行下一关的游戏。如果玩家无法将指定的箱子全部推到放置点,则玩家失败,此时玩家可以重新开始当前关卡的游戏或者关闭窗口退出游戏。 3 使用软件简介
本设计主要是基于VC6.0和OpenCV实现的。 3。1 VC6。0简介
VC6。0即Microsoft Visual C++ 6。0,是由微软推出的一款C++编译器,是将“高级语言”翻译为“机器语言(低级语言)”的程序。VC6.0是一个功能强大的可视化软件开发工具.它不但是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment, IDE).VC6。0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。自1993年微软公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具[3]。 3。2 OpenCV简介
OpenCV的全称是:Open Source Computer Vision Library.OpenCV于1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于开源发行的跨平台计算机视觉库,可以在Linux、Windows、IOS和Mac OS操作系统上运行。它轻量级而且高效,由一系列C函数和少量C++构成,可以不必学C++,同时提供了Ruby、Python、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法[4]。较directx方便很多。结合VC6。0可以较为容易的完成本次设计。
- 2 -
4 任务描述
对游戏设计进行需求分析,描述游戏应该具有的功能。 4。1 界面显示
能够绘制出各关的地图并能成功的加载到游戏界面上显示出来。 4。2 实现键盘操作
能够接受到键盘所输入的方向键信息,并根据不同的方向键信息把游戏人物移动到相应的位置。例如,当玩家敲击方向键“S”时,如果向下的位置是可移动的,那么就把游戏人物向下移动一个方格。 4.3 图像变化显示
当把箱子推到目的区域时,会显示出不同的形象;当人物移动到目的区域时也会显示出另外一种形象。 4。4 游戏胜负的判断
在游戏中,当玩家把所有的箱子都推到箱子放置点时,则玩家顺利胜利通过当前游戏关卡,并进入下一关游戏。如果玩家无法将所有的箱子推到箱子放置点时,则玩家失败,此时可以重新开始当前关卡的游戏或者退出游戏。 5 系统分析
介绍游戏界面设计、数据组织以及各种函数和任务执行流程图。 5.1 界面设计
程序中先创建一个窗口,然后以一副白色的图片(大小为600×600)作为背景图片,再用各种小图块(大小为60×60)复制到背景图片中,来绘制游戏各关的地图.将背景图片显示到窗口中即出现了游戏的界面,游戏第一关的界面如图1所示:
图1:第一关界面
5。2 数据组织
程序中先定义了全局整型变量x和y来表示人物的坐标,一个控制游戏是否重新开始的全局整型loop变量,一个存放地图图片的数组img_num[8],以及一个存放背景图的变量img_bgd.
- 3 -
5.3 游戏执行流程图
游戏从第一关开始,通过上下左右方向键来控制人物移动从而推动箱子,可以在游戏中的任何时刻选择退出。如果游戏无成功希望,可以按空格键回到当前关卡的开始状态;如果成功完成当前关卡,则进入下一关;如果当前关卡是最后一关(游戏共四关),则显示通关信息,提示游戏结束,游戏执行流程如图2所示:
图2:游戏执行流程
进入下一关 否 是否是第 4关? 是 显示通关 是 否 有无成功 希望? 否 回到开始 是否继续 完成? 是 否 退出 开始游戏 初始化地图 开始 是 是否成功?
5。4 程序中各个函数的简要介绍
- 4 -
void Refresh(int a[][10]); //刷新背景图函数 void find(int a[][10]); //找人物坐标函数
void Smileboy(int a[][10]); //画一个胜利后的开心人物 int win(int a[][10]); //判断游戏是否胜利函数 void move(int a[][10], int x1, int y1); //移动函数 int play(int a[][10]); //游戏过程 void Gamestar(void); //游戏开始函数
6 推箱子游戏算法的设计和实现 6.1 地图的绘制与读取
将地图数组中的数据绘制成地图图像。设计要求如下:
(1)根据要求,实现相应的函数,以达到能够正确的绘制出各个地图,程序中定义了地图数组,地图数组中各元素代表的意思如下:
用0表示空地,1表示人物,2表示箱子,3表示目的地,4表示在目的地上的人物,5表示箱子在目的地上,6表示围墙,7表示完成任务后的人物(一个开心的人物)。
(2)能读取地图数据,根据不同的地图数据绘制出相应的地图。本程序利用刷新函数Refresh,刷新背景图片以得到不同的地图图片.主要代码实现如下:
void Refresh(int a[][10]) {
for(int i=0;i〈10;i++) {
for(int j=0;j〈10;j++)
{
CvRect srect=cvRect(0,0,60,60); //创造矩形区域
CvRect drect=cvRect(j*60,i*60,60,60); //创造矩形区域
cvSetImageROI(img_num[a[i][j]],srect); //基于给定的矩形设置图像的ROI
cvSetImageROI(img_bgd,drect); //基于给定的矩形设置图像的ROI cvCopy(img_num[a[i][j]],img_bgd); //复制
} }
cvResetImageROI(img_bgd); //释放基于给定的矩形设置图像的ROI
}
6。2 查找人物坐标
设计中要想使人物移动,首先要找到人物的起始位置,然后才能开始移动。人物在地图中有两种情况:人在空地上和人在目的地上。
void find(int a[][10])
- 5 -
{
for(x = 0; x 〈 10; x++) for(y = 0; y 〈 10; y++) if(a[x][y] == 1||a[x][y] == 4) return; }
6.3 键盘操作
程序在接受玩家键盘输入信息后,对箱子移动与否等进行处理:
(1)程序通过截获当前窗口中键盘按下的信息来判断玩家所按下的按键。
(2)要判断所按的方向键方向是否可以移动,若可移动则移动后地图数据要根据具体情况刷新。
(3)根据玩家所按下的按键把人物的相关坐标进行加减。
(4)移动后需要重新定位人物的位置坐标。(x,y)代表人物坐标。下面是移动人物过程中的全部情况:
如果人物移动的下一步是空白或者目的地,则可以移动.更改人物移动后地图坐标并刷新地图;
if(a[x+x1][y+y1]==0||a[x+x1][y+y1]==3) { }
a[x][y]——; a[x+x1][y+y1]++; Refresh(a); return;
如果人物移动的下一步是墙,则不可以移动;
if(a[x+x1][y+y1]==6)
return;
如果人物移动的下一步是空地上的箱子,并且移动方向的第二步是空地或者目的地,则可以移动,更改人物移动后地图坐标并刷新地图。如果移动方向的第二步是墙,则不可以移动;
if(a[x+x1][y+y1]==2) {
if(a[x+2*x1][y+2*y1]==0||a[x+2*x1][y+2*y1]==3) {
a[x][y]—-;
a[x+x1][y+y1]-=1; a[x+2*x1][y+2*y1]+=2;
- 6 -
}
Refresh(a); return;
}
else
return;
如果人物移动的下一步是箱子在目的地上,并且移动方向第二步是空地或者目的地,则可以移动,更改人物移动后地图坐标并刷新地图。如果移动方向第二步是墙,则不可以移动。
if(a[x+x1][y+y1]==5) { }
if(a[x+2*x1][y+2*y1]==0||a[x+2*x1][y+2*y1]==3) { } else
return; a[x][y]——; a[x+x1][y+y1]-=1; a[x+2*x1][y+2*y1]+=2; Refresh(a); return;
6.4 游戏胜利的判断
每次在玩家移动人物后,对当前地图数组进行判断,如果还存在箱子(即地图数组中存在值为2的元素),就说明玩家未取得胜利;反之就说明玩家已经将所有的箱子推到了目的区域,取得了当前关卡的胜利。
主要代码实现如下:
for(int x1 = 0; x1 < 10; x1++) {
for(int y1 = 0; y1 < 10; y1++) if(a[x1][y1] == 2)
return 0; //如果还有箱子返回假
}
//如果没有箱子返回真
return 1;
6。5 整合与测试
- 7 -
(1)编译链接程序,检查程序是否有错误,若有则查找错误并进行调试;
(2)编译链接程序无错误后,执行程序,检查结果若有错误,则查找错误并进行调试;
(3)若程序成功执行无错误后,看是否能出现游戏界面窗口,若成功则对游戏的各项进行测试。若有功能未实现,则需要重新修改代码并进行调试。 7 结束语
近年来随着科技的飞速发展,VC语言的应用正在不断的深入。本次设计便是基于VC的一个小游戏,这个小游戏在功能方面基本到位。基于小游戏的原则,没有加入太多花俏的图片,也没有华丽的界面设计。正如前人所说,小游戏之所以流行,就是因为它小。即使在很破旧的机器上,也基本都能顺畅运行,没有卡顿。正是由于它的简洁方便,才能长盛不衰。
本论文阐述了推箱子游戏的设计与实现全过程,并在论文中相应的位置插入了图片、系统设计流程图以及一些编程思想代码,更加清晰的描述了该系统的实现过程。论文主要内容如下:
(1)对推箱子小游戏进行了具体的调研。对推箱子小游戏的游戏起源、操作方法和游戏基本规则进行了详细介绍;
(2)对本程序设计所需要的软件(VC6.0和OpenCV)进行了简单的介绍; (3)对游戏设计进行需求分析.描述游戏应该具有的功能并对推箱子游戏设计任务作了具体介绍;
(4)对推箱子游戏设计进行了系统分析。包括游戏界面设计,数据结构的组织和游戏的执行流程;
(5)对推箱子游戏算法的设计和实现进行了描述。
本程序是基于VC6.0和OpenCV开发的,基本实现了推箱子游戏的功能,还有待于继续努力设计出更完美的推箱子游戏。
- 8 -
主要参考文献:
[1] 杨正华, 张秋生. Visual C++游戏编程导学[M]。 北京: 清华大学出版社, 2004年. [2] 夏敏捷, 潘惠勇. Flash AS3实现推箱子游戏[J/OL]。 电脑编程技巧与维护, 2014(4). http:
//www。cqvip。com/QK/98258X/201403/48527299。html
[3] 高守传等。 VisualC++6.0开发指南[M]. 北京: 人民邮电出版社,2007年。 [4] 布拉德斯基, 克勒等. 学习OpenCV[M]。 北京: 清华大学出版社, 2009年。
- 9 -
致 谢
在论文完成之际,我要特别感谢我的指导老师李新华老师的热情关怀和悉心指导。在我撰写论文的过程中,我得到了李新华老师悉心细致的教诲和无私的帮助,尤其是其不厌其烦的帮助我进行论文的修改和改进。同时,感谢我的同学们,他们给予了我很多素材,还在论文的撰写和排版过程中提供了热情的帮助。
另外,感谢这篇论文所涉及到的所有学者。本文引用了数位学者的研究文献,如果没有各位学者研究成果的帮助和启发,我将很难完成本篇论文的写作。
最后,向在百忙中抽出时间对本论文进行评审并提出宝贵意见的各位老师和企业导师表示衷心地感谢。
- 10 -
因篇幅问题不能全部显示,请点此查看更多更全内容