Visual Basic课程设计报告所属课程名称:Visual Basic程序设计课程设计题目:快速配对游戏课程设计难度:两星课程设计时间:2012.2.27 ~ 4.18学号:9121091601XX姓名:XXX南京理工大学机械工程学院二〇一三年X月一、程序功能(1)运行程序,显示如图1的开始界面,图片均为“背对”用户。
单击“开始”按钮,图片显示1.5秒(如图2,图片均随机安排),然后翻过去。
用户使用鼠标将图片翻起,如果连续单击的两个图片内容相同则会保持显示状态;如果两图片不同,两张图片0.5秒后自动翻过去。
用户凭记忆在尽量短的时间内将8对图片全部“翻起”,游戏完成。
图1图2(2)从用户第一次单击图片是,程序开始计时(以秒为单位),并在窗口的右上角显示已用时间。
没击中一对图片,窗口中显示一个“笑脸”图标,否则显示一个“严肃的脸”图标(见图3)。
图3(3)程序自动记录前三个最短完成时间,在游戏结束时一图4所示的消息框显示所用的时间,并请玩家输入名字。
单击“排行榜”按钮时可以弹出“排行榜”窗体,如图5所示,显示前三名所用的时间。
图4图5(4)在游戏中,窗口的“开始”和“排行榜”按钮成无效态,游戏完成后,“开始”按钮变为“重来”,单击该按钮可以从头再来一局。
二、课程设计的详细设计游戏主界面:(1)窗体的顶部要放置“开始”、“排行榜”和“退出”按钮。
在放置一个两个重合的图像控件用来显示游戏中的“笑脸”和“严肃的脸”。
再放置一个标签控件来显示用户所用的时间。
加入三个定时器控件“Timershow”、“Timercompare”和“Timercounter”分别来控制展示图片的时间、点击不同图片后图片的展示时间和记录玩家的所用时间。
(2)窗体的中部放置16个图像框控件数组“”来放置游戏中的图片。
和一个放置“背面”图片的图像框控件“Imageback”在案安排游戏使用图片时使用的是随机函数Rnd随机的将“Imagepicture()”的Index值赋给数组,然后将这些选中的图片的“Picture”属性赋给“Imageshow()”图像框达到随机安排图片的目的。
(3)窗体的下部放置31个图像框控件“Imagepicture()”来放置31种不同的候选图片。
排行榜窗体:(1)加入12个标签控件用来显示“排行榜”。
“LabelWanjia()”控件组显示玩家姓名,“LabelChengji()”控件组显示玩家成绩。
(2)添加“返回”按钮,单击按钮时返回游戏主界面。
游戏加载时将“chengji”文件中的已存入的成绩和玩家姓名加载到“排行榜”窗体的相应位置上。
在游戏完成时用消息框提示你的成绩,如果你的成绩进入前三名则可以再“Inputbox”里面输入自己的姓名。
在游戏程序结束时将“排行榜”窗体上的内容存入成绩文件中。
全程序中使用控件数组和数组使程序的编写简单、明了。
三、程序调试过程【问题1】:在程序加载时要将31张图片中的8张随机的成对安排到游戏使用的图片中,但在加载时会出现4张相同的图片。
【解决办法】:在选出8张图片后判断是否有相同的图片,如果有则重新跳到“Rnd”函数重新选出8张不同的图片。
【问题2】:在游戏运行时会出现:如果点击一张已经翻开的图片和一张没翻开的图片时也会出现两张图片翻回显示背面的情况。
【解决办法】:在程序设计时用逻辑数组“Finishi()”判断图片是否翻开,如果是已经翻开则不记录点击的图片数。
【问题3】:当游戏再来一次时,可以连续点击两张以上的不同图片翻开对比。
【解决办法】:在游戏重新开始时将所有的“Imageshow()”图像框控件的“是否翻开”值“Finishi ()”全部设置为“False”。
四、更上一层楼(1)在游戏过程中使用的8对图片不是一直不变的,而是从候选的31张图片中随机选出8 张图片。
(2)在玩家进入前三名时不仅可以记录玩家的成绩,而且还可以记录玩家的名字。
五、课程设计总结体会:自己动手设计程序可以提高我们的计算机技术,当自己设计的程序可以运行时有成就感,增加对编程的兴趣。
同时在编程的过程中可以提高我们发现问题和解决问题的能力,能培养自己的创新能力。
不足:在点击“开始”按钮后到显示图片的时间间隔有点长。
六、源程序代码Option ExplicitDim a(0 To 15) As Integer, b(1 To 2) As Integer, str(1 To 3) As StringDim Finish(0 To 15) As Boolean, Order(1 To 3) As String, Q(1 To 3) As IntegerDim y As Integer, Time1 As IntegerPrivate Sub CmdExit_Click() '退出Dim i As Integer, k As IntegerOpen App.Path & "\Chengji.txt" For Output As #2For i = 1 To 3 '保存姓名和成绩k = 15 - Len(str(i))Print #2, str(i) & Space(k) & Q(i) & Space(5)NextCloseEnd SubPrivate Sub cmdPaihangbang_Click()Dim i As IntegerFormZhujiemian.HideFormPaihangbang.ShowFor i = 1 To 3belChengji(i).Caption = Q(i) '将已存的成绩和名字加载到排行榜页面belWanjia(i).Caption = str(i)NextEnd SubPrivate Sub cmdstart_Click()Dim i As Integercmdstart.Enabled = False '游戏开始后只有退出按钮可用cmdPaihangbang.Enabled = FalseTimershow.Enabled = True '计时开始For i = 0 To 15Imageshow(i).Picture = Imageback.Picture '再次开始时图片先全部显示背面Imageshow(i).Enabled = FalseFinish(i) = False '游戏在开始时图片的属性为全部没翻开NextEnd SubPrivate Sub Form_Load()Dim Index As Integer, u As IntegerFormZhujiemian.Width = 5655: FormZhujiemian.Height = 6660For u = 0 To 15Imageshow(u).Picture = Imageback.Picture '初始时全部显示背面且图片不可点击Imageshow(u).Enabled = FalseNextTimershow.Enabled = False '计时器关闭状态Timercompare.Enabled = FalseTimercounter.Enabled = FalseDim w As Integer, j As Integer, p As Integer, i As IntegerOpen App.Path & "\Chengji.txt" For Input As #1w = 1Do While Not EOF(1)Input #1, Order(w) '打开文件w = w + 1LoopFor i = 1 To 3Q(i) = Val(Trim(Mid(Order(i), 6, 18))) '取出成绩str(i) = Trim(Mid(Order(i), 1, 6)) '取出名字NextCloseDim m As Integer, c(0 To 7) As Integer, n As Integer, r As Integer, d(0 To 7) As IntegerFor i = 0 To 7c(i) = -1NextL1: RandomizeFor i = 0 To 7n = Int(Rnd * 31) '从候选图片中随机选出8张图片c(i) = nNextFor i = 0 To 7For r = i + 1 To 7If c(i) = c(r) Then GoTo L1 '如果有选出相同的图片择重新选择NextNextFor i = 0 To 15a(i) = -1NextRandomizeFor i = 0 To 7 '代表Imagepicture的Index属性For j = 0 To 1 '2张相同图片Dom = Int(Rnd * 16) '代表Imageshow的Index属性If a(m) = -1 Thena(m) = c(i) '说明还没有赋予图片,就给其安排图片Exit DoEnd IfLoopNextNextFormZhujiemian.Left = (Screen.Width - FormZhujiemian.Width) / 2 '打开窗体时窗体显示在屏幕的正中间FormZhujiemian.Top = (Screen.Height - FormZhujiemian.Height) / 2End SubPrivate Sub Imageshow_Click(Index As Integer) '图片的单击时间Dim i As IntegerImageshow(Index).Picture = Imagepicture(a(Index)).PictureIf Finish(Index) = True Then Imageshow(Index).Enabled = FalseIf Finish(Index) = False Theny = y + 1 'y=2 表示已经翻开两张图片b(y) = IndexFinish(Index) = True 'True代表图片已点击过了If y = 2 ThenFor i = 0 To 15Imageshow(i).Enabled = False '如果已经点击了两张图片择不能再点击其他图片NextTimercompare.Enabled = TrueExit SubEnd IfEnd IfEnd SubPrivate Sub Timercompare_Timer() '对比图片Static x As Integer, p As Integer: Dim i As Integer, s As StringIf Timercompare.Enabled = True Then '调用期间图片不能点击For i = 0 To 15Imageshow(i).Enabled = FalseNextEnd IfIf a(b(1)) <> a(b(2)) ThenImageshow(b(1)).Picture = Imageback.PictureImageshow(b(2)).Picture = Imageback.Picture '图片不同择翻过去显示哭脸Imagenosmile.Visible = TrueImagesmile.Visible = FalseFinish(b(1)) = False: Finish(b(2)) = Falseb(1) = -1: b(2) = -1y = 0 '两图片翻过去之后其他图片可点击Elsep = p + 1 '记录翻开的相同图片的对数y = 0Imagesmile.Visible = True '显示笑脸Imagenosmile.Visible = FalseIf p = 8 ThencmdPaihangbang.Enabled = TrueCmdExit.Enabled = Truecmdstart.Enabled = Truecmdstart.Caption = "再来"Time1 = lbtime.Captionlbtime.Caption = ""Timercounter.Enabled = FalseSelect Case Time1 '将玩家的成绩与已存入的成绩比较并存如相应的成绩和姓名Case Is > Q(3)MsgBox "抱歉,你的成绩是" & Time1 & "秒,你没有进入前三名", "64", "快速配对游戏"Case Is < Q(1)s = InputBox("恭喜你成为第一名,你的成绩是" & Time1 & "秒,请输入你的姓名:", "快速配对游戏", "玩家1")If s <> "" ThenQ(1) = Time1str(1) = sEnd IfCase Is < Q(2)s = InputBox("恭喜你成为第二名, 你的成绩是" & Time1 & "秒,请输入你的姓名:", "快速配对游戏", "玩家2")If s <> "" ThenQ(2) = Time1str(2) = sEnd IfCase Is < Q(3)s = InputBox("恭喜你成为第三名,你的成绩是" & Time1 & "秒,请输入你的姓名:", "快速配对游戏", "玩家3")If s <> "" ThenQ(3) = Time1str(3) = sEnd IfEnd SelectCall Bianhuanb(1) = -1: b(2) = -1y = 0 '其他图片可点击p = 0End IfEnd Ifx = 0For i = 0 To 15Imageshow(i).Enabled = True '全部翻开后所有图片不可点击NextTimercompare.Enabled = FalseEnd SubPrivate Sub Timercounter_Timer() '记录时间(秒)lbtime.Caption = V al(lbtime.Caption) + Timercounter.Interval / 1000End SubPrivate Sub Timershow_Timer() '展示全部图片Dim i As Integer, j As Integer, m As Integer, Index As IntegerStatic x As Integerx = x + 1If x = 2 Then '1.5秒后把图片翻过来Timershow.Enabled = FalseFor Index = 0 To 15Imageshow(Index).Picture = Imageback.PictureImageshow(Index).Enabled = TrueNextTimercounter.Enabled = Truex = 0Exit SubEnd IfFor m = 0 To 15Imageshow(m).Picture = Imagepicture(a(m)).PictureNextEnd SubPrivate Sub Bianhuan() '定义一个过程用以在每一局游戏完成后重新随机安排游戏图片Dim i As Integer, j As Integer, m As Integer, c(0 To 7) As Integer, n As Integer, r As Integer, d(0 To 7) As Integer For i = 0 To 7c(i) = -1NextL1: RandomizeFor i = 0 To 7n = Int(Rnd * 31)c(i) = nNextFor i = 0 To 7For r = i + 1 To 7If c(i) = c(r) Then GoTo L1NextNextFor i = 0 To 15a(i) = -1NextRandomizeFor i = 0 To 7For j = 0 To 1Dom = Int(Rnd * 16)If a(m) = -1 Thena(m) = c(i)Exit DoEnd IfLoopNextNextEnd Sub。