vb课程设计:拼图游戏

vb课程设计:拼图游戏

ID:9014983

大小:342.39 KB

页数:9页

时间:2018-04-15

上传者:U-5097
vb课程设计:拼图游戏_第1页
vb课程设计:拼图游戏_第2页
vb课程设计:拼图游戏_第3页
vb课程设计:拼图游戏_第4页
vb课程设计:拼图游戏_第5页
资源描述:

《vb课程设计:拼图游戏》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

VisualBasic课程设计报告题目1:拼图游戏难度:***指导教师:姓名:学号:专业:班级:学院:日期: 1.题目简介(1)本题目要求设计一个拼图游戏程序,要求如下:指定一幅完整的图片,将其分割成m*n个小图块,打乱后重新排列,其中有一个没有图片的“空当”如图————(2)使用鼠标单击与空当相邻的图块可以与其互换位置。(3)利用空当位置使原图恢复原来的顺序,并记下玩家的移动步数,游戏过程中可以查看参考图以方便顺利通过游戏。1 2、设计思路与总体方案本程序包含五个窗体模块,其中以窗体frmMain的作用最为主要,该模块负责加载选定的图片并按所选的行列数分割,进行随机排列并加载空当,实现鼠标点击时其中的图块时与相邻的空当进行替换,实现拼图完成这个结束动作。该模块中主要的变量有Rows,Cols,Arrange(),space,started,stepsshowrefFunctionisOK()其中,Rows,Cols,showref这三个为全局变量,分别表示行数,列数,以及是否显示参考图(因此showref为逻辑型变量)其余变量为模块级变量,started也为逻辑变量,负责显示游戏是否已开始,Arrange()数组表示联系图像控件与数组的关系,space显示空当的位置,steps来记录玩家所走的步数,FunctionisOK()用来检验拼图是否已经完成的函数,为逻辑性变量。除外,过程变量tt(0to2),b(0to2),s,r,c用来写入或读取排行榜中的记录。其中,还设有菜单栏,通过CommonDialog控件负责实现“打开图片”与“配置颜色”对话框,并同时还拥有打开frmRecod(排行榜窗体模块)的工能。主要代码(游戏初始时加载图片):DimiAsIntegerDimnAsIntegerCD.Filter="图片文件(*.JPG,*.BMP)|*.jpg;*.bmp"CD.DialogTitle="打开图片"CD.InitDir=App.Path&"pics"CD.ShowOpen(显示指定图片对话框)IfCD.FileName=""ThenExitSubIfstartedThenFori=1ToRows*Cols-1'(清除已有的控件数组元素)UnloadimgPT(i)NextimgPT(0).Picture=LoadPicture()IfshowrefThenfrmRef.Image1.Picture=LoadPicture()ElseMe.Picture=LoadPicture()EndIffrmDivide.Show1,Me'(显示指定行列对话框)PC.Picture=LoadPicture(CD.FileName)PC.Rows=RowsPC.Cols=Colsn=Rows*ColsimgPT(0).Width=320/Cols('窗体以像素为单位)2 imgPT(0).Height=240/Rows窗体frmDivide载入图片后弹出此窗口,负责提示玩家进行图片行列数的选择,用以调节游戏等级,可分为3*3,3*4,4*3,4*4这四种模式。玩家通过两个VScroll控件调节TextBox中的行列数,通过Text1.Text=VScroll1.ValueText2.Text=VScroll2.ValuefrmMain.Rows=Text1.Text,frmMain.Cols=Text2.Text赋值语句来与frmMain模块进行数值传递。窗体frmRef通过窗体frmMain中的“显示参考图”按钮来显示玩家游戏时的所需的参考图,frmMain通过showref=NotshowrefIfshowrefThenLoadfrmReffrmRef.Image1.Picture=PC.PicturefrmRef.Top=Me.TopfrmRef.Left=Me.Left+Me.WidthfrmRef.ShowcmdShowRef.Caption="关闭参考图"ElseUnloadfrmRefcmdShowRef.Caption="显示参考图"来打开这个模块以显示参考图,通过对逻辑变量showref的非运算加载该模块,设置高度与宽度。窗体frmRecord用来显示玩家通过游戏后所处的名次,姓名,移动步数,难度(行数X列数),并且只有名次在大于系统默认前三名的状况下才能被录入排行榜,否则会弹出“完成,你未进入前三名!”的提醒框。代码如下:OpenApp.Path&"Record.txt"ForInputAs#1Forl=0To23 Input#1,tt(l),b(l),r(l),c(l)(依次读入步数,姓名,行数,列数)NextClose#1Ifs=tt(1)Thentt(2)=s:b(2)=InputBox("请输入姓名:","输入框","无名侠"):r(2)=Rows:c(2)=Cols:MsgBox"完成,恭喜"&b(2)&"你成为第三名!",vbInformationIfs=tt(0)Thentt(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)&"你成为第二名!",vbInformationIfsn-1Then(将图块赋给控件数组元素)imgPT(i).Picture=PC.GraphicCell(Arrange(i))ElseimgPT(i).Picture=LoadPicture()space=I(将“打乱”前图片右下角的图块设为空)EndIfNextEndSub难点(2)——————————当你单击图片时判断是否与空当相邻并进行移动。解决方法:计算这两者分别所处的行列,利用IF语句进行判断,通过改变Image的Index值来改变所显示的图片,而非移动这个控件。该过程代码如下:c1=spaceModCols(计算空档的行列)r1=spaceColsc2=IndexModCols(计算点击的行列)r2=IndexColsIfAbs(c1-c2)=1AndAbs(r1-r2)=0OrAbs(c1-c2)=0AndAbs(r1-r2)=1Then(判断是否相邻)n=Arrange(Index)Arrange(Index)=Arrange(space)Arrange(space)=nimgPT(space)=PC.GraphicCell(Arrange(space))imgPT(Index)=LoadPicture()(进行替换)难点(3)———————————————判定拼图结束IfisOK()ThenMsgBox"恭喜,完成拼图!共用了"&steps&"步。"'Fori=1ToRows*Cols-1imgPT(i).Enabled=False解决方法:上述代码表示游戏过程中可利用FunctionisOK()来检验玩家是否已经完成游戏,检验过程代码如下:DimiAsIntegerFori=0ToCols*Rows-1IfArrange(i)<>iThenExitForNextIfi=Cols*RowsThenisOK=True(isOK=True时,IF语句运行使得游戏结束)4、设计中尚存的不足分析本游戏中的图片排列顺序为随机排列,虽然代码简易,同时可以得到较为随6 机的乱序图片外,50%的几率会出现下面这一个意想不到的问题————奇排列在偶数次移动后无法转化为偶排列。(拼图最后两块的位置颠倒且无法逆转)如a,b图所示,图中的a是3*3数字拼图标准的结果,则对于图b的状态是不可能变换成a的。证明起来需要用到高等代数里逆序数的概念,具体的说是用到了一个简单的定理。定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列推论:数列进行偶数次相邻对换,数列的奇偶性不改变我们将空格看成数字9(数字9对应空位),按正常顺序看a图,9个数字排列是123456789,其逆序数是0,是偶排列;b图是123456879,逆序数是1,是奇排列。我们知道,我们能够移动空块相邻的块,这里的移动相当于一种特殊的对换(相邻对换),例如:对于b图,移动6就相当于9和6互换(9向上移动了),移动7就相当于9和7互换(9向左移动了)。现在假设从b图经过一系列的平移变到了a图,则空格块9必然移动(对换)了偶数次(向左一次必然要再向右一次回来,向上一次必然要向下再回来,最终才能够回到右下角的位置),根据上面的定理最终变成的排列必然是仍然是奇排列(和b相同),然而a图是偶排列,因而产生矛盾,因此b图不可能通过平移变成最终的a图。这种现象主要是由于在打乱图片顺序时是用随机法实现的,这种方法会带来50%无法通过游戏的概率,因此,此游戏需要设计一个板块三轮换的算法来进行有效解决,由于个人能力,时间有限,因此只能暂时提出此问题供后人发现解决。7 5、心得体会这个仅仅只有三颗星的设计题目着实让我摸索了很久,先是一开始窗体模块frmMain中代号为PC的控件一不小心变成了PctureBox,醒悟的我从VB本身调出PctureClip控件将其代替,不过最困难的莫过于对Arrange,PC.GraphicCell,imgPT()这三个数组关系的调整来使整个游戏正确运行,并弄懂如何交换相邻的图块和空当,而且本着身为游戏制作者的我在题目中的Pics文件中更新了数张新的图片(二战,动漫,战争主题),来提高玩家游戏的兴趣,同时附加排行榜功能,方便玩家查询自己的历史成绩。最后我更体会到成为一名程序设计人员的艰辛,不仅要在书写代码上费时费力,一旦程序出现误差,对程序的校正与检查对设计人员来讲更是困难重重。为此,我以后一定要谦虚的学习并熟练使用各种办公领域的软件,认真的对待,正确的使用这些软件,不忘那些程序设计者背后的艰辛。6、参考文献[1].王栋,visualbasic课程设计(2),北京,清华大学出版社[2].王栋,visualbasic程序设计实用教程(4),北京,清华大学出版社[3].VisualBasic6.0程序开发触类旁通百例,机械工业出版社8

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭