南京工程学院
课程设计报告(论文)
题 目: 打字练习
课程名称: Visual Basic 课程设计
院(系、部、中心):能源与动力工程学院
专 业: 火电厂集控运行
班 级: 集控111
学 生 姓 名: 周依琳
学 号: 207110408
设 计 地 点: 图书馆A304
指 导 教 师: 黄 陈 蓉
设计起止时间: 20## 年 6月06 日 至 20## 年 6月 12日
目 录
一、设计任务..................... 3
二、系统总计设计方案............. 4
三、程序整体框图................. 5
四、系统的调试................... 5
五、收获体会..................... 6
六、示例截图..................... 8
七、源代码...................... 10
八、主要参考资料................ 16
一、设计任务
1.在计算机及其他数码产品日益普及的今天,人们使用键盘应向用笔写字一样熟练。本题目要求编制一个打字练习游戏程序,使用户在游戏过程中进行指法练习。
2.程序开始时显示“打字设置”窗口,在“您的名字”文本框输入用户名。若未输入姓名就单击“开始练习”或“查看成绩”按钮,则提示用户输入姓名。
3.然后选择速度和难度之后,单击“开始练习”按钮,以全屏方式显示。根据难度的设置,屏幕上随机产生并落下各种字符。若用户在字符落到屏幕之前敲击了相应的键盘键,则该字符被击中然后消失,击中时在字符位置上显示一个爆炸的效果。程序根据速度和难度的设置自动进行记分,分数实时地显示在窗口的顶部。计分标准如下:
① 慢速+小写字母:打中一个1分
② 慢速+大写字母:打中一个2分
③ 慢速+混合字符:打中一个3分
④ 中速+小写字母:打中一个4分
⑤ 中速+大写字母:打中一个5分
⑥ 中速+混合字符:打中一个6分
⑦ 高速+小写字母:打中一个7分
⑧ 高速+大写字母:打中一个8分
⑨ 高速+所有字符:打中一个9分
所有字符包括大小写字母,数字和符号字符.
4.为了增加游戏的趣味性,可增加背景音乐和打中时的打击声。
5.在打字过程中,可以按Esc键终止游戏,返回打字设置窗口。若按F1键,则弹出键盘布局窗口且游戏暂停,关闭窗口游戏继续。打字练习过程中,屏幕的顶部显示已用的时间和当前的分数。
6,在打字设置窗口中,单击查看成绩按钮,弹出成绩对话框,显示当前用户每次练习的时间与成绩。
7,要求程序在不同分辨率的计算机上都能正确地显示。应在程序运行时检测屏幕的高和宽,将各个字符均匀地分布占满屏幕宽度。
二、系统总计设计方案
1、整个打字练习分为4个窗体1个模块。窗体1为打字设置,窗体2为游戏主界面,窗体3为成绩显示,窗体4为键盘布局。模块用于存放窗体间共用的全局变量声明。
2、游戏背景音乐和打击声用多媒体MMControl控件实现。
3、用Keypress事件检测键入的字符,用Keydown事件判断Esc和F1键。
4、.屏幕上随机产生的字符用以标签控件数组,用定时器控件控制字符的下落的速度。
三、程序整体框图
四、系统的调试
问题1:窗体1设计时,不能同时选择2个单选按钮
解决:先建立框架,再在其中建立单选按钮且不使用工具的自动方式,而是先单击工具箱上的工具,出现“+”指针,在框架中拖拉出适当大小的控件。
问题2:背景音乐打不开
解决:将音频文件用MMControl控件的DeviceType属性取值:
MMControl1.DeviceType = "Sequencer"
MMControl2.DeviceType = "WaveAudio"
问题3:打字的时间长度不能受音乐背景长度的控制。
解决:用mmcontrol的done 事件控制:
Private Sub MMControl1_Done(NotifyCode As Integer)
If NotifyCode <> 1 Then Exit Sub
Dim cj As data
cj.name = Form1.text1.Text
cj.score = totalscore
cj.time = Now
Open App.Path & "\score.txt" For Append As #1
Write #1, cj.name, cj.score, cj.time
Close 1
问题4:程序要根据所选择的速度和难度自动进行记分,选项较多,若要一一例举,则程序太长,容易出错。
解决:用模板先定义全局变量,然后自定义函数,在编写代码过程中再调用子程序。
五、收获体会
第一次做课程设计,一开始做时只是照着书上将窗体先设计好,但是,写代码时却无从下手。后来,在图书馆中查找资料,才有了一些头绪。
在编写代码前,将设计时用到的控件梳理一下,然后有针对性的复习、查找资料。另外,老师课上讲解了程序设计的注意事项,让我了解到编程时要注意代码简洁,同时又要注意结构合理。课本上的基础知识既要熟练掌握,也要学会融会贯通运用到实际操作中。
在设计过程中,我意识到了自己平时学习的不扎实,有的相关问题老师讲的时候总学的似是而非,自己还为自己的学习方法沾沾自喜,觉的无所谓,等到真正运用的时候才发现了问题,平时掌握的似是而非的问题,运用时不是出错就是达不到想要的状态,没办法只好临时抱着书死啃。这时才后悔平时没有多下点功夫把知识掌握牢靠了,否则就不会出现现在临时抱佛脚的尴尬局面。自己这种学习状态要是带到走上工作岗位,恐怕是要砸饭碗啦。而且对程序的删改也比较随意,有时根本没有考虑清楚,就把大段的代码删掉,经常是删掉以后才发现原来的考虑不周全,这时却叫天不应,叫地地不灵,没办法只好长叹一声又无耐的把代码重新搞一遍,吸取教训后,对代码的删改不再那么随意了,有时候觉得真的要删了也是先注释一下,然后等运行几遍,确实没有问题了才可以删掉。
程序设计是一门语言,看似学起来困难。其实不然,它和我们所学的高数、大物等科目一样,一样需要认真学习、及时巩固、勤动脑、多思考,只要有了投入,就会有收获。在这次课程设计中,我不仅学到了一些程序设计的方法,而且也体会到做成功一件事是多么不容易,代码编写所需要的不仅仅是对VB课程知识的掌握,还需要十足的耐心及永不言弃的精神。当遇到阻碍时,不要一味的在这条路上硬闯,我们应该尝试寻找另外一条路。因为,当上帝关上门时,他往往会给你留下一扇窗。是积极寻找另一条出路,还是留在原地消极等待,只在我们的一念之间。
最后,经过一系列调试,程序终于能够正常运行了。看着那彩色的字符飘落,听着点击时的爆炸声,我的内心充斥着感动与惊喜。虽然设计过程中有很多困难,但是珍贵的正是过程中的点点滴滴,结果固然重要,但过程中的体会更加宝贵。
六、示例截图
(窗体1)
(窗体2)
(窗体3)
(键盘布局)
七、源代码
窗体1:
Private Sub Command1_Click()
If Text1.Text = "" Then
i = MsgBox("亲,你还没有输入姓名!", 0 + vbQuestion, "打字设置")
If i = 0 Then
Form1.Show
End If
Else
Form2.Show
End If
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Command3_Click()
If Text1.Text = "" Then
i = MsgBox("亲,你还没有输入姓名!", 0 + vbQuestion, "打字设置")
Else
Form3.Show
End If
Dim InputDate As String * 1
Form3.Text1.Text = ""
Open "D:\UserData\lenovo\桌面\我的打字\score.txt " For Input As #1
Do While Not EOF(1) ‘读取文件
InputDate = Input(1, #1) ‘inputdate 只取得#1的 1 个字节
Form3.Text1.Text = Form3.Text1.Text + InputDate
Loop
Close #1
End Sub
窗体2:
Option Explicit ‘Option Explicit要求程序中所有出现的变量或常量都要声明和定义,不然会报错
Dim i As Integer, j As Integer, k As Integer, h As Integer, n As Integer, second As Integer
Private Sub Form_Load()
MMControl1.DeviceType = "Sequencer" ‘打开背景音乐
MMControl1.Visible = False
MMControl1.FileName = App.Path & "\BackMusic.mid"
MMControl1.Command = "open"
MMControl1.Command = "play"
MMControl2.DeviceType = "WaveAudio"
MMControl2.Visible = False
MMControl2.FileName = App.Path & "\GUNSHOT.WAV"
Image1.Visible = False
Form2.Height = Screen.Height ‘全屏显示
Form2.Width = Screen.Width
For i = 0 To 9
Label1.Item(i).Top = 0
‘item是用在控件数组中的一个属性,控件数组的建立可以通过复制一个控件后粘贴
Label1.Item(i).Left = Screen.Width / 12 * (i + 2)
‘确定字母产生的位置
Timer1.Enabled = True
Next i
For i = 0 To 9
letter (i)
Next ‘子过程的调用
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF1 Then ‘用户按了F1
Timer1.Enabled = False
MMControl1.Command = "Pause"
Form4.Show 1
MMControl1.Command = "Play"
Timer1.Enabled = True
End If
End Sub
Private Sub Timer1_Timer() ‘控制字母下落
Dim i As Integer
For i = 0 To 9
Randomize
speed (n) ‘调用定义的速度子过程
Next
Label2.Caption = Form1.Text1.Text & ",你现在的得分是:" & totalscore & "分"
End Sub
Private Sub Timer2_Timer() ‘控制爆炸图片
Image1.Visible = False
Timer2.Enabled = False
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
Dim shootnum As Integer, m As Integer, n1 As Integer
Dim shooted() As Integer
For i = 0 To 9
If Chr(KeyAscii) = Label1.Item(i).Caption Then
shootnum = shootnum + 1
ReDim Preserve shooted(1 To shootnum)
shooted(shootnum) = i
End If
Next
If shootnum > 0 Then ‘如果被击中的字符正确
MMControl2.Command = "close"
MMControl2.Command = "Open"
MMControl2.Command = "play"
m = 1
n1 = Label1(shooted(m)).Top
For i = 2 To shootnum
If n1 < Label1(shooted(i)).Top Then
m = i
n1 = Label1(shooted(m)).Top
End If
Next
result
Image1.Left = Label1(shooted(m)).Left
Image1.Top = Label1(shooted(m)).Top
Image1.Visible = True
Timer2.Enabled = True
Label1.Item(shooted(m)).Top = 0
letter (shooted(m))
Label2.Caption = Form1.Text1.Text & ",您现在的得分是:" & totalscore & "分"
Exit Sub
End If
totalscore = totalscore – 1
Label2.Caption = Form1.Text1.Text & ", 你现在的得分是:" & totalscore & "分"
If KeyAscii = 27 Then ‘用户按了Esc
If MsgBox("真的要结束练习吗?", vbYesNo + vbQuestion, "打字练习") = vbYes Then
Form1.Show
Form2.Hide
End If
End If
End Sub
MMControl1的Done事件:
Private Sub MMControl1_Done(NotifyCode As Integer)
If NotifyCode <> 1 Then Exit Sub
'NotifyCode的返回值为1时表示命令成功执行
Dim cj As data
cj.name = Form1.Text1.Text
cj.score = totalscore
cj.time = Now
Open App.Path & "\score.txt" For Append As #1 '音乐停止成绩写入score文件
Write #1, cj.name, cj.score, cj.time
Close 1
If MsgBox(Form1.Text1.Text & ",本次练习的得分是:" & totalscore & "分。" & Chr(13) & Chr(10) & "游戏结束,继续吗?", 36, "打字练习") = vbYes Then
totalscore = 0
Label2.Caption = Form1.Text1.Text & ",你现在的得分是:" & totalscore & "分"
MMControl1.Visible = False
MMControl1.FileName = App.Path & "\BackMusic.mid"
MMControl2.Visible = False
MMControl2.FileName = App.Path & "\GUNSHOT.WAV"
Label2.Caption = "Welcome, " & Form1.Text1.Text & ", 您现在的得分是:" & totalscore & "分"
Image1.Visible = False
For i = 0 To 9
Label1.Item(i).Top = 500
Next
MMControl1.Command = "close"
MMControl1.Command = "open"
MMControl1.Command = "play"
For i = 0 To 9
Randomize
letter (n)
Next
Else
Form1.Show
End If
End Sub
Private Sub Timer3_Timer()
second = second + 1
Label3 = second \ 60 & ":" & second Mod 60
End Sub
窗体3:
Private Sub Command1_Click()
Form1.Show
End Sub
模块:
Public totalscore As Integer
Public Type data
name As String
score As String
time As String
End Type
Public Sub letter(n As Integer) '确定下降的字符
Randomize
If Form1.Option4.Value Then
h = Int(Rnd * 26 + 97) '小写字母
ElseIf Form1.Option5.Value Then
If i Mod 2 = 0 Then
h = Int(Rnd * 26 + 65) '大小写字母
Else
h = Int(Rnd * 26 + 97) '所有字符
End If
ElseIf Form1.Option6.Value Then
h = Int(Rnd * 79 + 48)
End If
Form2.Label1.Item(n).Caption = Chr(h)
Form2.Label1.Item(1).ForeColor = vbRed
Form2.Label1.Item(2).ForeColor = vbBlue
Form2.Label1.Item(3).ForeColor = vbGreen
Form2.Label1.Item(4).ForeColor = vbBlue
Form2.Label1.Item(5).ForeColor = vbBlack
Form2.Label1.Item(6).ForeColor = vbRed
Form2.Label1.Item(7).ForeColor = vbGreen
Form2.Label1.Item(8).ForeColor = vbYellow
Form2.Label1.Item(9).ForeColor = vbGreen
Form2.Label1.Item(0).ForeColor = vbRed
End Sub
Public Sub speed(i As Integer) '下降的速度
For i = 0 To 9
If Form1.Option1.Value Then
Form2.Label1.Item(i).Top = Form2.Label1.Item(i).Top + 5
ElseIf Form1.Option2.Value Then
Form2.Label1.Item(i).Top = Form2.Label1.Item(i).Top + 10
ElseIf Form1.Option3.Value Then
Form2.Label1.Item(i).Top = Form2.Label1.Item(i).Top + 15
End If
If Form2.Label1.Item(i).Top > Form2.Height Then'到达底端对分数的影响
Form2.Label1.Item(i).Top = 0
totalscore = totalscore - 10
letter (i)
End If
Next
End Sub
Public Sub result() '加分的结果统计
If Form1.Option1.Value And Form1.Option4.Value Then
totalscore = totalscore + 1
ElseIf Form1.Option1.Value And Form1.Option5.Value Then
totalscore = totalscore + 2
ElseIf Form1.Option1.Value And Form1.Option6.Value Then
totalscore = totalscore + 3
ElseIf Form1.Option2.Value And Form1.Option4.Value Then
totalscore = totalscore + 4
ElseIf Form1.Option2.Value And Form1.Option5.Value Then
totalscore = totalscore + 5
ElseIf Form1.Option2.Value And Form1.Option6.Value Then
totalscore = totalscore + 6
ElseIf Form1.Option3.Value And Form1.Option4.Value Then
totalscore = totalscore + 7
ElseIf Form1.Option3.Value And Form1.Option5.Value Then
totalscore = totalscore + 8
ElseIf Form1.Option3.Value And Form1.Option6.Value Then
totalscore = totalscore + 9
End If
End Sub
八、主要参考资料
1、Visual Basic 课程设计;王栋主编;清华大学出版社
2、Visual Basic游戏编程导学;杨正华,周荣彪,尹兵编著;清华大学出版社
3、Visual Basic6编程宝典;电子工业出版社