动物保护者 认识实习报告.docx
《动物保护者 认识实习报告.docx》由会员分享,可在线阅读,更多相关《动物保护者 认识实习报告.docx(61页珍藏版)》请在冰点文库上搜索。
![动物保护者 认识实习报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/17/f448bb98-d759-45d9-b4cf-82c8e4aee0b3/f448bb98-d759-45d9-b4cf-82c8e4aee0b31.gif)
动物保护者认识实习报告
总序号:
140
成绩:
计算机认识实习实验报告
专业:
上海大学计算机工程与科学
班级:
姓名:
学号:
计算机工程与科学学院
报告日期2016年6月24日
教师评语:
一、实习目的和要求
计算机认识实习是理论联系实际的重要实践性教学环节。
通过认识实习,了解程序设计的一般过程,树立良好的设计方法,巩固有关计算机软件的知识,加深专业知识的了解,扩大专业知识面,培养和提高发现问题、认识问题、分析问题及解决问题的能力,为有关后续专业课程的学习奠定基础。
本次认识实习要求使用VB6.0设计实现一个简单的游戏软件。
通过VisualBasic语言的使用,体会使用VB进行程序设计的特色,试探用VB开发更为复杂的应用程序;加强高级语言的编程能力,了解计算机软件设计的基本方法和一般步骤。
通过实习,对计算机及计算机软件设计有一个较为全面的认识,培养发现问题、认识问题、分析问题及解决问题的能力,提高自学能力和上机动手能力,并通过查阅资料了解计算机软件开发技术的最新技术和发展趋势。
二、实习内容
综合运用课堂知识,使用VB6.0设计实现一个相对综合的游戏软件——动物保护者,并完成相关功能要求。
游戏概述:
游戏界面为8×8的被大火围困的动物区,随机排列了若干动物。
游戏者单击两个相邻小动物使它们交换位置,如果交换后在同一行同一列出现相邻的同类动物三个或三个以上,表示这些动物可以顺利获救。
小动物闪烁后消失,表示被救出火场。
形成的空位,被上方的动物图标依次落下后填补,最上面的空档由随机产生的动物图标填补。
火势蔓延若干时间后(半分钟或一、两分钟可选)游戏结束。
救出动物数(如图右窗框)最多者获胜。
基本要求:
●能完成概述中的基本功能。
●画面应能实现动画效果。
如:
交换时能在画面上有所表示。
找到获救的动物,消失前应能闪烁等。
也可配上声音表示。
●用时钟或进度条计时。
●动物下落后形成的有效区也应计分。
●主界面为窗口界面,包含菜单栏。
菜单中至少要有“运行”菜单,含“run”命令、“stop”命令;“帮助”菜单,含“Help”命令、“About”命令。
Help内容是操作说明。
About内容是开发者的姓名、学号、日期等。
(见有关要求的说明。
)
建议功能:
●用户可以选择扩大游戏盘面,获救动物个数。
(若大于三个还可以选择排列形状。
)
●选择计时长短,可以记录成绩。
●游戏者可以选择身份:
游戏者、摆擂台者、挑战者。
●游戏者:
作上述一般游戏,可记分。
●设擂台者:
计时、记个数,等待挑战。
●挑战者:
选一个擂台,用计时器、动物个数评分,最后上排行板。
●作者可以自行发挥各种附加功能和游戏规则,只要在你的帮助信息中给出说明。
●用户可以选择其他内容作为本题的素材。
如:
符号图形,小动物图形等。
三、系统概要设计说明,功能模块及流程和工作原理
(1)系统概要设计说明
本系统为一款三消游戏系统,系统中有多种游戏模式可供用户选择,并且设置了得分记录系统和对战系统。
游戏以娱乐为目的,游戏界面简单,操作容易,并有计时模式和不计时模式可选,满足不同用户的游戏需求。
在计时的游戏模式中,以单位时间内得分高低来对不同时间模式的用户得分进行比较,并计入排行榜。
在对抗模式中,用户可以发起挑战或参加挑战,挑战时间均为30秒,通过挑战榜来显示挑战结果。
(2)功能模块及流程
该系统总共划分了五个模块 :
a)初始化模块。
对游戏界面进行初始化操作,根据需求显示或隐藏、启用或禁用部分控件按钮。
b)画图模块。
通过随机算法初始化游戏地图,并在每一格上显示相应的动物图片。
c)动物操作模块。
游戏系统中最主要的模块,用户通过鼠标点击来交换相邻的动物,符合条件后进行消除,下落,并在顶部生成新的动物。
d)计时模块。
使用Timer制作倒计时器记录游戏时间,在计时器归零后结束游戏。
e)得分模块。
在游戏时间结束之后记录用户姓名和得分,并存储在外部txt文件中。
显示得分时,读取外部txt文件中的信息,处理后在排行榜中显示。
图一功能模块流程图
(3)工作原理
通过一个全局变量(modechs)来记录用户选择的模式,并根据模式进行相应的操作。
其中包括:
在计时模式中启动计时器和显示计时文本框、启用得分记录;在非计时模式中禁用计时器并隐藏计时文本框、禁用得分记录,显示combo记录;在发起挑战模式中,记录得分时弹出姓名输入框;在参加挑战模式中,弹出窗体给用户选择想要参加的挑战,并在记录得分时弹出姓名输入框,最后弹出挑战榜,显示挑战结果。
初始化完成之后,生成游戏地图,用户进行操作,启动计时器,给出相应的反馈,最后记录得分。
四、系统详细设计、关键技术与难点、测试数据
(1)系统详细设计
本系统总共使用了6个窗体,其中包括:
主界面,游戏榜,挑战榜,选择挑战,玩法和提示,关于游戏。
大多数主要功能和核心算法都在主界面窗体实现,其余窗体起到辅助作用。
在界面设计上,本系统各窗体(关于游戏除外)采用了较为统一风格的图标和背景。
通过image空间来实现透明按钮,使游戏风格独特,更具观赏性和娱乐性。
(2)关键技术与难点
本系统的关键技术遇难点主要有三消实现和成绩记录(排行榜)。
其中三消实现包括了:
生成地图、判断死地图、交换图标、判断可消除、消除、下落、生成新图标,成绩记录包括了记录成绩和读取成绩。
以下对部分难点进行介绍。
生成地图stnwgame():
首先在主界面窗体声明一个通用的二维数组(8×8),以该数组表示游戏地图,利用Randomize生成0~5的随机整数。
为防止生成地图后立即得分(盘面中有可消除的图标),需要一边生成一边判断数组中的数所在行和列是否有三个或以上相同,若有则重新生成一个和行、列的数都不相同的随机数。
判断死地图BooleanisDie():
理论上是游戏中的重要算法,但测试至今尚未遇到过死地图的情况。
通过扫描数组判断盘面上是否有可消除模型,若有则立即返回False。
交换图标:
在图标控件数组的Click事件中实现。
判断用户点击的两个图标是否在同一行或同一列,若不是则不作出反应,若是交换这两个图标。
交换后,判断本次交换是否可消除,若是则调用相关功能进行消除,若否则调用延时函数并再次交换。
判断可消除BooleanisLine(nAsInteger)和Booleanmapline():
isLine用于判断交换的图标周围是否有可消除模型(连续三个),全部用if语句判断,速度较快。
Mapline用于判断整个地图中是否有可消除模型,用双重循环,速度较慢。
消除remove():
使用辅助二维数组,将可消除的图标标记为-1,并用延时函数和另一个辅助数组做出消除时闪烁的效果。
下落down():
通过四重循环将-1排序到顶部,使用交换标志flag来优化。
成绩记录:
用户将名字输入在输入框中,将本次得分和名字记录在txt文件中,通过逗号进行分割。
读取时也利用换行符和逗号进行分割,将数据存在相关数组中。
在游戏榜中存放数据时,每次找到文件中最小的一次记录和当前成绩比较,若当前成绩较大,则覆盖这次记录;读取时进行冒泡排序,将得分最高的显示在最前面。
在挑战榜中发起挑战时,每次覆盖掉最早的一次记录,将最新成绩记录在最后,并将对手姓名、得分、比赛结果分别设置为NONE、0、NONE。
(3)测试数据
五、系统使用说明
本系统为一个三消游戏系统,菜单栏中有四个按钮:
游戏、排行榜、工具、帮助。
在游戏菜单中,用户可以选择三个游戏模式或退出游戏;在排行榜菜单中;用户可以打开游戏榜或挑战榜,查看记录的游戏成绩和挑战结果;在工具菜单中,用户可以启动系统计算器和记事本;在帮助菜单中,用户可以查看游戏玩法和提示以及关于游戏的信息。
在游戏时,点击火焰图标可以开始一局新游戏。
如果用户选择的是计时游戏模式(时间模式和对抗模式),界面中会出现计时器文本框和暂停按钮,当游戏结束后(或计时为结束时),用户可以点击score按钮记录自己的姓名和本次游戏得分。
如果用户选择的是非计时模式(休闲模式),界面中则不会出现计时框和暂停按钮,score按钮也会被禁用,无法记录得分。
若用户在计时模式中想要切换游戏模式,则必须先按下暂停按钮或等待游戏时间结束。
游戏过程中,得分文本框和计时器文本框都将禁止用户输入任何数据。
用户按下暂停按钮后,棋盘上的动物图标将会被隐藏,计时器也将暂停,直到再次按下暂停按钮后恢复。
在用户输入自己的姓名时,只可以输入英文字符和数字,过长的字符串可能显示不完整。
六、实习的收获、心得、问题、困难和建议
经过这次的实习,我觉得自己已经基本掌握了用VB设计简单软件的方法。
由于上课只有三次,课堂上教的内容非常有限,因此大多数内容我都是在网上一边搜索一边学习才掌握的。
VB是一门简单易用的语言,语法规则并不复杂,各功能模块也很简单,上手非常快。
尤其在实现界面上相当直观迅速,大约两个小时左右就可以完成最简单的基本界面,之后只需要编写代码和美化就可以了。
虽然这次实习是我第一次自己制作游戏,但由于做的是一款平时玩得非常多的三消游戏,因此在功能分析和设计上没有太大困难,相对容易地设计出了关键步骤及其核心算法。
一开始写的几个sub和function代码量比较大,加上对语法还不太适应,调试修改了多次才完成,使得早期的进度比较慢。
特别是由于控件数组的两个图标贴反了而迟迟没有发现,为程序的查错带来了很大的困难。
在这些问题修正之后,之后的进展就快了很多,基本上是边学边做,写完一部分就立刻进行调试,也取得了比较好的效果。
在界面设计方面,因为希望游戏界面能够比较美观,并且有一定的风格,因此花费了一定的时间来设计图标和背景图,完成之后的效果我自己也非常满意。
设计这个游戏界面的时候希望窗体和按钮都能尽可能地少,这样能够使用户在玩游戏的时候操作更方便,大多数的操作都只需要在主界面窗口里就可以完成。
而这也需要玩家仔细阅读玩法说明,才能更快地上手。
制作游戏的大多数问题和困难都可以在网上搜索解决,尤其是一些博客分享的经验教程,往往比编程书更有用。
相比之下,三次上课的内容就显得有些枯燥,且内容过于简单,平白浪费了很多时间。
实际上仅仅经过几次讲课也并不能记住VB的具体用法,在编程时自己查阅老师留的PPT反而比上课更有意义。
希望老师在上课时可以少讲一些基本语法,多讲一些设计游戏的方法,以及VB比较独特的用法,尤其是控件数组和界面设计。
附录1:
核心代码及说明
Substnwgame()'生成地图
Dimi,j,nAsInteger
Fori=0To7
Forj=0To7
Randomize
a(i,j)=Int(Rnd*6)
Dimfind3i,find3jAsBoolean'行、列重复标志
Ifj>=2Then
Ifa(i,j-1)=a(i,j-2)Then
find3j=True
Else
find3j=False
EndIf
Else
find3j=False
EndIf
Ifi>=2Then
Ifa(i-1,j)=a(i-2,j)Then
find3i=True
Else
find3i=False
EndIf
Else
find3i=False
EndIf
If(find3i=False)And(find3j=False)Then
'donothing
ElseIf(find3j=True)And(find3i=False)Then
a(i,j)=ranexcept(a(i,j-1),a(i,j-1))
ElseIf(find3j=False)And(find3i=True)Then
a(i,j)=ranexcept(a(i-1,j),a(i-1,j))
Else
a(i,j)=ranexcept(a(i-1,j),a(i,j-1))
EndIf
Nextj
Nexti
Forn=0To63
Callloadpic(n)
Nextn
EndSub
Subremove()'消除操作
Dimb(7,7)AsBoolean'辅助数组,存放可消标志
Dimi,jAsInteger
DimtempAsInteger
Dimc(0To63)AsInteger'辅助数组,记录可消位置
DimfinAsInteger
Dimflag(0To63)AsInteger'辅助数组,存放原有图片信息
Fori=0To7
Forj=0To7
b(i,j)=False
Nextj
Nexti
Fori=0To7
Forj=0To7
Ifi<7-1Then
Ifa(i,j)=a(i+1,j)Anda(i,j)=a(i+2,j)Then
b(i,j)=True
b(i+1,j)=True
b(i+2,j)=True
EndIf
EndIf
Ifj<7-1Then
Ifa(i,j)=a(i,j+1)Anda(i,j)=a(i,j+2)Then
b(i,j)=True
b(i,j+1)=True
b(i,j+2)=True
EndIf
EndIf
Nextj
Nexti
fin=0
Fori=0To7
Forj=0To7
Ifb(i,j)Then
c(fin)=i*8+j
fin=fin+1
EndIf
Nextj
Nexti
Fori=0Tofin
flag(i)=-1
Nexti
Fori=0To4'通过循环和延时函数实现消除时闪烁效果
Forj=0Tofin-1
temp=a(c(j)\8,c(j)Mod8)
a(c(j)\8,c(j)Mod8)=flag(j)
flag(j)=temp
Callloadpic(c(j))
Nextj
CallSleep2(150)
Nexti
score=score+fin'记录得分
Text2.Text=score
EndSub
Subdown()'下降操作,用排序将-1排到顶部
CallSleep2(100)
Dimi,j,k,lAsInteger
DimflagAsBoolean
Forl=0To7
flag=True
Forj=0To7
Fori=7To0Step-1
Ifa(i,j)=-1Then
Fork=iTo1Step-1
a(k,j)=a(k-1,j)
Nextk
a(0,j)=-1
flag=False
EndIf
Nexti
Nextj
Ifflag=TrueThenExitFor
Nextl
Fori=0To7
Forj=0To7
Callloadpic(i*8+j)
Nextj
Nexti
EndSub
FunctionisLine(nAsInteger)AsBoolean'判断点击位置周围是否可消
DimiAsInteger
DimjAsInteger
i=n\8
j=nMod8
Ifj<6Then
Ifa(i,j)=a(i,j+1)Anda(i,j)=a(i,j+2)Then
isLine=True
ExitFunction
EndIf
EndIf
Ifj>1Then
Ifa(i,j)=a(i,j-1)Anda(i,j)=a(i,j-2)Then
isLine=True
ExitFunction
EndIf
EndIf
Ifj>0Andj<7Then
Ifa(i,j)=a(i,j+1)Anda(i,j)=a(i,j-1)Then
isLine=True
ExitFunction
EndIf
EndIf
Ifi<6Then
Ifa(i,j)=a(i+1,j)Anda(i,j)=a(i+2,j)Then
isLine=True
ExitFunction
EndIf
EndIf
Ifi>1Then
Ifa(i,j)=a(i-1,j)Anda(i,j)=a(i-2,j)Then
isLine=True
ExitFunction
EndIf
EndIf
Ifi>0Andi<7Then
Ifa(i,j)=a(i+1,j)Anda(i,j)=a(i-1,j)Then
isLine=True
ExitFunction
EndIf
EndIf
isLine=False
EndFunction
Functionmapline()AsBoolean'判断盘面中是否可消
Dimi,jAsInteger
Fori=0To7
Forj=0To7
Ifi<7-1Then
Ifa(i,j)=a(i+1,j)Anda(i,j)=a(i+2,j)Then
mapline=True
ExitFunction
EndIf
EndIf
Ifj<7-1Then
Ifa(i,j)=a(i,j+1)Anda(i,j)=a(i,j+2)Then
mapline=True
ExitFunction
EndIf
EndIf
Nextj
Nexti
mapline=False
EndFunction
PrivateSubPicture3_Click(IndexAsInteger)'动物图标操作
DimnAsInteger
Ifsecond=0Then'时间为0时点击无效
ExitSub
EndIf
Ifchs1=-1Then
chs1=Index'记录第一次点击下标
Else
Ifchs2=-1Thenchs2=Index'记录第二次点击下标
EndIf
Ifchs1<>-1Andchs2<>-1Then'若已点击两次
IfAbs(chs1-chs2)=1OrAbs(chs1-chs2)=8Then'判断两次点击是否相邻
Callswap(chs1,chs2)
IfisLine(chs1)=FalseAndisLine(chs2)=FalseThen
CallSleep2(200)
Callswap(chs1,chs2)'can'tswap
Else
combo=0'初始化combo
Do
Callremove
Calldown
Callfall
DoWhileisDie=True
Callstnwgame
Loop
combo=combo+1
LoopWhile(mapline=True)
EndIf
Else
'Can'tmove
EndIf
chs1=-1
chs2=-1
EndIf
Ifmodechs=4Then'在休闲模式下显示连击提醒和休息提醒
Ifcombo<2Then
Image3.Picture=Nothing
ElseIfcombo=2Then
Image3.Picture=LoadPicture(App.Path&"\pic\nice.gif")
ElseIfcombo=3Then
Image3.Picture=LoadPicture(App.Path&"\pic\great.gif")
ElseIfcombo=4Then
Image3.Picture=LoadPicture(App.Path&"\pic\excellent.gif")
Else
Image3.Picture=LoadPicture(App.Path&"\pic\amazing.gif")
EndIf
Ifscore-scorewarn>300Then
MsgBox"玩累了,休息一下?
"
scorewarn=score
EndIf
EndIf
EndSub
PrivateSubImage1_Click()'score按钮,记录得分
Ifmodechs=4Then'休闲模式下不可用
ExitSub
ElseIfmodechs=5Then
Callstartfight
ExitSub
ElseIfmodechs=6Then
Callattendfight
ExitSub
EndIf
DimnameAsString
Dims()AsString
Dimi,mindexAsInteger
DimminAsLong
Dimc(0To9)AsLong
OpenApp.Path&"\data\record.txt"ForBinaryAs#1
s=Split(Input(LOF
(1),#1),vbCrLf)
min=Val(s(0))
mindex=0
Fori=1To9
c(i)=Val(s(i))
Ifc(i)min=c(i)
mindex=i
EndIf
Nexti
Ifscore>minThen'若大于已存成绩中的最小值,则覆盖它
name=InputBox("请输入你的名字(仅数字和字母):
")
s(mindex)=sco