扫雷程序方案设计书报告.docx
- 文档编号:22845815
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:26
- 大小:20.79KB
扫雷程序方案设计书报告.docx
《扫雷程序方案设计书报告.docx》由会员分享,可在线阅读,更多相关《扫雷程序方案设计书报告.docx(26页珍藏版)》请在冰豆网上搜索。
扫雷程序方案设计书报告
VisualBasic课程设计报告
名称:
扫雷难度:
四星
设计人:
田林
指导老师:
张小兵
班级:
11082601
学号:
1108260146
时间:
2012.3
南京理工大学能源与动力工程学院
知识点:
(1)控件数组;
(2)绘图;(3)菜单;(4)文本文件的读写;(5)多模块设计;(6)资源文件的使用。
一、功能简介:
(1)启动程序后,进入初始界面(form1),游戏共有3种预定义的难度级别,为初级(9行9列10个雷),中级(16行16列40个雷),高级(16行30列99个雷),还有“自定义”命令,可以自行定义雷区行数,列数和雷数;
(2)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。
在任何情况下单击小脸可以重新开始游戏;
(3)鼠标左击排雷,右击插小旗,打问号;
(4)方格里面的数字表示方格周围的雷数;
(5)扫雷成功时候,调用文件看有没有打破该级别的记录。
二、课程设计的详细设计
(1).绘制方格,使用如下程序:
DimpicfAsNewStdPicture'picf保存图片对象
form1.pic2.ScaleMode=3'以像素为单位
form1.pic2.Cls'图片框清空
Setpicf=LoadPicture(App.Path&"1.bmp")
Fori=0Tom-1
Forj=0Ton-1
form1.pic2.PaintPicturepicf,j*16,i*16'加载图片
Next
Next
(2).放雷的方法:
定义一个二维数组aarMine,行数为inthang,列数为intlie,雷的个数intlei,使用下面的程序来解决:
Randomize
ReDimarrMine(inthang,intlie)
DoWhileint3 col=Int(Rnd*intlie) ln=Int(Rnd*inthang) IfarrMine(ln,col)=FalseThen arrMine(ln,col)=True int3=int3+1 EndIf Loop (3).使用三个pictureclip控件来管理图片: form1.PictureClip1.Picture=LoadPicture(App.Path&"face.bmp") form1.PictureClip1.Rows=1 form1.PictureClip1.Cols=5 form1.PictureClip2.Picture=LoadPicture(App.Path&"number.bmp") form1.PictureClip2.Rows=1 form1.PictureClip2.Cols=12 form1.PictureClip3.Picture=LoadPicture(App.Path&"mine.bmp") form1.PictureClip3.Rows=1 form1.PictureClip3.Cols=15 (4).使用递归过程(fangkai)来开启方格: PrivateSubfankai(ByValint1AsInteger,ByValint2AsInteger) DimhangAsInteger DimlieAsInteger Top: Ifint1-1=0ThenGoToBelow IfSign(int1-1,int2)=FalseThen Sign(int1-1,int2)=True hang=int1-1 lie=int2 GoToDdd EndIf Below: Ifint1=inthangThenGoToLeft IfSign(int1+1,int2)=FalseThen Sign(int1+1,int2)=True hang=int1+1 lie=int2 GoToDdd EndIf Left: Ifint2-1=0ThenGoToRight IfSign(int1,int2-1)=FalseThen Sign(int1,int2-1)=True lie=int2-1 hang=int1 GoToDdd EndIf Right: Ifint2=intlieThenGoToRighttop IfSign(int1,int2+1)=FalseThen Sign(int1,int2+1)=True lie=int2+1 hang=int1 GoToDdd EndIf Righttop: Ifint2=intlieOrint1-1=0ThenGoToLefttop IfSign(int1-1,int2+1)=FalseThen Sign(int1-1,int2+1)=True lie=int2+1 hang=int1-1 GoToDdd EndIf Lefttop: Ifint2=1Orint1-1=0ThenGoToLeftbelow IfSign(int1-1,int2-1)=FalseThen Sign(int1-1,int2-1)=True lie=int2-1 hang=int1-1 GoToDdd EndIf Leftbelow: Ifint2=1Orint1=inthangThenGoToRightbelow IfSign(int1+1,int2-1)=FalseThen Sign(int1+1,int2-1)=True lie=int2-1 hang=int1+1 GoToDdd EndIf Rightbelow: Ifint2=intlieOrint1=inthangThenExitSub IfSign(int1+1,int2+1)=FalseThen Sign(int1+1,int2+1)=True lie=int2+1 hang=int1+1 GoToDdd Else ExitSub EndIf Ddd: Ifleishu(hang,lie)<>0Then pic2.PaintPicturePictureClip3.GraphicCell(15-leishu(hang,lie)),(lie-1)*16,(hang-1)*16 GoToTop Else pic2.PaintPicturePictureClip3.GraphicCell(15),(lie-1)*16,(hang-1)*16 Callfankai(hang,lie) GoToTop EndIf (5).“扫雷英雄榜”分3个文件夹保存(chuji,zhongji,gaoji) Ifinthang=9Andintlie=9Then OpenApp.Path&"\chuji.txt"ForInputAs1 LineInput#1,str1(0) str2(0)=CInt(Left(str1(0),InStr(str1(0),""))) IfintNum InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 ElseIfintlie=16Andinthang=9Then OpenApp.Path&"\zhongji.txt"ForInputAs1 LineInput#1,str1 (1) str2 (1)=CInt(Left(str1 (1),InStr(str1 (1),""))) IfintNum (1))Then InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 ElseIfintlie=30Andinthang=16Then OpenApp.Path&"\gaoji.txt"ForInputAs1 LineInput#1,str1 (2) str2 (2)=CInt(Left(str1 (2),InStr(str1 (2),""))) IfintNum (2))Then InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 EndIf (7).通过数组a()来确定插小旗,同时右上角的雷数随之改变: 先在Module1中定义数组Sign()和a(): ReDimSign(1Tointhang,1Tointlie) ReDima(0Tointhang-1,0Tointlie-1) 然后在form1写如以下程序: IfSign(int1+1,int2+1)=FalseThen a(int1,int2)=a(int1,int2)+1 Ifa(int1,int2)Mod3=1Then pic2.PaintPicturePictureClip3.GraphicCell (1),int2*16,int1*16 k=k-1 EndIf Ifa(int1,int2)Mod3=2Then pic2.PaintPicturePictureClip3.GraphicCell (2),int2*16,int1*16 k=k+1 EndIf Ifa(int1,int2)Mod3=0Then pic2.PaintPicturePictureClip3.GraphicCell(0),int2*16,int1*16 EndIf Ifk>=0Then imglei(0).Picture=form1.PictureClip2.GraphicCell(11-k\100) imglei (1).Picture=form1.PictureClip2.GraphicCell(11-k\10Mod10) imglei (2).Picture=form1.PictureClip2.GraphicCell(11-kMod10) Else imglei(0).Picture=form1.PictureClip2.GraphicCell(0) imglei (1).Picture=form1.PictureClip2.GraphicCell(11+k\10Mod10) imglei (2).Picture=form1.PictureClip2.GraphicCell(11+kMod10) EndIf EndIf 三、调试程序的过程 (1)在写程序时,刚开始自己没有想到要用标准模块来定义全局变量和过程,这样虽然也能实现功能,但增加了调试程序的难度,最后,自己试着运用标准模块来定义,果然收到不同的效果; (2)在显示LED风格的数字时,自己想过要用LoadResPicture函数加载图片并使用PaintPicture方法绘制,而且书上也介绍了相应代码,但自己还是感觉使用PictureClip控件更方便,更容易理解,于是自己便选择了运用后者; (3)在记录游戏成绩时文件打不开,提示信息说是类型不匹配和路径错误,自己调试了好久,现把前后的代码记录如下: 错误的代码: Ifinthang=9andintlie=9Then Open"F: \chuji.txt"ForInputAs1 LineInput#1,str1(0) str2(0)=Left(str1(0),"") IfintNum InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 ElseIfintlie=16andinthang=16Then Open"F: \zhongji.txt"ForInputAs1 LineInput#1,str1 (1) str2 (1)=Left(str1 (1),"") IfintNum (1))Then InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 ElseIfintlie=30andinthang=16Then Open"F: \gaojiji.txt"ForInputAs1 LineInput#1,str1 (2) str2 (2)=Left(str1 (2),"") IfintNum (2))Then InputBox"恭喜你破了本难度的记录! 请留下大名",,"无名侠" EndIf Close1 EndIf EndIf 改过的代码: 如上述课程设计的详细设计中的(5)的代码。 四、课程设计心得 通过该程序,让我充分体会到了理论与实践相结合的重要性.VB课程设计,它不比期末考试与二级考试,它更看重的是应用技巧。 而其,其中有好多的算法和技巧要求了解和掌握,不去问同学或老师,仅凭一己之力,是很难预期完成的。 在编程时的收获不少,除了对编程语言有了更深一步的了解,还有同学之间的友谊加深。 在自己有了困难时,同学或老师的大力帮助,自己真的很感动。 再一次谢谢我的同学和老师。 当然在编程时还有许多经验和教训值得反思,现在自己整理一下: (1)在开始编程之前,要先构思各种功能实现的算法,想好了以后在上机编写,不要急于上机; (2)编程时一定要注意变量的使用,切勿胡乱使用变量。 我在编程时候最大的问题就是变量总是搞错,那就要反复调试,最后才搞清楚变量的含义; (3)编程不要过于复杂,多调用过程; (4)编程过程中,由于自己对理论知识的欠缺,很多方面都很模糊。 自己不得不花大量时间去查阅资料并且整理出来,这充分证明了自己对VB的了解甚少,需要在以后的学习中来完善。 (5)编程结束,自己再多运行,调试几次可能有某个方面自己没注意到,当中得到了很多同学的帮助,我再一次谢谢他们。 五、附件 主要的源代码: Module1: OptionExplicit PublicinthangAsInteger PublicintlieAsInteger PublicintleiAsInteger PubliciAsInteger,jAsInteger,kAsInteger,hAsInteger PublicintNumAsInteger PublicarrMine()AsBoolean,colAsInteger,lnAsInteger Publicint1AsInteger,int2AsInteger PublicSign()AsBoolean Publica()AsInteger PublicSubsub1(mAsInteger,nAsInteger,lAsInteger)'m表示行数,n表示列数,l表示雷数 Dimint3AsInteger form1.pic2.Width=245*n'245是一个小图片的宽度 form1.pic1.Width=245*n form1.pic2.Height=245*m form1.Width=340+form1.pic2.Width form1.Height=1760+form1.pic2.Height form1.image1.Left=form1.pic1.Width/2-375/2'375是image1的Width属性值 DimpicfAsNewStdPicture'picf保存图片对象 form1.pic2.ScaleMode=3 form1.pic2.Cls'图片框清空 Setpicf=LoadPicture("1.bmp") Fori=0Tom-1 Forj=0Ton-1 form1.pic2.PaintPicturepicf,j*16,i*16'加载图片 Next Next form1.pic2.Enabled=True form1.Timer1.Enabled=False'开始时记时器不记时 intNum=0 inthang=m intlie=n intlei=l form1.PictureClip1.Picture=LoadPicture("face.bmp") form1.PictureClip1.Rows=1 form1.PictureClip1.Cols=5 form1.PictureClip2.Picture=LoadPicture("number.bmp") form1.PictureClip2.Rows=1 form1.PictureClip2.Cols=12 form1.PictureClip3.Picture=LoadPicture("mine.bmp") form1.PictureClip3.Rows=1 form1.PictureClip3.Cols=15 form1.image1.Picture=form1.PictureClip1.GraphicCell(4) form1.imglei(0).Picture=form1.PictureClip2.GraphicCell(11-l\100)'得到l的百位 form1.imglei (1).Picture=form1.PictureClip2.GraphicCell(11-l\10Mod10)'得到l的十位 form1.imglei (2).Picture=form1.PictureClip2.GraphicCell(11-lMod10)'得到l的个位 Fori=0To2 form1.imgtime(i).Left=form1.pic1.Width-240-form1.imglei(Abs(i-2)).Left'与时间显示与雷数显示对称 Next form1.imgtime(0).Picture=form1.PictureClip2.GraphicCell(11) form1.imgtime (1).Picture=form1.PictureClip2.GraphicCell(11) form1.imgtime (2).Picture=form1.PictureClip2.GraphicCell(11) Randomize ReDimarrMine(inthang,intlie) DoWhileint3 col=Int(Rnd*intlie) ln=Int(Rnd*inthang) IfarrMine(ln,col)=FalseThen arrMine(ln,col)=True int3=int3+1 EndIf Loop ReDimSign(1Tointhang,1Tointlie) ReDima(0Tointhang-1,0Tointlie-1) k=intlei: h=intlei EndSub form1: OptionExplicit PrivatemAsInteger,nAsInteger PrivateSubimage1_Click() Callsub1(inthang,intlie,intlei) EndSub PrivateSubImage1_MouseUp(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle) image1.Picture=PictureClip1.GraphicCell(4) EndSub PrivateSubImage1_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle) image1.Picture=PictureClip1.GraphicCell(0) imgtime(0).Picture=PictureClip2.GraphicCell(11) imgtime (1).Picture=PictureClip2.GraphicCell(11) imgtime (2).Picture=PictureClip2.GraphicCell(11) Timer1.Enabled=False intNum=0 EndSub PrivateSubend_Click() UnloadfrmMinemain EndSub PrivateSubForm_Load() Callsub1(9,9,10) EndSub PrivateSubbeginne
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扫雷 程序 方案设计 书报