VB课程设计:拼图游戏

上传人:痛*** 文档编号:188876158 上传时间:2023-02-20 格式:PDF 页数:9 大小:597.38KB
收藏 版权申诉 举报 下载
VB课程设计:拼图游戏_第1页
第1页 / 共9页
VB课程设计:拼图游戏_第2页
第2页 / 共9页
VB课程设计:拼图游戏_第3页
第3页 / 共9页
资源描述:

《VB课程设计:拼图游戏》由会员分享,可在线阅读,更多相关《VB课程设计:拼图游戏(9页珍藏版)》请在装配图网上搜索。

1、 Visual Basic课程设计报告 题目 1:拼图游戏 难度:*指导教师:姓 名:学 号:专 业:$班 级:学 院:日 期:1 题目简介(1)本题目要求设计一个拼图游戏程序,要求如下:指定一幅完整的图片,将其分割成 m*n 个小图块,打乱后重新排列,其中有一个没有图片的“空当”如图 (2)使用鼠标单击与空当相邻的图块可以与其互换位置。(3)利用空当位置使原图恢复原来的顺序,并记下玩家的移动步数,游戏过程中可以查看参考图以方便顺利通过游戏。2、设计思路与总体方案 本程序包含五个窗体模块,其中以窗体 frmMain的作用最为主要,该模块负责加载选定的图片并按所选的行列数分割,进行随机排列并加载

2、空当,实现鼠标点击时其中的图块时与相邻的空当进行替换,实现拼图完成这个结束动作。该模块中主要的变量有 Rows,Cols,Arrange(),space,started,steps showref Function isOK()其中,Rows,Cols,showref 这三个为全局变量,分别表示行数,列数,以及是否显示参考图(因此 showref 为逻辑型变量)其余变量为模块级变量,started 也为逻辑变量,负责显示游戏是否已开始,Arrange()数组表示联系图像控件与数组的关系,space 显示空当的位置,steps 来记录玩家所走的步数,Function isOK()用来检验拼图是否

3、已经完成的函数,为逻辑性变量。除外,过程变量 tt(0 to2),b(0 to 2),s,r,c 用来写入或读取排行榜中的记录。其中,还设有菜单栏,通过 CommonDialog 控件负责实现“打开图片”与“配置颜色”对话框,并同时还拥有打开 frmRecod(排行榜窗体模块)的工能。主要代码(游戏初始时加载图片):Dim i As Integer Dim n As Integer =图片文件(*.JPG,*.BMP)|*.jpg;*.bmp =打开图片 =&pics (显示指定图片对话框)If =Then Exit Sub If started Then For i=1 To Rows*Co

4、ls-1 (清除已有的控件数组元素)Unload imgPT(i)Next imgPT(0).Picture=LoadPicture()If showref Then =LoadPicture()Else =LoadPicture()End If 1,Me (显示指定行列对话框)=LoadPicture =Rows =Cols n=Rows*Cols imgPT(0).Width=320/Cols (窗体以像素为单位)imgPT(0).Height=240/Rows 窗体 frmDivide载入图片后弹出此窗口,负责提示玩家进行图片行列数的选择,用以调节游戏等级,可分为 3*3,3*4,4*3

5、,4*4 这四种模式。玩家通过两个 VScroll 控件调节 TextBox 中的行列数,通过 =,=赋值语句来与 frmMain 模块进行数值传递。窗体 frmRef通过窗体 frmMain 中的“显示参考图”按钮来显示玩家游戏时的所需的参考图,frmMain通过 showref=Not showref If showref Then Load frmRef =+=关闭参考图 Else Unload frmRef =显示参考图 来打开这个模块以显示参考图,通过对逻辑变量 showref 的非运算加载该模块,设置高度与宽度。窗体 frmRecord 用来显示玩家通过游戏后所处的名次,姓名,移动

6、步数,难度(行数 X 列数),并且只有名次在大于系统默认前三名的状况下才能被录 入 排 行 榜,否 则 会 弹 出“完 成,你 未 进 入 前 三 名!”的 提 醒 框。代码如下:Open&For Input As#1 For l=0 To 2 Input#1,tt(l),b(l),r(l),c(l)(依次读入步数,姓名,行数,列数)Next Close#1 If s=tt(1)Then tt(2)=s:b(2)=InputBox(请输入姓名:,输入框,无名侠):r(2)=Rows:c(2)=Cols:MsgBox 完成,恭喜&b(2)&你成为第三名!,vbInformation If s=t

7、t(0)Then tt(2)=tt(1):tt(1)=s:b(2)=b(1):b(1)=InputBox(请输入姓名:,输入框,无名侠):r(2)=r(1):r(1)=Rows:c(2)=c(1):c(1)=Cols:MsgBox 完成,恭喜&b(1)&你成为第二名!,vbInformation If s tt(0)Then tt(2)=tt(1):tt(1)=tt(0):tt(0)=s:b(2)=b(1):b(1)=b(0):b(0)=InputBox(请输入姓名:,输入框,无名侠):r(2)=r(1):r(1)=r(0):r(0)=Rows:c(2)=c(1):c(1)=c(0):c(0)

8、=Cols:MsgBox 完成,恭喜&b(0)&你成为第一名!,vbInformation (通过以上的 IF 语句先比较出步数在系统默认下的的名次,再通过赋值语句进行排名,同时将姓名,行数,列数也进行赋值处理同步于步数的名次变化,优点是不需建立多维数组进行储存)Open&For Output As#1 For l=0 To 2 Write#1,tt(l),b(l),r(l),c(l)Next Close#1 Else MsgBox 完成,你未进入前三名!,vbInformation End If 窗体 frmHelp 用以显示对本游戏的提示,用以解释游戏无法顺利进行的原因,详情请见(4、设计

9、中尚存的不足分析)。主要代码:Image2(0).Picture=LoadPicture&Resource)(加载图片)3、对重点(难点)问题的解决 窗体模块 frmMain 为主要载体,也是该程序的难点所在,其中的PictureClip控件在我看来是最主要的,他负责管理打开的图片并将其分割为指定行列的小图块。CommonDialog 控件负责实现“打开图片”与“配置颜色”对话框。Image 控件数组用于显示图片,其中他的 Stretch 属性设计为 True,可以使图片自动放大或缩小,方便玩家自由选择图片进行游戏。主窗体重点(难点 1)随机排列图片 解决方案:利用 j=Int(Rnd*n)产

10、生的随机数(0n-1)同时通过 Arrange赋值给,来传递给 imgPT()进行图片的随机分布。例如:Arrange(3)=9 imgPT(i).Picture=(Arrange(3)因此,该随机排列图片过程的代码如下:Private Sub Rnd_Arrange()Dim i As Integer,j As Integer Dim n As Integer n=Rows*Cols ReDim Arrange(0 To n-1)For i=0 To n-1 Arrange(i)=-1(用-1 标记未赋值的元素)Next i=0 Do j=Int(Rnd*n)(产生 0n-1 的随机数,并用

11、 Arrange 赋值)If Arrange(j)=-1 Then Arrange(j)=i i=i+1 If i=n Then Exit Do End If Loop For i=1 To n-1 Load imgPT(i)Next For i=0 To n-1 If Arrange(i)n-1 Then(将图块赋给控件数组元素)imgPT(i).Picture=(Arrange(i)Else imgPT(i).Picture=LoadPicture()space=I(将“打乱”前图片右下角的图块设为空)End If Next End Sub 难点(2)当你单击图片时判断是否与空当相邻并进行

12、移动。解决方法:计算这两者分别所处的行列,利用 IF 语句进行判断,通过改变Image的Index值来改变所显示的图片,而非移动这个控件。该过程代码如下:c1=space Mod Cols (计算空档的行列)r1=space Cols c2=Index Mod Cols (计算点击的行列)r2=Index Cols If Abs(c1-c2)=1 And Abs(r1-r2)=0 Or Abs(c1-c2)=0 And Abs(r1-r2)=1 Then (判断是否相邻)n=Arrange(Index)Arrange(Index)=Arrange(space)Arrange(space)=n

13、imgPT(space)=(Arrange(space)imgPT(Index)=LoadPicture()(进行替换)难点(3)判定拼图结束 If isOK()Then MsgBox 恭喜,完成拼图!共用了&steps&步。For i=1 To Rows*Cols-1 imgPT(i).Enabled=False 解决方法:上述代码表示游戏过程中可利用Function isOK()来检验玩家是否已经完成游戏,检验过程代码如下:Dim i As Integer For i=0 To Cols*Rows-1 If Arrange(i)i Then Exit For Next If i=Cols*

14、Rows Then isOK=True (isOK=True 时,IF 语句运行使得游戏结束)4、设计中尚存的不足分析 本游戏中的图片排列顺序为随机排列,虽然代码简易,同时可以得到较为随机的乱序图片外,50%的几率会出现下面这一个意想不到的问题奇排列在偶数次移动后无法转化为偶排列。(拼图最后两块的位置颠倒且无法逆转)如 a,b 图所示,图中的 a 是 3*3 数字拼图标准的结果,则对于图 b 的状态是不可能变换成a 的。证明起来需要用到高等代数里逆序数的概念,具体的说是用到了一个简单的定理。定义:在一个 1,2,.,n 的排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么

15、它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列 推论:数列进行偶数次相邻对换,数列的奇偶性不改变 我们将空格看成数字 9(数字 9 对应空位),按正常顺序看a 图,9 个数字排列是 9,其逆序数是 0,是偶排列;b 图是 9,逆序数是 1,是奇排列。我们知道,我们能够移动空块相邻的块,这里的移动相当于一种特殊的对换(相邻对换),例如:对于 b 图,移动 6 就相当于 9 和 6 互换(9 向上移动了),移动 7 就相当于 9 和 7 互换(9 向左移动了)。现在假设从 b 图经过一系列的平移变到了 a 图,则空格块 9

16、 必然移动(对换)了偶数次(向左一次必然要再向右一次回来,向上一次必然要向下再回来,最终才能够回到右下角的位置),根据上面的定理最终变成的排列必然是仍然是奇排列(和 b 相同),然而 a 图是偶排列,因而产生矛盾,因此 b 图不可能通过平移变成最终的 a 图。这种现象主要是由于在打乱图片顺序时是用随机法实现的,这种方法会带来 50%无法通过游戏的概率,因此,此游戏需要设计一个板块三轮换的算法来进行有效解决,由于个人能力,时间有限,因此只能暂时提出此问题供后人发现解 决。5、心得体会 这个仅仅只有三颗星的设计题目着实让我摸索了很久,先是一开始窗体模块frmMain 中代号为 PC 的控件一不小心

17、变成了 PctureBox,醒悟的我从 VB 本身调出 PctureClip 控件将其代替,不过最困难的莫过于对 Arrange,imgPT()这三个数组关系的调整来使整个游戏正确运行,并弄懂如何交换相邻的图块和空当,而且本着身为游戏制作者的我在题目中的Pics 文件中更新了数张新的图片(二战,动漫,战争主题),来提高玩家游戏的兴趣,同时附加排行榜功能,方便玩家查询自己的历史成绩。最后我更体会到成为一名程序设计人员的艰辛,不仅要在书写代码上费时费力,一旦程序出现误差,对程序的校正与检查对设计人员来讲更是困难重重。为此,我以后一定要谦虚的学习并熟练使用各种办公领域的软件,认真的对待,正确的使用这些软件,不忘那些程序设计者背后的艰辛。6、参考文献 1.王栋,visual basic课程设计(2),北京,清华大学出版社 2.王栋,visual basic程序设计实用教程(4),北京,清华大学出版社 3.Visual Basic 程序开发 触类旁通百例,机械工业出版社!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!