毕业设计之推箱子.docx
- 文档编号:3398023
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:12
- 大小:71.82KB
毕业设计之推箱子.docx
《毕业设计之推箱子.docx》由会员分享,可在线阅读,更多相关《毕业设计之推箱子.docx(12页珍藏版)》请在冰点文库上搜索。
毕业设计之推箱子
安徽大学
本科毕业论文〔设计、创作〕
题 目:
面向过程的推箱子设计
学生:
王** 学号:
P010*****
院〔系〕:
电子信息工程专业专业:
电子信息工程
入学时间:
2010年 9 月
导师:
李** 职称/学位:
副教授/硕士
导师所在单位:
电子信息工程学院
完成时间:
2014 年 6 月
面向过程的推箱子设计
摘要
推箱子游戏是一款很有趣味的游戏,目的在于训练玩家的逻辑思维能力。
游戏中通过控制人物上下左右移动,将箱子推到指定的地点,从而通关游戏。
本文主要介绍了推箱子游戏的游戏规则、需求分析、流程设计以及游戏中的主要算法的分析、设计和实现。
并通过游戏规则分析,确定任务流程,展开设计。
最终在OpenCV上实现图像加载、显示和游戏交互。
本次设计实现了推箱子游戏的基本功能。
关键词:
推箱子;图像处理;OpenCV
ProcedureOrientedSokobanDesign
Abstract
Sokobangame,a veryinterestinggame, whichisaimedat training logicalthinkingabilityofplayer.Bycontrollingtheportersmovedfromtoptobottom,orlefttoright,andpushtheboxtothespecifiedlocation,andcompletethegameatlast.ThispapermainlyintroducestherulesandfeaturesofSokobangame,analysisofthedemandofit’sdesign,executionprocess,analysisandimplementationof algorithmdesigninthegame.Thisdesignwasanalyzedbyrulesofthegame,determiningthetaskflowandanalysisthesystem,andfinallyrealizedimageload,display,mutualinVC6.0andOpenCV.ThedesignrealizedthebasicfunctionsofSokobangame.
Keywords:
Sokoban;imageprocessing;OpenCV
1引言
目前,在中国乃至全世界,游戏产业已经逐渐成为微控制器领域的一个相当庞大的分支。
随着网络和智能的兴起,各种网络游戏和游戏在国内层出不穷。
从魔兽世界、英雄联盟到水果忍者、神庙逃亡,巨大的市场需求量使游戏行业在中国飞速发展。
未来,游戏必将成为网络竞争中的主角,它的商业利益和商业价值是无法估量的。
中国,一个人口众多的国家,随着人们生活水平的提高,温饱已不是最终的目的,我们寻求的是更加多姿多彩的生活,那我们又怎能错过游戏这一最正确休闲娱乐项目呢?
所以游戏在我国的发展前景一片大好[1]。
经典的推箱子是一个来自日本的古老游戏,目的在于训练人的逻辑思维能力。
在一个狭小的仓库中,要求把箱子推到指定的位置,稍有不慎就会出现箱子无法移动或通道被堵住的情况。
所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
目前,推箱子作为一个经典游戏,非但没有没落,还被很多编程爱好者开发出了各种版本、各种类型。
本次毕业设计我将就推箱子游戏做一个研究。
通过本次设计让我能更好的将理论与实践相结和,加深对理论的理解,同时培养我的动手意识,强化专业知识,为以后研究更加复杂的设计打下坚实的基础。
本设计主要是OpenCV软件实现的。
2推箱子游戏概述
推箱子已被改编成各种版本,有松鼠推箱子、小狐狸推箱子、机器人推箱子、吉豆推箱子以及3D推箱子等,但玩法基本相同。
2.1游戏起源
经典的推箱子游戏是一个来自日本的古老游戏,1981年由日本人今林宏行首创,在1982年12月由ThinkingRabbit公司首次发行,名“仓库番”,目的是训练人的逻辑思维能力[2]。
推箱子游戏是目前比较流行的游戏之一,很多操作系统和流行软件都会带有这种游戏。
它既能锻炼思维的严密性,又有很多趣味性。
游戏中箱子只可以推,不可以拉,并且一次只能推动一个,胜利条件就是把所有的箱子都推到目的地。
目前市场上有着各种版本的推箱子,并且可以在多个平台运行。
2.2游戏的操作方法
在游戏中会出现一个封闭的围墙,围墙里有一个人物、假设干个箱子和箱子的放置点。
玩家需要利用方向键控制人物的上下左右移动,来推动界面中的箱子到达指定的箱子放置点。
2.3游戏规则
游戏中箱子只能推动而不能拉动,并且一次只能推动一个箱子。
注意不要把箱子推到死角,否则就无法再推动它了。
当玩家把全部的箱子都推到箱子的放置点时,玩家顺利通过当前游戏关卡,并进行下一关的游戏。
如果玩家无法将指定的箱子全部推到放置点,则玩家失败,此时玩家可以重新开始当前关卡的游戏或者关闭窗口退出游戏。
3使用软件简介
OpenCV实现的。
简介
,是由微软推出的一款C++编译器,是将“高级语言”翻译为“机器语言〔低级语言〕”的程序。
VC6.0是一个功能强大的可视化软件开发工具。
它不但是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境〔integrateddevelopmentenvironment,IDE〕。
VC6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名为DeveloperStudio的组件集成为和谐的开发环境。
自1993年微软公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具[3]。
3.2OpenCV简介
OpenCV的全称是:
OpenSourceComputerVisionLibrary。
OpenCV于1999年由Intel建立,现在由WillowGarage提供支持。
OpenCV是一个基于开源发行的跨平台电脑视觉库,可以在Linux、Windows、IOS和MacOS操作系统上运行。
它轻量级而且高效,由一系列C函数和少量C++构成,可以不必学C++,同时提供了Ruby、Python、MATLAB等语言的接口,实现了图像处理和电脑视觉方面的很多通用算法[4]。
较directx方便很多。
结合VC本次设计。
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。
游戏执行流程图
游戏从第一关开始,通过上下左右方向键来控制人物移动从而推动箱子,可以在游戏中的任何时刻选择退出。
如果游戏无成功希望,可以按空格键回到当前关卡的开始状态;如果成功完成当前关卡,则进入下一关;如果当前关卡是最后一关〔游戏共四关〕,则显示通关信息,提示游戏结束,游戏执行流程如图2所示:
图2:
游戏执行流程
5.4程序中各个函数的简要介绍
voidRefresh(inta[][10]);//刷新背景图函数
voidfind(inta[][10]);//找人物坐标函数
voidSmileboy(inta[][10]);//画一个胜利后的开心人物
intwin(inta[][10]);//判断游戏是否胜利函数
voidmove(inta[][10],intx1,inty1);//移动函数
intplay(inta[][10]);//游戏过程
voidGamestar(void);//游戏开始函数
6推箱子游戏算法的设计和实现
6.1地图的绘制与读取
将地图数组中的数据绘制成地图图像。
设计要求如下:
〔1〕根据要求,实现相应的函数,以到达能够正确的绘制出各个地图,程序中定义了地图数组,地图数组中各元素代表的意思如下:
用0表示空地,1表示人物,2表示箱子,3表示目的地,4表示在目的地上的人物,5表示箱子在目的地上,6表示围墙,7表示完成任务后的人物〔一个开心的人物〕。
〔2〕能读取地图数据,根据不同的地图数据绘制出相应的地图。
本程序利用刷新函数Refresh,刷新背景图片以得到不同的地图图片。
主要代码实现如下:
voidRefresh(inta[][10])
{
for(inti=0;i<10;i++)
{
for(intj=0;j<10;j++)
{
CvRectsrect=cvRect(0,0,60,60);//创造矩形区域
CvRectdrect=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查找人物坐标
设计中要想使人物移动,首先要找到人物的起始位置,然后才能开始移动。
人物在地图中有两种情况:
人在空地上和人在目的地上。
voidfind(inta[][10])
{
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;
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)
{
a[x][y]--;
a[x+x1][y+y1]-=1;
a[x+2*x1][y+2*y1]+=2;
Refresh(a);
return;
}
else
return;
}
6.4游戏胜利的判断
每次在玩家移动人物后,对当前地图数组进行判断,如果还存在箱子〔即地图数组中存在值为2的元素〕,就说明玩家未取得胜利;反之就说明玩家已经将所有的箱子推到了目的区域,取得了当前关卡的胜利。
主要代码实现如下:
for(intx1=0;x1<10;x1++)
{
for(inty1=0;y1<10;y1++)
if(a[x1][y1]==2)
return0;//如果还有箱子返回假
}
return1;//如果没有箱子返回真
6.5整合与测试
〔1〕编译链接程序,检查程序是否有错误,假设有则查找错误并进行调试;
〔2〕编译链接程序无错误后,执行程序,检查结果假设有错误,则查找错误并进行调试;
〔3〕假设程序成功执行无错误后,看是否能出现游戏界面窗口,假设成功则对游戏的各项进行测试。
假设有功能未实现,则需要重新修改代码并进行调试。
7结束语
近年来随着科技的飞速发展,VC语言的应用正在不断的深入。
本次设计便是基于VC的一个小游戏,这个小游戏在功能方面基本到位。
基于小游戏的原则,没有加入太多花俏的图片,也没有华美的界面设计。
正如前人所说,小游戏之所以流行,就是因为它小。
即使在很破旧的机器上,也基本都能顺畅运行,没有卡顿。
正是由于它的简洁方便,才能长盛不衰。
本论文阐述了推箱子游戏的设计与实现全过程,并在论文中相应的位置插入了图片、系统设计流程图以及一些编程思想代码,更加清晰的描述了该系统的实现过程。
论文主要内容如下:
〔1〕对推箱子小游戏进行了具体的调研。
对推箱子小游戏的游戏起源、操作方法和游戏基本规则进行了详细介绍;
〔2〕对本程序设计所需要的软件〔VC6.0和OpenCV〕进行了简单的介绍;
〔3〕对游戏设计进行需求分析。
描述游戏应该具有的功能并对推箱子游戏设计任务作了具体介绍;
〔4〕对推箱子游戏设计进行了系统分析。
包括游戏界面设计,数据结构的组织和游戏的执行流程;
〔5〕对推箱子游戏算法的设计和实现进行了描述。
本程序是基于VC6.0和OpenCV开发的,基本实现了推箱子游戏的功能,还有待于继续努力设计出更完美的推箱子游戏。
主要参考文献:
[1]杨正华,张秋生.VisualC++游戏编程导学[M].北京:
清华大学出版社,2004年.
[2]夏敏捷,潘惠勇.FlashAS3实现推箱子游戏[J/OL].电脑编程技巧与维护,2014(4).
[3]高守传等.VisualC++6.0开发指南[M].北京:
人民邮电出版社,2007年.
[4]布拉德斯基,克勒等.学习OpenCV[M].北京:
清华大学出版社,2009年.
致谢
在论文完成之际,我要特别感谢我的指导老师李新华老师的热情关心和悉心指导。
在我撰写论文的过程中,我得到了李新华老师悉心细致的教诲和无私的帮助,尤其是其不厌其烦的帮助我进行论文的修改和改良。
同时,感谢我的同学们,他们给予了我很多素材,还在论文的撰写和排版过程中提供了热情的帮助。
另外,感谢这篇论文所涉及到的所有学者。
本文引用了数位学者的研究文献,如果没有各位学者研究成果的帮助和启发,我将很难完成本篇论文的写作。
最后,向在百忙中抽出时间对本论文进行评审并提出珍贵意见的各位老师和企业导师表示衷心地感谢。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 箱子