VB课程设计报告—拼图游戏知识点:控件数组,公共对话框控件,PictureClip控件,多模块程序设计,图片的应用。
1.题目介绍“拼图”是一种老少皆宜、容易上手的益智类小游戏,本题目要求编制一个拼图游戏程序。
使用方法如下:(1)指定一幅图片,将其分割成m × n 个小图块并且打乱顺序后重新排列,其中有一块没有图块的“空挡”。
(2)使用鼠标单击与空挡相邻的图块使该图块与空挡的位置互换。
(3)利用空挡位置移动各图块,最终恢复图片原貌,完成拼图。
移动的步数越少则说明游戏者的水平越高。
游戏过程中,可以打开参考图帮助找到正确的位置。
2.功能要求(1)运行程序,在进入游戏之前显示一个背景图片。
(2)选择菜单中的“打开图片”命令,显示打开图片对话框,“打开图片”对话框使用公共对话框控件实现,并且只能指定以*.jpg *.bmp 为扩展名的文件。
可以在查看菜单中选着“缩略图”进行预览。
(3)选择图片之后,程序弹出“指定行列数”对话框,提示将图片分几行几列。
使用微调按钮可以调节行数和列数,限制在3-7之间。
(4)指定行列数之后,单击确定返回主窗口,程序自动按照指定的行列数将图片进分割,然后随机排列。
(5)打乱的图片中一空挡位置,用户单击与空挡相邻的图块可以与其互换位置。
点击了空挡或者与其不相邻的,程序不做任何操作。
原图只少右下角的图块。
(6)图片复原时,程序显示消息框表示祝贺,同时显示游戏共使用的步数。
(7)游戏过程中,如果用户希望参考原图,可以单击“显示原图”按钮,打开“参考图”窗口。
(8)窗体中的背景颜色可以改变,从菜单中选择“背景颜色”命令,弹出“颜色”飞、公共对话框,用户从中选择一颜色即可。
(9)在游戏过程中或在完成后,均可退出程序或选择“打开图片”菜单命令重新开始一个新图片。
(10)“参考图”窗口应是一个非模态窗口,在关闭主窗口时同时卸载,而不是隐藏,否则该程序不会完全关闭,仍会驻留内存。
3.程序设计概述:(1)PictureClip 控件来管理打开图片并将其分为指定的行列图块,其Picture、Rows、Cols等属性值应在程序中设定。
(2)使用image控件数组来显示图块,设计时只需在窗体上放置一个image控件并将其的index设为0 ,其他的用load语句加载。
(3)“打开图片”和“颜色”对话框commondialog控件实现。
设置其filter属性使之只能打开bmp和jpg类型的图片文件。
(4)将image控件的stretch属性设计为TRUE。
重点:(1)随机排列图片Private Sub Rnd_Arrange() '随机排列图块Dim i As Integer, j As IntegerDim n As Integern = Rows * ColsReDim Arrange(0 To n - 1)For i = 0 To n - 1Arrange(i) = -1 '用-1标记未赋值的元素Nexti = 0Do '给数组Arrange随机赋值j = Int(Rnd * n) '产生0~n-1的随机数If Arrange(j) = -1 ThenArrange(j) = ii = i + 1If i = n Then Exit DoEnd IfLoopFor i = 1 To n - 1 '加载控件数组元素Load imgPT(i)NextFor i = 0 To n - 1If Arrange(i) <> n - 1 ThenimgPT(i).Picture = PC.GraphicCell(Arrange(i)) '将图块赋给控件数组元素ElseimgPT(i).Picture = LoadPicture() '将“打乱”前图片右下角的图块设为空 space = iEnd IfNextEnd Sub(2)判断被单击的图片是否与空挡相邻,Private Sub imgPT_Click(Index As Integer)Dim r1 As Integer, c1 As IntegerDim r2 As Integer, c2 As IntegerDim n As IntegerDim i As IntegerIf Not started Then Exit Subc1 = space Mod Cols '计算空档的行列r1 = space \ Colsc2 = Index Mod Cols '计算点击的行列r2 = Index \ ColsIf 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) = nimgPT(space) = PC.GraphicCell(Arrange(space))imgPT(Index) = LoadPicture()space = Indexsteps = steps + 1txtStep.Text = stepsIf isOK() ThenMsgBox "恭喜,完成拼图!共用了" & steps & "步。
", vbInformation '判断是否拼完,如果已完成For i = 1 To Rows * Cols - 1imgPT(i).Enabled = False '拼图完成时,使鼠标点击失效NextEnd IfEnd IfEnd Sub(3)判断是否已经拼完Private Function isOK() As Boolean '判断是否拼完Dim i As IntegerFor i = 0 To Cols * Rows - 1If Arrange(i) <> i Then Exit ForNextIf i = Cols * Rows Then isOK = TrueEnd Function附:完整代码Option ExplicitPublic Rows As Integer, Cols As Integer '图块的行列数Const GAP As Integer = 2 '行列图块的间距Private Arrange() As Integer '图象控件与数组的对应关系Private space As Integer '空档的位置Private started As Boolean '是否已开始Private steps As Integer '步数Public showref As Boolean '是否显示参考图Private Sub cmdShowRef_Click()showref = Not showrefIf showref ThenLoad frmReffrmRef.Image1.Picture = PC.PicturefrmRef.Top = Me.TopfrmRef.Left = Me.Left + Me.WidthfrmRef.ShowcmdShowRef.Caption = "关闭参考图"ElseUnload frmRefcmdShowRef.Caption = "显示参考图"End IfEnd Sub''Private Sub Form_Click()' Dim i As Integer' For i = 0 To Rows * Cols - 3' Arrange(i) = i' Next' Arrange(Rows * Cols - 1) = Rows * Cols - 2' Arrange(Rows * Cols - 2) = Rows * Cols - 1' For i = 0 To Rows * Cols - 1' imgPT(i) = PC.GraphicCell(Arrange(i))' Next' imgPT(Rows * Cols - 2) = LoadPicture' space = Rows * Cols - 2''End SubPrivate Sub Form_Unload(Cancel As Integer)Unload frmRefEnd SubPrivate Sub imgPT_Click(Index As Integer)Dim r1 As Integer, c1 As IntegerDim r2 As Integer, c2 As IntegerDim n As IntegerDim i As IntegerIf Not started Then Exit Subc1 = space Mod Cols '计算空档的行列r1 = space \ Colsc2 = Index Mod Cols '计算点击的行列r2 = Index \ ColsIf 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) = nimgPT(space) = PC.GraphicCell(Arrange(space))imgPT(Index) = LoadPicture()space = Indexsteps = steps + 1txtStep.Text = stepsIf isOK() ThenMsgBox "恭喜,完成拼图!共用了" & steps & "步。
", vbInformation '判断是否拼完,如果已完成For i = 1 To Rows * Cols - 1imgPT(i).Enabled = False '拼图完成时,使鼠标点击失效NextEnd IfEnd IfEnd SubPrivate Sub mnuBackColor_Click()CD.Color = Me.BackColorCD.ShowColorMe.BackColor = CD.ColorEnd SubPrivate Sub mnuExit_Click()Unload MeEnd SubPrivate Sub mnuOpen_Click()Dim i As IntegerDim n As IntegerCD.Filter = "图片文件(*.JPG,*.BMP)|*.jpg;*.bmp"CD.DialogTitle = "打开图片"CD.InitDir = App.Path & "\pics"CD.ShowOpen '显示指定图片对话框 If CD.FileName = "" Then Exit SubIf started ThenFor i = 1 To Rows * Cols - 1 '清除已有的控件数组元素Unload imgPT(i)NextimgPT(0).Picture = LoadPicture()If showref Then frmRef.Image1.Picture = LoadPicture()ElseMe.Picture = LoadPicture()End IffrmDivide.Show 1, Me ' 显示指定行列对话框PC.Picture = LoadPicture(CD.FileName)PC.Rows = RowsPC.Cols = Colsn = Rows * ColsimgPT(0).Width = 320 / Cols '窗体以像素为单位imgPT(0).Height = 240 / RowsCall Rnd_Arrange '随机排列For i = 0 To n - 1 '排列图象控件imgPT(i).Top = (i \ Cols) * (240 / Rows + GAP)imgPT(i).Left = (i Mod Cols) * (320 / Cols + GAP)imgPT(i).Visible = TrueNextIf showref Then frmRef.Image1.Picture = PC.Picturestarted = TruecmdShowRef.Enabled = Truesteps = 0txtStep.Text = "0"End SubPrivate Sub Rnd_Arrange() '随机排列图块Dim i As Integer, j As IntegerDim n As Integern = Rows * ColsReDim Arrange(0 To n - 1)For i = 0 To n - 1Arrange(i) = -1 '用-1标记未赋值的元素Nexti = 0Do '给数组Arrange随机赋值j = Int(Rnd * n) '产生0~n-1的随机数If Arrange(j) = -1 ThenArrange(j) = ii = i + 1If i = n Then Exit DoEnd IfLoopFor i = 1 To n - 1 '加载控件数组元素Load imgPT(i)NextFor i = 0 To n - 1If Arrange(i) <> n - 1 ThenimgPT(i).Picture = PC.GraphicCell(Arrange(i)) '将图块赋给控件数组元素ElseimgPT(i).Picture = LoadPicture() '将“打乱”前图片右下角的图块设为空space = iEnd IfNextEnd SubPrivate Function isOK() As Boolean '判断是否拼完Dim i As IntegerFor i = 0 To Cols * Rows - 1If Arrange(i) <> i Then Exit For NextIf i = Cols * Rows Then isOK = True End Function。