遊戲執行流程圖
棋盤空格與棋子圖案
    
本單元的目的是使用UDP為通訊基礎,互相傳遞井字棋盤的狀態,來完成井字連線的線上遊戲。首先請開啟一個專案,將上述三個圖檔加入為資源檔案E代表空格,其餘兩圖代表圈叉,完成後專案屬性頁會顯示如下:


表單設計

表單設計如上,請注意中間的九個(3X3)物件代表棋盤,由Button物件構成,名稱須改為B0~B8,如下圖:
B0 B1 B2
B3 B4 B5
B6 B7 B8
此外,每個按鍵的Image皆載入資源檔的E(空格)影像,按鍵要調整大小為100X100點長寬,並將Tag值設為"_"表示空格。啟動接收的按鍵為Button1,重玩按鍵為Button2,文字方塊依序為TextBox1~3,勝負訊息標籤為Label4。

繼承不變的程式碼
以下幾個程式單元與之前的單元相同,打開舊專案複製即可。不是偷懶哦!這叫做『繼承』,程式老是重寫誰等你呀!
首先是匯入的命名空間:

接著是啟動監聽的程式

在啟動按鍵程式中會呼叫Listen副程式,你可以先建立一個程式框架,以免一直受錯誤題是困擾,如:
        Private Sub Listen
        End Sub
如果你需要與同學互傳訊息測試時可以加入以下Form_Load程式,你的IP就會顯示於標題列了!


棋盤狀態字串
本遊戲在玩家之間傳遞的是一個棋盤狀態字串,就是九個按鍵B0~B8的Tag屬性值串起來的字串!預設都是"_"就是九個"_",稍後自己下的位置會是圈"O",對手下的位置會是"X"。字串可能變成這樣:"_O_X_O_X_"。
這個設計下兩個玩家都會看到自己在畫圈圈,對手畫的是叉叉,所以各自取得的狀態字串中"O"與"X"應該是相反的,我們會在稍後每次收到資訊時反轉它們。
檢查輸贏的程式 chk
上述字串的作用主要是用來判斷是否有連線,因為每次主動下棋後的結果一定是"O",所以檢查連線的程式只需要檢視"O"的連線,我們設計一個chk副程序,如有連線就回傳True,沒有時回傳False,程式碼如下:

其中C(?)就是對應到按鍵B(?)的Tag值了!C(0)C(1)C(2)就代表最上方的橫向連線,依此類推!

下棋的程式
下棋就是要點選B0~B8的其中一個按鍵,改變空格為圈。請先雙按B0按鍵產生B0_Click事件副程式,再加入共用,讓B1~B8的Click事件都可以共用此副程式,而且應該建立一個控制下棋次序的變數T,輪到自己下時T=True,論到對手時T=False,這個變數必須持續記得,所以要公告為公用(全域)變數,完整程式碼如下:

1.如果Tag不為"_"表示此格已經有棋子,應離開副程式
2.如果T=False表示不是輪到你下,也應離開副程式
3.條件合法時畫圈,註記Tag="O"
4.建立棋盤狀態字串,並檢查勝負(我是不是贏了?)
5.傳送棋盤狀態字串給對手
5.自己下好了輪到對手,T設為False

監聽副程式 Listen

監聽副程式收到對手的棋盤狀態字串(A)之後,首先要檢查對手("O")是否已經連線(我是不是輸了?)。
接著將棋盤狀態字串的圈叉反轉並繪製新棋盤以及重新設定Tag值。
最後將T設為True,表示輪到我可以下棋了!

重玩的按鍵功能

重玩就是將所有狀態歸零!包括圖案與Tag值,清除勝負訊息,還有設定T=True表示我可以開始下棋。
執行畫面大概如下: