實例三:“猜數(shù)游戲”
知識點:
1、學(xué)習(xí)變量的類型與轉(zhuǎn)換;
2、掌握程序的循環(huán)與判斷;
3、學(xué)習(xí)隨機(jī)數(shù)的生成。
通過對前面兩個實例的學(xué)習(xí),相信您對自己掌握VBA編程已充滿了信心。今天,我們將編寫一個小小的游戲程序。這個游戲程序中既包含了新的知識點,又要考驗?zāi)鷮η皟烧n知識運(yùn)用的熟練程度,就讓我們靜下心來克服這個小難關(guān)吧。
游戲內(nèi)容是這樣的:電腦生成一個0到99之間的整數(shù),請您來猜這個數(shù)是多少,每猜一次,電腦都給您一個提示,直到您猜中為止。
程序思路:
1、電腦首先生成一個0到99之間的整數(shù);
2、請您輸入您所猜的數(shù);
3、把您輸入的數(shù)與電腦所生成的數(shù)進(jìn)行比較,并給出“您猜大了”或“您猜小了”的提示;
4、如果您猜對了,則退出程序;如果您沒有猜對,則循環(huán)回第二步重復(fù)運(yùn)行,讓您再次輸入自己所猜的數(shù)。
請看代碼,必要的地方已添加了注釋。程序中退格與對齊是為了便于理解。請您先試著自己把代碼讀一讀,看看能不能讀懂。)
’ ’=========程序名“您猜”=========
Sub 您猜()
Dim a, b, c, d’申明了四個變量,變量間用英文逗號分開,與前面實例二申明變量的寫法不同,結(jié)果相同。
a = 0’這個變量用于計算您猜了多少次。
Randomize’準(zhǔn)備生成一個隨機(jī)的數(shù)字,先初始化隨機(jī)數(shù)生成器。
b = Int(100 * Rnd) ’生成一個百以內(nèi)的隨機(jī)數(shù),“Rnd”就是“隨機(jī)數(shù)生成函數(shù)”。
Do’開始循環(huán)
a = a + 1’您猜的次數(shù)增添一次。當(dāng)再次循環(huán)到這兒時,次數(shù)會繼續(xù)往上加。
c = InputBox("請輸入您所猜的數(shù)")’將取得的值賦予變量“c”,“c”是字符串!
d = CInt(c) ’將變量“c”轉(zhuǎn)化為整數(shù),再將值賦給“d”。
If b < d Then’進(jìn)行比較,如果猜大了。
MsgBox ("您猜的數(shù)大了")’顯示比較的結(jié)果。
ElseIf b > d Then’進(jìn)行比較,如果猜小了。
MsgBox ("您猜的數(shù)小了")’顯示比較的結(jié)果。
Else: b = d’進(jìn)行比較,如果猜對了。
MsgBox ("哈哈,您猜對了!") ’顯示比較的結(jié)果。
Exit Do’既然已經(jīng)猜對了,就跳出循環(huán)。
End If’結(jié)束比較。
Loop’回到前面的Do,繼續(xù)循環(huán)。
MsgBox ("您猜了" & a & "次!") ’彈出消息框,并使用了字符串連接。
End Sub’結(jié)束程序。
運(yùn)行本程序,看看效果。并根據(jù)注釋,體會循環(huán)與判斷在本程序中的作用。
代碼解說:
a這個變量,用于計算您所猜的次數(shù)。每多猜一次,它就在自身的基礎(chǔ)上加1,其相應(yīng)的代碼是:a = 0與a = a +
1兩句。程序結(jié)尾時,將在消息框中顯示“a”的值。
b這個變量,用于記錄一個隨機(jī)生成的數(shù)字。其相應(yīng)代碼為:Randomize與b = Int(100 *
Rnd)這兩句。其中,Randomize這個語句在本程序中非常重要,如果您去掉這個函數(shù),再多運(yùn)行本程序幾次的話,您就會發(fā)現(xiàn)猜測的答案居然是有規(guī)律的??!換句話說,只要我知道了電腦所出數(shù)字的規(guī)律我就可以“百發(fā)百中”地一次猜中這個數(shù)!所謂“隨機(jī)數(shù)”顧名思義就應(yīng)該是“隨機(jī)”產(chǎn)生的數(shù),在沒有Randomize語句的情況下,這些產(chǎn)生的數(shù)看似很“隨機(jī)”,其實有規(guī)律,這種隨機(jī)數(shù)就是“偽”隨機(jī)數(shù)。所以,Randomize語句的作用就是生成“真正”的隨機(jī)數(shù)。
Rnd函數(shù)是生成一個介于0與1之間的小數(shù),乘以100是讓這個小數(shù)成為一個介于0到100之間的數(shù);Int函數(shù)的作用是將一個數(shù)的小數(shù)部分去掉,只保留它的整數(shù)部分,即“取整”。通過這樣一個可能大家覺得有點復(fù)雜的過程,我們得到了一個0到99之間的整數(shù)(大于99而小于100的小數(shù)在取整后即是99,所以前面我們說“乘以100是為了生成一個介于0到100之間的數(shù)”,而真正取整之后最大的數(shù)只能是99。),并將它的值賦予了變量“b”。
生成隨機(jī)數(shù),是很多程序中要用到的功能(特別是游戲,比如游戲中隨機(jī)生成不同的怪物或不同的寶物等。),上面的內(nèi)容希望大家能悉心地體會。
c這個變量,是取得輸入框中我們所猜測的數(shù)字。其相應(yīng)代碼是“c =
InputBox("請輸入您所猜的數(shù)")”,但計算機(jī)并不認(rèn)為我們所輸入的是一個數(shù)字(整數(shù)),它把我們輸入的內(nèi)容看成是文字(字符串)。顯然,文字是沒有辦法去與數(shù)字比較大小的,所以,我們要用到變量d。
d這個變量,是一個整數(shù)。它是利用了“轉(zhuǎn)換函數(shù)”——“CInt”,將我們所取得的字符串變量“c”轉(zhuǎn)換成了一個整數(shù)。其相應(yīng)代碼是“d =
CInt(c)”。也就是說,本程序中最終進(jìn)行比較的,是兩個整數(shù)“b”與“d”。這里涉及到VBA數(shù)據(jù)類型的知識。
對于VBA的數(shù)據(jù)類型,這里主要為大家介紹兩種:
Integer——包含 -32,768 到 32,767 之間的整數(shù)。該類型的數(shù)值基本上可以滿足我們通常使用整數(shù)時的需要;
String——包含變長字符串,最大長度可為 20 億個字符。該類型的值其實就是我們常用的字符串。
我們在程序當(dāng)中用的CInt函數(shù),就是將一個String類型(字符)的值,轉(zhuǎn)換成了一個Integer類型(整數(shù))的值。所以我們稱CInt函數(shù)為“轉(zhuǎn)換函數(shù)”。
與CInt類似的常用轉(zhuǎn)換函數(shù)還有:Clin、CSng、CStr等。可以把VBA幫助文件中的“轉(zhuǎn)換函數(shù)”與“數(shù)據(jù)類型”相互參照進(jìn)行學(xué)習(xí)。(相信這個時候您看幫助文件中的這部分內(nèi)容,將不會再是一件難事。)
感覺到困難了嗎?如果感覺到了困難,就請將上面的內(nèi)容再體會體會。準(zhǔn)備進(jìn)入下一個知識點。
程序中的DO、Exit Do以及Loop為一個整體。其中,Do是開始進(jìn)入循環(huán); Loop是指回到Do語句處,再次進(jìn)行循環(huán); Exit
Do是指當(dāng)符合某一個條件時就直接退出循環(huán)。在本程序中,Exit
Do是指當(dāng)猜中了(即b=d)時,退出循環(huán);而無論是猜大了(b>d),還是猜小了(b
程序中數(shù)字的比較,是利用If語句來實現(xiàn)的。在實例二中,我們已接觸過 If 語句,If語句的基本格式是:
If(條件)Then(結(jié)果)End If’(結(jié)束If判斷語句)
在 If 語句判斷的過程當(dāng)中,還可以有子判斷語句:Elseif then 。
對于一個具有多重判斷的語句,我們大致可以這樣理解:如果(If),那么(Then),否則(Elseif),那么(Then),再否則(Elseif),那么(Then)……(ElseIf根據(jù)情況可以套嵌很多層)最終(Else),結(jié)束判斷(End
If)。
本實例的知識擴(kuò)展:
1、試一試自己在程序結(jié)尾處再添幾句,判斷所猜的次數(shù):如果小于六次,給出一個評價“優(yōu)”;等于六次,給出一個評價“良”;大于六次,給出一個評價“您還需努力!”。
2、試一試給程序補(bǔ)充部分內(nèi)容,其功能為:在猜完一次后,詢問游戲人“您還愿意再玩一次嗎?”,并根據(jù)游戲者的響應(yīng),再次運(yùn)行程序或退出程序。
3、如果在剛開始游戲讓我們輸入數(shù)字時,我們選擇了“取消”就會出錯,您現(xiàn)在能利用自己已有的知識來解決這個問題嗎?
好了,到這里,我們再回過頭來看一看這個程序,理解起來還有困難嗎?本實例可能比前兩個實例稍難一點。如果您能順利完成知識擴(kuò)展中的問題題,那么祝賀您,您已過了入門的第一個小難關(guān),可以進(jìn)入下一步的實例四了,如果您還存在疑問,則再請多動手把前三個實例練一練??!
附:完善的猜數(shù)游戲——
Sub 您猜()
Dim a, b, c, d, e, f
e=6’該數(shù)字用于計算所猜次數(shù)是否為優(yōu)、良等
Do
a = 0
Randomize
b = Int(100 * Rnd)
Do
a = a + 1
c = InputBox("請輸入您所猜的數(shù)")
d = CInt(c)
If b < d Then
MsgBox ("您猜的數(shù)大了")
ElseIf b > d Then
MsgBox ("您猜的數(shù)小了")
Else: b = d
MsgBox ("哈哈,您猜對了!")
Exit Do
End If
Loop
MsgBox ("您猜了" & a & "次!")
If a>e
MsgBox ("您還需努力!")
Elseif aMsgBox ("您的猜數(shù)能力:優(yōu)!")
Else a=e
MsgBox ("您的猜數(shù)能力:良!")
End if
f=MsgBox ("您還愿意繼續(xù)玩嗎?",4,”繼續(xù)游戲”)’’注意此處常數(shù)的使用
if f=7 then’’注意此處消息框返回值的使用
exit do
else
end if
loop
End Sub
|