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 Explicit
Dim a(0 To 15) As Integer, b(1 To 2) As Integer, str(1 To 3) As String
Dim Finish(0 To 15) As Boolean, Order(1 To 3) As String, Q(1 To 3) As Integer
Dim y As Integer, Time1 As Integer
Private Sub CmdExit_Click() '退出
Dim i As Integer, k As Integer
Open App.Path & "\Chengji.txt" For Output As #2
For i = 1 To 3 '保存姓名和成绩
k = 15 - Len(str(i))
Print #2, str(i) & Space(k) & Q(i) & Space(5)
Next
Close
End
End Sub
Private Sub cmdPaihangbang_Click()
Dim i As Integer
FormZhujiemian.Hide
FormPaihangbang.Show
For i = 1 To 3
FormPaihangbang.LabelChengji(i).Caption = Q(i) '将已存的成绩和名字加载到排行榜页面
FormPaihangbang.LabelWanjia(i).Caption = str(i)
Next
End Sub
Private Sub cmdstart_Click()
Dim i As Integer
cmdstart.Enabled = False '游戏开始后只有退出按钮可用
cmdPaihangbang.Enabled = False
Timershow.Enabled = True '计时开始
For i = 0 To 15
Imageshow(i).Picture = Imageback.Picture '再次开始时图片先全部显示背面
Imageshow(i).Enabled = False
Finish(i) = False '游戏在开始时图片的属性为全部没翻开
Next
End Sub
Private Sub Form_Load()
Dim Index As Integer, u As Integer
FormZhujiemian.Width = 5655: FormZhujiemian.Height = 6660
For u = 0 To 15
Imageshow(u).Picture = Imageback.Picture '初始时全部显示背面且图片不可点击
Imageshow(u).Enabled = False
Next
Timershow.Enabled = False '计时器关闭状态
Timercompare.Enabled = False
Timercounter.Enabled = False
Dim w As Integer, j As Integer, p As Integer, i As Integer
Open App.Path & "\Chengji.txt" For Input As #1
w = 1
Do While Not EOF(1)
Input #1, Order(w) '打开文件
w = w + 1
Loop
For i = 1 To 3
Q(i) = Val(Trim(Mid(Order(i), 6, 18))) '取出成绩
str(i) = Trim(Mid(Order(i), 1, 6)) '取出名字
Next
Close
Dim 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 7
c(i) = -1
Next
L1: Randomize
For i = 0 To 7
n = Int(Rnd * 31) '从候选图片中随机选出8张图片
c(i) = n
Next
For i = 0 To 7
For r = i + 1 To 7
If c(i) = c(r) Then GoTo L1 '如果有选出相同的图片择重新选择
Next
Next
For i = 0 To 15
a(i) = -1
Next
Randomize
For i = 0 To 7 '代表Imagepicture的Index属性
For j = 0 To 1 '2张相同图片
Do
m = Int(Rnd * 16) '代表Imageshow的Index属性
If a(m) = -1 Then
a(m) = c(i) '说明还没有赋予图片,就给其安排图片
Exit Do
End If
Loop
Next
Next
FormZhujiemian.Left = (Screen.Width - FormZhujiemian.Width) / 2 '打开窗体时窗体显示在屏幕的正中间
FormZhujiemian.Top = (Screen.Height - FormZhujiemian.Height) / 2
End Sub
Private Sub Imageshow_Click(Index As Integer) '图片的单击时间
Dim i As Integer
Imageshow(Index).Picture = Imagepicture(a(Index)).Picture
If Finish(Index) = True Then Imageshow(Index).Enabled = False
If Finish(Index) = False Then
y = y + 1 'y=2 表示已经翻开两张图片
b(y) = Index
Finish(Index) = True 'True代表图片已点击过了
If y = 2 Then
For i = 0 To 15
Imageshow(i).Enabled = False '如果已经点击了两张图片择不能再点击其他图片
Next
Timercompare.Enabled = True
Exit Sub
End If
End If
End Sub
Private Sub Timercompare_Timer() '对比图片
Static x As Integer, p As Integer: Dim i As Integer, s As String
If Timercompare.Enabled = True Then '调用期间图片不能点击
For i = 0 To 15
Imageshow(i).Enabled = False
Next
End If
If a(b(1)) <> a(b(2)) Then
Imageshow(b(1)).Picture = Imageback.Picture
Imageshow(b(2)).Picture = Imageback.Picture '图片不同择翻过去显示哭脸
Imagenosmile.Visible = True
Imagesmile.Visible = False
Finish(b(1)) = False: Finish(b(2)) = False
b(1) = -1: b(2) = -1
y = 0 '两图片翻过去之后其他图片可点击
Else
p = p + 1 '记录翻开的相同图片的对数
y = 0
Imagesmile.Visible = True '显示笑脸
Imagenosmile.Visible = False
If p = 8 Then
cmdPaihangbang.Enabled = True
CmdExit.Enabled = True
cmdstart.Enabled = True
cmdstart.Caption = "再来"
Time1 = lbtime.Caption
lbtime.Caption = ""
Timercounter.Enabled = False
Select Case Time1 '将玩家的成绩与已存入的成绩比较并存如相应的成绩和姓名
Case Is > Q(3)
MsgBox "抱歉,你的成绩是" & Time1 & "秒,你没有进入前三名", "64", "快速配对游戏"
Case Is < Q(1)
s = InputBox("恭喜你成为第一名 ,你的成绩是" & Time1 & "秒,请输入你的姓名: ", "快速配对游戏", "玩家1")
If s <> "" Then
Q(1) = Time1
str(1) = s
End If
Case Is < Q(2)
s = InputBox("恭喜你成为第二名, 你的成绩是" & Time1 & "秒,请输入你的姓名: ", "快速配对游戏", "玩家2")
If s <> "" Then
Q(2) = Time1
str(2) = s
End If
Case Is < Q(3)
s = InputBox("恭喜你成为第三名,你的成绩是" & Time1 & "秒,请输入你的姓名: ", "快速配对游戏", "玩家3")
If s <> "" Then
Q(3) = Time1
str(3) = s
End If
End Select
Call Bianhuan
b(1) = -1: b(2) = -1
y = 0 '其他图片可点击
p = 0
End If
End If
x = 0
For i = 0 To 15
Imageshow(i).Enabled = True '全部翻开后所有图片不可点击
Next
Timercompare.Enabled = False
End Sub
Private Sub Timercounter_Timer() '记录时间(秒)
lbtime.Caption = Val(lbtime.Caption) + Timercounter.Interval / 1000
End Sub
Private Sub Timershow_Timer() '展示全部图片
Dim i As Integer, j As Integer, m As Integer, Index As Integer
Static x As Integer
x = x + 1
If x = 2 Then '1.5秒后把图片翻过来
Timershow.Enabled = False
For Index = 0 To 15
Imageshow(Index).Picture = Imageback.Picture
Imageshow(Index).Enabled = True
Next
Timercounter.Enabled = True
x = 0
Exit Sub
End If
For m = 0 To 15
Imageshow(m).Picture = Imagepicture(a(m)).Picture
Next
End Sub
Private 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 7
c(i) = -1
Next
L1: Randomize
For i = 0 To 7
n = Int(Rnd * 31)
c(i) = n
Next
For i = 0 To 7
For r = i + 1 To 7
If c(i) = c(r) Then GoTo L1
Next
Next
For i = 0 To 15
a(i) = -1
Next
Randomize
For i = 0 To 7
For j = 0 To 1
Do
m = Int(Rnd * 16)
If a(m) = -1 Then
a(m) = c(i)
Exit Do
End If
Loop
Next
Next
End Sub
本文来源:https://www.2haoxitong.net/k/doc/b221aa10824d2b160b4e767f5acfa1c7aa008208.html
文档为doc格式