上海大学计算机认识实习报告VB拼图游戏资料.docx
- 文档编号:12589254
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:17
- 大小:563.82KB
上海大学计算机认识实习报告VB拼图游戏资料.docx
《上海大学计算机认识实习报告VB拼图游戏资料.docx》由会员分享,可在线阅读,更多相关《上海大学计算机认识实习报告VB拼图游戏资料.docx(17页珍藏版)》请在冰豆网上搜索。
上海大学计算机认识实习报告VB拼图游戏资料
总序号:
247
班级序号:
5
成绩:
计算机认识实习报告
专业:
计算机科学与技术
班级/题序:
B3班第二题:
拼图游戏
实习题目:
拼图游戏
姓名:
xxx
学号:
指导教师:
计算机工程与科学学院
报告日期2016年6月23日
平时表现
优秀□良好□一般□较差□
系统验收
优秀□良好□一般□较差□
报告撰写
优秀□良好□一般□较差□
教师评语
一、
实习目的和要求
计算机认识实习一般安排在短学期进行,是理论联系实际的重要实践性教学环节。
通过认识实习,了解程序设计的一般过程,树立良好的设计方法,巩固有关计算机软件的知识,加深专业知识的了解,扩大专业知识面,培养和提高发现问题、认识问题、分析问题及解决问题的能力,为有关后续专业课程的学习奠定基础。
通过VisualBasic语言的使用,体会使用VB进行程序设计的特色,试探用VB开发更为复杂的应用程序;
加强高级语言的编程能力,了解计算机软件设计的基本方法和一般步骤;
通过实习,对计算机及计算机软件设计有一个较为全面的认识,培养发现问题、认识问题、分析问题及解决问题的能力,提高自学能力和上机动手能力。
通过认识实习,学生通过查阅资料了解计算机软件开发技术的最新技术和发展趋势。
通过VisualBasic语言有关知识的学习,使我们掌握:
VB的安装、设置和操作技能;
VB编程的基本概念;
VB中的常量、变量、表达式及运算;
VB中的数组、记录和控制结构使用;
VB中窗体和控件的设计使用方法,图形、图象类控件的使用;
VB中对话框与菜单程序设计方法;
VB与数据库的链接与应用;
简单的游戏软件的设计与开发方法。
每人将按要求开发设计一个简单的游戏软件。
二、实习内容
这次认识实习,我的主要任务是利用VB,设计一个拼图游戏,其具体要求如下:
拼图游戏(Puzzle)是一种容易上手的小游戏。
本题目要求编程,实现以下功能。
游戏时,用户可以选择一幅图作为拼图素材。
系统显示的是被分割成M×N个,并
打乱顺序后随机排列的(见图1)小图块。
其中有一块空档。
游戏者用鼠标点击与空档相邻的图块,使其与空档互换位置。
利用该空档最终恢复图片的原貌,最后一块为底牌(见图2),翻底牌为完成拼图。
移动的步数越少或时间越短,说明水平越高。
基本要求:
程序能完成概述中的基本功能。
原始图片可以选择在旁边预览。
M与N可由游戏者输入确定。
小图块的排列以及作为空档的图块都是随机的。
主界面为窗口界面,包含菜单栏。
菜单中至少要有“运行”菜单,含“run”命令、“stop”命令;“帮助”菜单,含“Help”命令、“About”命令(Help内容是操作说明。
About内容是开发者的姓名、学号、日期等。
(见有关要求的说明。
)
建议功能:
设置游戏级别。
用记步数或计时来记录成绩,供查询或分胜负。
空档背景色可选。
空档位置也可以指定。
游戏者可以选择级别:
学习级、挑战级、应战级。
1.学习级:
作上述一般游戏。
2.挑战级:
计时、记步数,记成绩。
上排行板。
3.应战级:
选一个擂台,比时间、步数分胜负。
最后上冠军宝座。
“Undo”功能的实现。
若点错图块(如点了无法移动的图),报警。
作者可以自行发挥各种附加功能和游戏规则,只要在你的帮助信息中给出说明。
相信大家都玩过这样的拼图游戏,但是自己动手去做,又是另一种很有意义的体验。
在认识实习期间,我们上了三次VB课程,另外还在机房上了五次机,在这期间我们学习了VB的一些基本操作,但是更重要的是在实践中学习。
通过自己查阅资料,制作游戏,来理解和运用学到的知识,这样才是实习的目的之所在。
三、系统概要设计说明,功能模块及流程和工作原理
系统概要设计说明:
要设计一个拼图游戏,其核心是把一个完整的图片分割成若干块,然后随机打乱,再随机去掉其中的一块。
通过玩家拼图操作之后,如果拼出的图与原图吻合,那么就视为拼图成功,并记录玩家使用的步数。
实现这个游戏的主要设计,应该是判断什么时候可以移动图片,以及什么时候图片与原图吻合。
其次是通过空间数组,动态的生成我们需要的数量的Image控件,来存储每个图片单元,并且要控制各个空间数组的相对位置。
功能模块:
主游戏模块:
1.可选难度模式,主要有三种难度,对应三种不同的分割数目。
Easy:
3*3;Normal:
4*4;Hard:
5*5
2.自定义模式:
由玩家自己决定分割的块数,自定义难度。
(难度设定我参考了扫雷游戏,让玩家不断突破自己)
显示原图:
玩家可以在游玩时随时预览原图,方便玩家娱乐。
自定义图片:
为了增大游戏的乐趣,此游戏可以由玩家自定义图片,来进行拼图。
“关于”对话框:
显示此游戏的有关数据,版本,制作人信息等等。
“Help”对话框:
显示游戏的基本操作,难度选择等信息。
“最佳选手”:
可以分别显示不同难度下的最佳成绩
美化:
美化了游戏背景图,鼠标图标,对话框等,使游戏更加美观。
流程和工作原理:
首先,点击“新游戏”,选择游戏难度(Easy,Normal,Hard,自定义),通过CommonDialog控件,来让玩家自己选择图片进行游玩。
然后玩家点击分割后打乱的图片,软件会自动判断点击的图片是否可以移动,若可以,则移动。
当所有图片都回到它正确的位置时,软件会自动提示拼图成功,并且记录使用的步数,如果是最佳纪录,则上英雄榜。
如果有问题,可以点击“浏览原图”来显示原图,或者查看“Help”和“关于”对话框。
点击“退出”即可退出游戏。
四、系统详细设计、关键技术与难点、测试数据
图片的分割与初始化:
首先,是进行图片的分割。
在这里我是用的是PictureClip控件,因为这个控件方便我们进行分割(有col和row属性)。
如果要分成M*N的图片块,那么只需要把PictureClip的row设置成M,col设置成N即可。
然后再根据分割出的块数,对应的生成相应数量的Image控件数组,调整好每一个控件的相对位置,这样基本操作就完成了。
接下来便是随机打乱图片。
利用Rnd来产生随机数,然后把每个PictureClip的图片单元都对应一个随机的Image控件,这样就随机分配好了各个图片块。
然后再随机去掉一块,只需使用LoadPicture("")即可,这一块用来图片移动。
这样初始化就完成了。
在这一部分,我认为比较难的是“自定义模式”下,动态生成控件数组,并且根据分割的块数,让Image控件自适应大小,不至于由于图片的大小原因,或者分割的块数过多,使得出现图片显示不全,分割的图片不完整等等问题。
在这里,我是先创建一个Image(0),然后利用Load来动态创建控件数组。
由于图片分割后可以看成是分割成了一个矩阵,并且空间数组是按顺序排放的,根据矩阵行与列的关系,我们可以得知,当控件数组的下标IndexmodN(列数)=0时,这一个控件一定在Image(0)的正下方。
所以这些Image控件的Left与Image(0)相同,Top为Image(0)的高度再加上当前控件的正上方一个控件(Index为i-N)的Top值。
而剩下的控件,其Top值为它前一个控件的Top值,Left值为它前一个控件的Left值再加上Image控件的宽度即可。
这里需要注意的是,需要设置PictureClip1.StretchX=500/N,PictureClip1.StretchY=500/M,来限制每个图块的大小,防止由于图片过大,导致的每个图块也过大,甚至超出了屏幕范围,我这么设置之后,图块的总大小就被我确定了,更加的美观。
由此便很好的实现了自定义行、列数的分割,并且图片排列紧凑,也完整包含了全部图片,没有出现“消失的部分”。
图片的移动与拼图:
图片的移动,我也是根据矩阵的特性,首先判断列的情况,再看行的情况。
总结规律之后发现,列和行都分别只有三种情况。
列的情况有:
第一列,只需要判断右边是否为空;最后一列,只需要判断左边是否为空;其余的左右都需要判断。
行的情况也一样:
第一行,只需要判断下面是否为空;最后一行,只需要判断上面是否为空;中间各行上下都需要判断。
这样便实现了图片的有序移动,程序的基本功能已经完成了。
判断是否拼图成功,这点很简单,只需要看每个Image(i).picture是否对应的是PictureClip.GraphicCell(i)即可。
如果是的,则说明拼图成功,弹出Success框,并记录步数,再把步数与“英雄榜”比较,将较小者留下。
多种模式:
首先游戏本身设置好了三种难度,玩家可以根据自身需求,选择相应的难度。
此外,也可以选择自定义模式,自己去设置M与N的值,这样也更有乐趣。
这里的时候与上文相似,不必多说。
显示原图:
我是用的是添加了一个新的窗体,当点击“显示原图”按钮时,就弹出这个窗体,并把当前PictureClip的图显示出来,并让图片自适应窗体大小。
“关于”与“help”:
这里我也是使用的新的窗体,VB6.0自带的有“关于”对话框窗体,添加之后使用很方便,可以自己设定图标等信息,关于里面的内容也是自动填充的。
英雄榜:
当玩家选择内置的Easy、Normal、Hard难度进行游戏,并且拼图成功之后,游戏就会记录玩家使用的步数,并且和已有的榜单进行比较,留下步数最少的成绩。
玩家可以点击“最佳玩家”按钮进行查看最佳成绩。
测试数据(此处只放Easy模式下的成功案例,分割块数太多的案例,拼起来太难了):
一开始无有效成绩
成功拼图,使用42步
再次查看英雄榜
可以看见英雄榜已经变成了42
五、系统使用说明
这个游戏使用起来很方便,只需要打开游戏,选择菜单中的新游戏,再选择Easy、Normal或者Hard难度,再选择图片就可以进行游戏。
当然,你也可以在左侧菜单中选择进阶难度(即自定义难度),选择图片后进行游戏。
点击右下角“Exit”或者左上角的叉都可以退出游戏。
如果有需要了解的信息,可以点击菜单中的“关于”和“Help”按钮。
六、实习的收获、心得、问题、困难和建议
作为一个从小就喜欢玩游戏的人,第一次自己做游戏,感觉还是很开心的。
虽然使用的是比较古老的VB语言,但我想编程大体上都是差不多的,主要是自己思想的体现,编程的语言并不重要。
VB相比较C++来说,我感觉是简单不少,大概是VB这种基于事件的编程,更加的直观,理解起来也更加容易一点。
而且C++学习过程中,感觉自己编写的一些程序都不怎么派的上用场,不像这次的VB学习,一开始就要我们做一个游戏,既好玩,又能激发我们学习的兴趣,是一次不错的经历。
而且我一直对游戏编程比较感兴趣,但是却没有仔细去研究过,借这次实习的机会,我又重燃了学习这方面知识的兴趣,很有意义。
这一个游戏,两周的时间,虽然不能说是很好了吧,但是要实现的功能我都自己做出来了,很有成就感。
期间自己一个一个知识点XX,不断的思考该如何去做,一个一个功能去实现,才有了最后的游戏。
我觉得这种通过项目来学习的方式,是比单纯的听老师讲解要好的,听讲是被动的,这样的学习是主动的。
在VB学习中也遇到了不少难题,其中有的问题被我慢慢搞定了,有的却还没有解决。
比如建议功能中可以选择空档图的颜色,这一点我利用CommonDialog可以调出颜色选择框,但是选好了之后,我就不知道怎么把空档图设置成这个颜色了,这不像C++中的OpenCV,可以直接画图,具体的我没有仔细研究。
对这次实习,我的收获很多,但也有一点建议。
比如我觉得我这个游戏,题目中给的建议功能很多都是“垃圾功能”,没有什么设计的意义。
比如“撤销”功能,这游戏本来就是记步数的,撤销就不公平了,而且撤销这个功能,在原图上多点一下就能实现,何必再去单独添加呢。
而那个点了无法移动的图就报警,更是降低了游戏的流畅性,一点错就警告你一次,感觉很麻烦。
附录1:
核心代码及说明
根据输入的M和N分割图片:
PrivateSubCommandNewGame_Click()
DimsumimgAsInteger
M=InputBox("请输入行数M")
N=InputBox("请输入列数N")
CommonDialog1.ShowOpen玩家选择图片
PictureClip1.Picture=LoadPicture(CommonDialog1.FileName)
SavePicturePictureClip1.Picture,"SocPic.jpg"
PictureClip1.Cols=N
PictureClip1.Rows=M
sumimg=M*N
step=0//计数清零
Label2.Caption="步数:
"&step
Fori=0To8‘其他模式的控件框失效并隐藏
Image1(i).Enabled=False
Image1(i).Visible=False
Next
Fori=0To15
Image2(i).Enabled=False
Image2(i).Visible=False
Next
Fori=0To24
Image3(i).Enabled=False
Image3(i).Visible=False
Next
PictureClip1.StretchX=500/N‘控制每个图块的大小
PictureClip1.StretchY=500/M
Fori=0Tosumimg-1'随机产生不重复的M*N个编号(从0到M*N-1)
a0:
X(i)=Int(Rnd*sumimg)
Forj=0Toi-1
IfX(i)=X(j)ThenGoToa0
Next
Next
'Image4(0).Move480,600,7875/M,7875/N
Image4(0).Left=480
Image4(0).Top=600
Image4(0).Visible=True
Image4(0).Height=7875/M
Image4(0).Width=7875/N
Fori=1Tosumimg–1‘动态生成Image空间数组,用以存储每个图块
LoadImage4(i)
IfiModN=0Then
Image4(i).Left=480
Image4(i).Top=7875/M+Image4(i-N).Top
Else
Image4(i).Top=Image4(i-1).Top
Image4(i).Left=Image4(i-1).Left+7875/N
EndIf
Next
Fori=0Tosumimg-1
Image4(i).Enabled=True'使Image1响应鼠标事件
Image4(i).Visible=True
Image4(i).ZOrder0
Image4(X(i)).Picture=PictureClip1.GraphicCell(i)'让图片的9个单元分别赋予9个Image控件
Next
fuc=Rnd*sumimg-1
Image4(fuc).Picture=LoadPicture("")'空位用于移动图片
EndSub
点击图片,移动图片:
PrivateSubImage4_Click(IndexAsInteger)
SelectCaseIndexModN'把M*N个Image控件分成N列
Case0‘点击第一列的情况
IfImage4(Index+1).Picture=LoadPicture("")Then'判断右边是否为空
Image4(Index+1).Picture=Image4(Index).Picture'交换图片
Image4(Index).Picture=LoadPicture("")
win
EndIf
Case1ToN–2‘点击第2~N-1列的情况
IfImage4(Index-1).Picture=LoadPicture("")Then'判断左边是否为空
Image4(Index-1).Picture=Image4(Index).Picture
Image4(Index).Picture=LoadPicture("")
win
EndIf
IfImage4(Index+1).Picture=LoadPicture("")Then'判断右边是否为空
Image4(Index+1).Picture=Image4(Index).Picture
Image4(Index).Picture=LoadPicture("")
win
EndIf
CaseN–1‘点击最后一列的情况
IfImage4(Index-1).Picture=LoadPicture("")Then'判断左边是否为空
Image4(Index-1).Picture=Image4(Index).Picture
Image4(Index).Picture=LoadPicture("")
win
EndIf
EndSelect
SelectCaseIndex\N'把M*N个Image控件分成M行
Case0'当鼠标点击第1行时
IfImage4(Index+N).Picture=LoadPicture("")Then'判断下边是否为空
Image4(Index+N).Picture=Image4(Index).Picture
Image4(Index).Picture=LoadPicture("")
win
EndIf
Case1ToM-2'当鼠标点击第2~M-1行时
IfImage4(Index-N).Picture=LoadPicture("")Then'判断上边是否为空
Image4(Index-N).Picture=Image4(Index).Picture
Image4(Index).Picture=LoadPicture("")
win
EndIf
IfIndex+N IfImage4(Index+N).Picture=LoadPicture("")Then'判断下边是否为空 Image4(Index+N).Picture=Image4(Index).Picture Image4(Index).Picture=LoadPicture("") win EndIf EndIf CaseM-1'当鼠标点击第M行时 IfImage4(Index-N).Picture=LoadPicture("")Then'判断上边是否为空 Image4(Index-N).Picture=Image4(Index).Picture Image4(Index).Picture=LoadPicture("") win EndIf EndSelect EndSub 附录2: 参考文献 1.VB控件数组的使用技巧 2.利用PictureClip进行图像处理
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上海 大学计算机 认识 实习 报告 VB 拼图游戏 资料