這一期我們要來講解遊戲的進行了,這個遊戲裡,如果是和電腦對戰的話, User則一定處於先攻的狀態,在按下遊戲開始,一切參數都初始化後, 我們就把Focus設定到txtUserInput,使用者就可以開始進行遊戲了, 使用者輸入要猜的數字後,按下Enter便由程試來判斷是否正確, 不正確的話,就改由電腦來猜我們的數字,我們來看一下這一段程式吧!

Private Sub txtUserInput_KeyPress(KeyAscii As Integer)
'假如按了Enter就Check猜的數字對不對,有沒有贏,
'如果處於連線狀態,再將資料傳給對方

If KeyAscii = 13 Then
   判斷按下Enter鍵


   KeyAscii = 0
   將按鍵取消,做不做都沒差,消除Enter的按鍵聲而已

   If ConnectStatus = True Then
      這一段目前用不到!
   End If
   If CheckUserNumber(txtUserInput.Text, CPUNumber) <> True Then

接者我們呼叫CheckUserNumber這一段副程式來Check User這一次猜對
幾個數字,如果沒有猜對,就讓電腦猜User的數字,如果電腦猜對就
GameOver了!否則就繼續遊戲,將Focus設回Input的text中

      If txtUserInput.Enabled = True Then
         txtUserInput.SelStart = 0
         txtUserInput.SelLength = GAME_NUMBER
         txtUserInput.SetFocus
      End If
   Else

如果CheckUserNumber傳回True,代表User贏了,
Show出訊息,將控制項作一些設定就O.K了
      cmdGameStart.Caption = "遊戲開始"
      txtUserInput.Enabled = False
      GameSetUP.Enabled = True
      NetButter.Enabled = True
      MsgBox "You Win!!", , Me.Caption
   End If

ElseIf KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then
   按的不是數字鍵就把它取消掉
   KeyAscii = 0
End If
End Sub

接下來我們看這段程式的重點部份,CheckUserNumber這一段副程式
Private Function CheckUserNumber(xNumber As String, AnsNumber As String) As Boolean

'User猜電腦數字的判斷
'Check Input Error , If Error Exit Sub
'Check Match Number,If 4A then User Win Exit Sub
'Else Call CPUGo,換電腦猜User的數字
'假如電腦猜對,就GameOver囉!

Dim i%, j%, MatchA%, MatchB%

先判斷輸入的數字正不正確
1.長度   2.數字有沒有重複

If Len(xNumber) <> GAME_NUMBER Then
   MsgBox "請輸入正確數字!", , Me.Caption
   Exit Function
End If

If CheckSameNumber(xNumber) = True Then
   MsgBox "數字重覆!", , Me.Caption
   Exit Function
End If


接者利用For迴圈來將User輸入的xNumber與正確解答AnsNumber
作比對,將幾A幾B的結果推算出來

For i% = 1 To GAME_NUMBER
    For j% = 1 To GAME_NUMBER
        If Mid$(xNumber, i, 1) = Mid$(AnsNumber, j, 1) Then
           If i% = j% Then
              MatchA = MatchA + 1
           Else
              MatchB = MatchB + 1
           End If
        End If
    Next j%
Next i%

將結果List出來
lstUserRecord.AddItem xNumber & Space(3) & Format$(MatchA, "0") & "A" & Format$(MatchB, "0") & "B"


假如沒有全部猜對的話,那就換電腦猜我們的數字了
If MatchA <> GAME_NUMBER And ConnectStatus = False Then
   Me.Caption = "電腦思考中..."
   Me.MousePointer = 11
   DoEvents

   呼叫CPUGo這個副程式來進行電腦猜數字的推算
   原理我已經大概說明過了
   這裡就不在累述了
   如果電腦答對的話,就GameOver了,
   不過這裡有一點要注意的是
   我在CheckUserNumber裡,傳回True代表User勝利
   但是不傳回True卻不表示就是電腦贏了,
   因為真正的情況應該有三種
   User贏,電腦贏,不分勝負繼續遊戲
   因此我們應該用其它的方法來簡查電腦是否獲得勝利,
   在這裡我用的是txtUserInput的Enabled屬性來判斷
   如果電腦猜對了,txtUserInput.Enabled就設為False
   
   If CPUGo() <> True Then
      Me.MousePointer = 0
      Me.Caption = "大家來玩猜數字"
   Else
      Me.MousePointer = 0
      Me.Caption = "大家來玩猜數字"
      cmdGameStart.Caption = "遊戲開始"
      txtUserInput.Enabled = False
      NetButter.Enabled = True
      GameSetUP.Enabled = True
      MsgBox "電腦贏了!" & vbCrLf & "電腦的答案是...  " & CPUNumber, , Me.Caption
   End If
ElseIf MatchA = GAME_NUMBER Then
   CheckUserNumber = True
   Exit Function
End If

整個猜數字遊戲就是這麼簡單而已, 如果沒有分出勝負就一直在這個程序循環下去, 直到分出勝負為止
這個遊戲裡,我讓先攻的一方佔了比較大的優勢, 因為只要有人猜對了,遊戲就宣告結束, 不會有所謂的平手這種狀況發生,如果你覺得這種方法不公平的話, 可以自己改良一下,讓這個遊戲更有趣吧!
NextTime:連線對戰講解!!敬請期待!!(哈哈...這次有點偷懶,篇幅小了很多, 下次再見囉!)
回到VB教學教室