


想做個猜數游戲
原本想要猜錯一次數后顯示猜大或猜小,經過三次回圈后再告知游戲結束,而不是猜錯一次后就告知游戲結束
求各位大神忙忙幫看看哪里出了問題?
uj5u.com熱心網友回復:
全是圖片,想復制修改都不行。你把 timers 變數變成公共變數,而不是放在這個程序中。猜數結束時,要將它清零。
uj5u.com熱心網友回復:
Private Sub Command3_Click()
Dim i, m, a, b, times As Integer
a = Text1.Text '獲取系統產生的亂數,并賦給變數a
b = Text2.Text '把用戶輸入的值賦給變數b
times = 1
For m = 1 To 17
Next m
Do While times <= 3
If b = a Then
Print "恭喜你,你猜對了!猜中的數為" & a & "恭喜你獲得一次抽獎機會!"
Command5.Visible = True
Command2.Visible = True
Command4.Visible = True
Exit Do
ElseIf b > a Then
Text2.Text = ""
Text2.SetFocus
Print b & "猜大了,改小點,再試試!"
ElseIf b < a Then
Text2.Text = ""
Text2.SetFocus
Print b & "猜小了,改大點,再試試!"
End If
times = times + 1
Loop
If times > 3 Then
i = MsgBox("猜數失敗,游戲結束!" & vbCrLf & "正確答案為" & a & "!你可以點擊顯示隨機按鈕")
Print "猜數失敗,游戲結束!"
Print "正確答案為" & a
End If
End Sub
uj5u.com熱心網友回復:
1. 數值范圍是“1-20”,只給3次機會是不合理的,理論上最多是需要5次機會。(如果2^k 剛好能比你的亂數最大值大,那么理論上最多需要k次機會)
2. 你的 For m=1 to 17“換行”來調整輸出位置,也是不合理的。效率低、并且會受“系統主題設定”的影響。
準確、高效的方法,是用一句 Me.CurrentY = xxxxx 代替你那個For回圈。
按你目前的表單界面,如果你沒有更改視窗的“度量單位”,那么xxxxx = 3000可能跟你的For回圈結果相近。
你可以自己調整這個值的大小,看看效果。
3. 變數定義的陳述句寫法不正確,VB6中需要對每個變數逐個指定型別,否則變數型別就會是Variant型別的。
這三條跟你的“運行結果”無關,只想跟你說一些“基礎知識”方面的東西。
你遇到的問題并沒什么難度,自己仔細想想、跟蹤一下執行程序,就可以找到哪兒的問題。
uj5u.com熱心網友回復:
Option ExplicitCommand1 是開始游戲(生成亂數);Command3 是提交輸入的數字。
Dim times As Integer
Private Sub Command1_Click()
Text1 = ""
Randomize
Text1.Tag = Int(Rnd() * 20) + 1
times = 0
Text2 = ""
Text2.SetFocus
End Sub
Private Sub Command3_Click()
Dim a As Integer, b As Integer
a = Text1.Tag
b = Text2.Text
If b = a Then
Text1 = a
MsgBox "恭喜你,你猜對了!"
Exit Sub
End If
times = times + 1
If times >= 5 Then
MsgBox ("猜數失敗,游戲結束!")
times = 0
Text1 = a
Exit Sub
ElseIf b > a Then
MsgBox "猜大了,改小點,再試試!"
Else
MsgBox "猜小了,改大點,再試試!"
End If
Text2.SetFocus
Text2.SelStart = 0
Text2.SelLength = Len(Text2)
End Sub
Private Sub Form_Load()
Text1 = ""
Text2 = ""
End Sub
uj5u.com熱心網友回復:
猜數的策略問題。一、對分法
這是基于 3 樓問題 1 的最直接聯想。將在位置區域內選對分點,逐步縮小范圍。對于 20 以內的猜數,對分法最多 5 次可猜中。
平均 3.7 次。
1 10, 5, 3, 2, 1
2 10, 5, 3, 2
3 10, 5, 3
4 10, 5, 3, 4
5 10, 5
6 10, 5, 8, 7, 6
7 10, 5, 8, 7
8 10, 5, 8
9 10, 5, 8, 9
10 10
11 10, 15, 13, 12, 11
12 10, 15, 13, 12
13 10, 15, 13
14 10, 15, 13, 14
15 10, 15
16 10, 15, 18, 17, 16
17 10, 15, 18, 17
18 10, 15, 18
19 10, 15, 18, 19
20 10, 15, 18, 19, 20
二、0.618(黃金分割)法
這是對大量引數選擇進行實驗時常用的一種優選法。就是對未知區域選取位于 0.618 處的點。不過,對于 20 以內的猜數,它并無優勢。
1 12, 6, 4, 2, 1也是平均 3.7 次。
2 12, 6, 4, 2
3 12, 6, 4, 2, 3
4 12, 6, 4
5 12, 6, 4, 5
6 12, 6
7 12, 6, 9, 8, 7
8 12, 6, 9, 8
9 12, 6, 9
10 12, 6, 9, 11, 10
11 12, 6, 9, 11
12 12
13 12, 17, 15, 14, 13
14 12, 17, 15, 14
15 12, 17, 15
16 12, 17, 15, 16
17 12, 17
18 12, 17, 19, 18
19 12, 17, 19
20 12, 17, 19, 20
uj5u.com熱心網友回復:
我是“想”的對分法,你確實沒有猜錯。
但是,這兩種方法的“優勢”,你是不是弄錯了?
難道你擺了一個聽起來“高大上的方法名稱”,它就一定是最好的方法?

我寫了段代碼來測驗,確實是在“1到20”時,兩種方法的結果一樣。
但范圍增大后,二分法是明顯占優的。

好吧,我承認:也許我的“黃金分隔法”的代碼不正確,因此結果是“反的”了。
我跟蹤了一下“1到20”時的黃金分隔法程序,小于12時產生的“序列”確實跟你的不一樣,12以上的序列是一樣的。
“二分法”的代碼大家都知道,因此我也沒必要貼出來了。
那么,請你把你的“黃金分隔法”猜數的代碼貼出來看看,可好?
我的“測驗方法”是這樣的:
對于一個“猜數”方案Fun( ),傳給它一個數,
在它里面按對應的方法、數值范圍進行“猜數”,然后回傳猜這個數用了多少次。
對于“數值范圍”,最小值都是定的1,最大值就用一個模塊級變數存盤了,沒必要在每次呼叫時通過引數來傳遞。
uj5u.com熱心網友回復:
呵呵,這個不需要試驗確認,數學界早就解決了的問題。uj5u.com熱心網友回復:
好吧,看來“實踐是檢驗真理的唯一標準”可以扔垃圾堆了…………今天漲姿勢了:
真理就是真理,無需用實踐來檢驗。
如果“驗證”結果與理論不符,無論如何都是“驗證方法的問題”。
uj5u.com熱心網友回復:
的確要區分哪些東西需要“實踐檢驗”。比如,中學物理試驗往往是為了展示牛頓定律,而不是驗證它的正確性。數學問題,往往是通過證明來解決的。有時,即便拿到一些實驗資料,也無法推論出試驗資料以外的情況。我想,這個你一定懂的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/57458.html
標籤:VB基礎類
上一篇:vb基本
