46. 鍵盤打字練習程序
本程序用於打字練習,訓練和提高打字速度。可選擇小寫字母、大寫字母、大小寫混合字母、特殊字符、數字、混合字符、漢字等 7 種練習方式。
程序啟動後,字符不斷隨機出現並落下,如果練習者鍵入的字符正確,該字符變紅變大,隨後快速縮小,最終消失。
程序可顯示練習者的成績、正確率和每分鐘的打字速度。練習中雙擊窗口,可清除數據,重新開始。註意進行字母或漢字輸入練習時,要將輸入法切換到正確的狀態。
'?'下面是窗體代碼,在?VB6.0?調試通過:'在窗體上放置下面?6?個控件:
'?Option1:?用於進行字符類型選擇
'?Label1:用於顯示下落的字符
'?Label2:用於顯示遊戲信息
'?Timer1:用於移動字符
'?Picture1:下落字符的背景
'?Text1:用於顯示遊戲者鍵入的字符
'在屬性窗口將?Option1?和?Label1?的?Index?屬性設置為?0,其他控件及屬性不必設置,采用默認屬性即可。
'如果要進行漢字打字練習,在工程所在目錄下用記事本建立壹個文本文件,文件名為:HanZi.txt
'?在此文本文件中輸入練習所用的漢字,如:漢字=中華人民***和國,偉大的奧運會!
'?註意,輸入的字符前面三個必須是:漢字=
'本人原創,轉載請註明來源:/100bd/blog/item/633b6467dbfdd828aa184cdb.html
Dim?ctY?As?Single,?ctCount?As?Long,?ctFinish?As?Long,?ctTime?As?Single
Dim?ctSize?As?Single,?ctStr?As?String,?ctStrS?As?Long,?ctNoCheck?As?Boolean
Private?Sub?Form_Load()
Dim?I?As?Long
Me.KeyPreview?=?True:?Me.Caption?=?"鍵盤打字速度練習"
Text1.Text?=?"":?ctSize?=?36?'顯示字符大小
Me.BackColor?=?RGB(50,?50,?155):?Picture1.BackColor?=?RGB(100,?100,?255)
Label2.BackColor?=?Me.BackColor:?Label2.ForeColor?=?&HFFFFFF
Label2.Caption?=?"成績:?0%":?Label2.AutoSize?=?True:?'用於顯示成績信息Me.Move?Screen.Width?*?0.1,?Screen.Height?*?0.1,?Screen.Width?*?0.8,?Screen.Height?*?0.8
Set?Label1(0).Container?=?Picture1
Label1(0).Font.Bold?=?True:?Label1(0).BackStyle?=?0?'用於顯示下落的字符
Label1(0).UseMnemonic?=?False:?Label1(0).AutoSize?=?True
For?I?=?0?To?4?'同時出現的字符個數,這裏設置為?5,可修改
If?I?>?0?Then?Load?Label1(I)
Next
Option1(0).BackColor?=?Me.BackColor:?Option1(0).ForeColor?=?&HFFFFFF
For?I?=?0?To?6
If?I?>?0?Then?Load?Option1(I)
Next
Option1(0).Caption?=?"小寫字母":?Option1(1).Caption?=?"大寫字母"
Option1(2).Caption?=?"大小寫混合字母":?Option1(3).Caption?=?"特殊字符"
Option1(4).Caption?=?"數字":?Option1(5).Caption?=?"混合字母和字符"
Option1(6).Caption?=?"漢字":
For?I?=?0?To?Option1.Count?-?1
Option1(I).Visible?=?True
Next
Option1(0).Value?=?True
Call?StartPlay
ctY?=?Picture1.ScaleY(5,?3,?Picture1.ScaleMode)?'字符下落速度(這裏為?5?個像素),可修改
Timer1.Enabled?=?True:?Timer1.Interval?=?50
End?Sub
Private?Sub?Form_Activate()
On?Error?Resume?Next
Text1.SetFocus
End?Sub
Private?Sub?Text1_Change()
Dim?I?As?Long
If?ctNoCheck?Or?Len(Text1.Text)?<?11?Then?Exit?Sub
ctNoCheck?=?True
I?=?Text1.SelStart:If?I?=?0?Then?I?=?1
Text1.Text?=?Mid(Text1.Text,?I,?1)
Text1.SelStart?=?Len(Text1.Text)
ctNoCheck?=?False
End?Sub
Private?Sub?Form_KeyPress(KeyAscii?As?Integer)
Dim?I?As?Long,?nStr?As?String,?T?As?Single
nStr?=?Chr(KeyAscii)
If?nStr?=?"?"?Then?nStr?=?"(空格)"
For?I?=?0?To?Label1.Count?-?1
If?nStr?=?Label1(I).Caption?And?Label1(I).Tag?=?"1"?Then
Label1(I).ForeColor?=?255:?Label1(I).Tag?=?"2" Label1(I).Font.Size?=?ctSize?*?4 T?=?Picture1.ScaleHeight?-?Label1(I).Height If?Label1(I).Top?>?T?Then?Label1(I).Top?=?T ctFinish?=?ctFinish?+?1:?Call?ShowInf Exit?SubEnd?If
Next
End?Sub
Private?Sub?ShowInf()
Dim?nStr?As?String,?T?As?Long,?M?As?Long,?H?As?Long,?StrT?As?String,?V?As?Long
If?ctCount?>?0?Then?nStr?=?Format(ctFinish?/?ctCount?*?100,?"0.0")?Else?ctCount?=?"0"
nStr?=?"正確率:"?&?nStr?&?"%"
nStr?=?"總數:"?&?ctCount?&?vbCrLf?&?vbCrLf?&?"正確:"?&?ctFinish?&?vbCrLf?&?vbCrLf?&?nStr
T?=?Int(Timer?-?ctTime)
If?T?>?0?Then?V?=?ctFinish?/?T?*?60
H?=?T?\?3600:?T?=?T?Mod?3600
M?=?T?\?60:?T?=?T?Mod?60
If?H?>?0?Then?StrT?=?H?&?":"
If?H?>?0?Or?M?>?0?Then?StrT?=?StrT?&?M?&?"'"
'StrT?=?"12:34'"'****調試代碼
nStr?=?nStr?&?vbCrLf?&?vbCrLf?&?"時間:"?&?StrT?&?T?&?""""
Label2.Caption?=?nStr?&?vbCrLf?&?vbCrLf?&?"速度:"?&?V?&?"字/分"
End?Sub
Private?Sub?Form_Resize()
Dim?I?As?Long,?L?As?Single,?T?As?Single,?W?As?Single,?H?As?Single,?MaxW?As?Single
Text1.Font.Size?=?16:?Label2.Font.Size?=?12
H1?=?Me.TextHeight("1")
L?=?H1:?T?=?H1
For?I?=?0?To?Option1.Count?-?1
Option1(I).Visible?=?True:?W?=?Me.TextWidth(Option1(I).Caption?&?"123456")
If?MaxW?<?W?Then?MaxW?=?W
Option1(I).Move?L,?T,?W,?H1?*?1.25
T?=?T?+?H1?*?1.5
Next
Label2.Move?L?*?0.8,?T?+?H1
H?=?Me.ScaleHeight?-?Text1.Height
L?=?L?+?MaxW:?W?=?Me.ScaleWidth?-?L
If?W?>?0?And?H?>?0?Then?Picture1.Move?L,?0,?W,?H
W?=?Me.ScaleWidth?-?L
If?W?>?0?Then?Text1.Move?L,?Picture1.Height,?W
End?Sub
Private?Sub?Picture1_Click()
Text1.SetFocus
End?Sub
Private?Sub?Picture1_DblClick()
Call?StartPlay
End?Sub
Private?Sub?StartPlay()
ctFinish?=?0:?ctCount?=?0:?ctTime?=?Timer
For?I?=?0?To?Label1.Count?-?1
Label1(I).Tag?=?"":?Label1(I).Visible?=?False
Next
End?Sub
Private?Sub?Option1_Click(Index?As?Integer)
GetStr?Index
Call?StartPlay
On?Error?Resume?Next
Text1.SetFocus
End?Sub
Private?Sub?GetStr(nMode?As?Integer)
Dim?Str1?As?String,?Str2?As?String,?Str3?As?String
Str1?=?"?abcdefghijklmnopqrstuvwxyz"
Str2?=?"?~!@#$%^&*()_+|-=\{}:""<>?[];',./"
Str3?=?"0123456789"
Select?Case?nMode
Case?1:?ctStr?=?UCase(Str1)?'大寫字母
Case?2:?ctStr?=?Str1?&?UCase(Str1)?'大小寫混合字母
Case?3:?ctStr?=?Str2:'特殊字符
Case?4:?ctStr?=?Str3:'數字
Case?5:?ctStr?=?Str1?&?UCase(Str1)?&?Str2?&?Str3?'大小寫混合和特殊字符
Case?6:?ctStr?=?ReadText():?'漢字
Case?Else:?ctStr?=?Str1:'小寫字母
End?Select
ctStrS?=?Len(ctStr)
End?Sub
Private?Function?ReadText()?As?String
'從文本文件中讀出要進行漢字練習的字符
Dim?F?As?String,?H?As?Long,?nStr?As?String
On?Error?GoTo?cuo
F?=?App.Path
If?Right(F,?1)?<>?"\"?Then?F?=?F?&?"\"
F?=?F?&?"HanZi.txt"
H?=?FreeFile
Open?F?For?Input?As?#H
Line?Input?#H,?nStr
Close?#H
If?Left(nStr,?3)?<>?"漢字="?Then?GoTo?cuo?'檢查文件標記
nStr?=?Trim(Mid(nStr,?4))
If?nStr?=?""?Then?GoTo?cuo
ReadText?=nStr
'ReadText?=?"中華人民***國"?'?****調試代碼
Exit?Function
cuo:
ReadText?=?"錯誤"
End?Function
Private?Sub?RndStr(I?As?Long)
'隨機字符和位置
Static?xUp?As?Single
Dim?x?As?Single,?W?As?Single,?S?As?Long
If?Label1(I).Tag?<>?""?Then?Exit?Sub
Label1(I).Font.Size?=?ctSize:?Label1(I).ForeColor?=?&HFFFFFF
Randomize:?S?=?1?+?Int(Rnd?*?ctStrS):?Label1(I).Caption?=?Mid(ctStr,?S,?1)?'隨機字符
If?Label1(I).Caption?=?"?"?Then?Label1(I).Caption?=?"(空格)"
Randomize
W?=?Picture1.ScaleWidth
Do?'隨機位置:確保不重疊
x?=?Rnd?*?(W?-?Label1(I).Width)
S?=?S?+?1
If?S?>?100?Or?W?<?Label1(I).Width?*?2?Then?Exit?Do
If?Abs(xUp?-?x)?>?Label1(I).Width?Then?Exit?Do
Loop
Label1(I).Move?x,?-ctY
xUp?=?x
Label1(I).Visible?=?True:?Label1(I).Tag?=?"1"
ctCount?=?ctCount?+?1:?Call?ShowInf
End?Sub
Private?Sub?Timer1_Timer()
Dim?I?As?Long,?NextI?As?Long,?S?As?Single,?Have1?As?Boolean,?T?As?Long
For?I?=?0?To?Label1.Count?-?1
If?Label1(I).Tag?<>?""?Then
Have1?=?True Label1(I).Top?=?Label1(I).Top?+?ctY If?Label1(I).Tag?=?"2"?Then?'已擊中的字符 S?=?Label1(I).Font.Size?*?0.7 If?S?>?3?Then?Label1(I).Font.Size?=?S?Else?Label1(I).Tag?=?"":?Label1(I).Visible?=?False End?If If?Label1(I).Top?>?Picture1.ScaleHeight?Then?Label1(I).Tag?=?"":?Label1(I).Visible?=?False If?Label1(I).Top?>?Picture1.ScaleHeight?*?0.2?Then?'超過窗體高度?1/5?,下壹個字符出現 NextI?=?I?+?1 If?NextI?>?Label1.Count?-?1?Then?NextI?=?0 RndStr?NextI End?IfEnd?If
Next
If?Not?Have1?Then?RndStr?0?'已全部消失
T?=?T?+?Timer1.Interval
If?T?>?200?Then?T?=?0:?Call?ShowInf
End?Sub
'本人原創,轉載請註明來源:/100bd/blog/item/633b6467dbfdd828aa184cdb.html
參考:/100bd