大家好,從本週開始,VB教學教室要開始講解新的單元-大家來玩猜數字了, 嘻嘻...快沒料了....這個主題講完就不知道要講些什麼了...
嗯,我們這一週先從一些猜數字的基本概念來講起,我想大家應該都玩過猜數字 ,猜數字的規則我就不說明了,在寫這個程式時,有兩點重點需要注意的, 第一個就是數字正確率的判斷,這一點可以依者一個簡單的If判斷式或者是一個 簡單的For迴圈來一個一個比對數字的正確性,我們就可以簡單的判斷出這一個數字 是幾A幾B,而另一個重點就在於電腦的AI了(喔!嚴格來講,程式裡用的叫做暴力法 不算是AI,不過也是可以達到與電腦對戰的目的),電腦的AI判斷邏輯我們可以這樣想, 假設目前進行的是3個數字的猜數字遊戲,那麼數字的組合就是
000
001
002
....
999
共一千組的數字組合,而就猜數字一般的不成文規定來說,你所組合的三位數字, 是不能重覆的數字組合,所以我們就要利用程式來將不合乎條件的數字剃除,再利用一個 數字陣列將其儲存起來,而當遊戲流程進行到電腦方進行猜測時,就從目前的數字陣列裡 隨機挑出一組數字進行猜測,程式再加以比對,這時電腦的判斷才要開始,假設電 腦此次猜測的結果是1A2B,猜測的數字是123,那麼,電腦就將目前數字陣列裡的 數字一一取出與123比對,將所得結果不是1A2B的數字剃除,道理很簡單, 我們將123與正確答案比對得出1A2B的結果,而我們的數字陣列裡 也只有可能是答案的數字組才會與123比對出1A2B的結果,這樣我們就能一步一步刪選出 正確的答案了。用這種方法來推演,效率很不錯,但是由於是用簡單的暴力法, 所以難免有點不夠人性化,例如
1234
1235
1236
1237
在電腦的演算法裡,如果剩下的答案是這四組,那麼它所需要答題的次數就是 1~4次,在最差的情形下,它可能得進行四次猜測才能得到正確的解答, 而人的思考方式呢?當遊戲進行到只剩這四種可能時,我們卻可能這樣思考, 第一次我們猜的可能是4589,這樣我們就可以一次Check4和5兩個數字,可以馬上得知 4567那兩個數字才可能是正確的答案,再去猜測剩下的兩個數字那一個才是正確的解答, 所需的答題次數則是2~3次,這樣相比下來,很明顯的,人類的確是有智慧多了,不 過實際上呢?那就不一定了,端看情況來講,電腦的這種暴力法還是比較佔優勢的, 至少,它不會想錯的。

接下來,這個程式的另一個重點,連線對戰,最近網路正熱者,什麼東西都 要跟網路攀點關係,我也就順勢做個網路功能來應應朝流囉, 用VB來做這種網路對戰,基本上來講,還算簡單,應用內建的winsock元件 就可以簡單的和另一台電腦建立通訊,所以我們的重點就放在建立 電腦與電腦間的溝通,依遊戲需要,我定義了四種主要的狀態碼,簡單表列如下
Public Const CONNECT_MSG = "0" '連線資訊
Public Const NORMAL_MSG = "1" '一般對話資訊
Public Const GAME_MSG = "2" '遊戲相關資訊
Public Const CLOSE_MSG = "3" '斷線訊息
其中遊戲訊息又再細分為

'Game的資訊類別
'"0" Server送出Game Start的要求,後面帶3-5個Byte的資料 第一個Byte為遊戲難度,後面則為對方的答案
'"1" Client答應Server Game Start的要求,後面帶2-4Byte的資料,為Client的答案
'"2" Client拒絕Server Game Start的要求
'"3" 允許對方輸入數字
'"4" 對方勝利囉!
Public Const MSG_GAME_START = "0"
Public Const MSG_CLIENT_START = "1"
Public Const MSG_CLIENT_CANCEL_START = "2"
Public Const MSG_INPUT_OK = "3"
Public Const MSG_GAME_WIN = "4"

簡單一點講,對戰遊戲的流程可以表列如下
1.主方啟動遊戲,打開連線,等待客方加入
2.客方啟動連線,向主方送出連線訊息
3.主方接收到客方連線訊息,進行連線步驟,連線完成回送連線訊息給客方
4.主方進行遊戲設定向客方送出遊戲訊息
5.客方接收主方遊戲訊息,回覆主方
6.進行遊戲
7.遊戲結束或程式關閉,送出斷線訊息,另一方接收到斷線訊息亦進行斷線,結束遊戲
而其中的對話訊息只要連線成立,就可以傳送,可以做簡單的線上交談。 這一次就先講解到這裡為止,下一週我們再對照程式來慢慢說明。
回到VB教學教室