本單元的最終目標是要製作線上的五子棋遊戲,但由於遊戲內容的複雜度,我們先在此單元製作棋盤操作的基本功能。也可以說是先製作只能下一種顏色棋子的單機版的五子棋,在表單上先產生如圍棋棋盤的19X19的網格圖,再使用MouseDown事件偵測滑鼠點擊位置,繪製圓形黑色的OvalShape物件,算是五子棋的黑棋,同時我們也將建立偵測棋子是否連線(五顆)的偵測程式。

表單製作

請開啟新專案建立如上表單,左邊是一個 Panel 物件準備做棋盤之用,在工具箱的容器類可以找到,長寬定為570X570,我們計畫一個棋格的長寬是為30點,19格的棋盤長寬就是570點了!右邊是一個清除棋盤的按鍵。

加入參考
如同塗鴉牆,我們稍後會用需要畫圓形的Shape物件當作棋子,所以請加入參考Microsoft.VisualBasic.PowerPacks.Vs。


畫棋盤的程式
在Form_Load事件中寫程式如下:

1.宣告CVS畫布(ShapeContainer)物件,稍後代表棋子的Shape物件必須放在這個物件上面。
2.宣告一個19X19的S二維陣列,稍後將用於紀錄棋盤黑白棋子分布的狀態。
3.使用影像繪圖的方式繪製棋盤影像,放到 Panel1的背景當作棋盤
4.為了讓落子時反應較快,使用畫布上繪製Shapes物件的方式,所以建置一個canvas畫布物件貼到Panel1上面。
5.繪至格線時我們自座標15開始畫是因為五子棋是下在格線的交點,所以第一個棋格的中心點是座標(15,15),而不是(0,0),所以概念上第一格的範圍是座標(0,0)到(30,30)沒錯,但是畫線時是畫在格子的中心線(15,15)上。
執行程式後畫面是這樣的:


下棋的動作
下棋就是使用者以滑鼠在棋盤(Panel)上點選位置,程式寫在Panel1_MouseDown事件,程式碼如下:

此處的程式應該能讓玩家隨意點棋盤(Panel1)的一個位置就出現一個黑棋,而且棋子會自動調整到棋盤的格線交點上面!
1. 首先倒斜線("\")表示整數除法,就是無條件捨去小數,因此譬如X座標 57\30=1,表示是在索引1的那一格,因為索引自0開始,所以就是指水平向的第二個棋格!依此類推。
2. C.Left = i * 30 + 2這種語法其實就是讓棋子的座標取整數,永遠會在30的倍數也就是棋格線交點上出現,因為棋子設定得比棋格小一點(取26點長寬以免看起來太擠),所以棋子位置還必須偏移個2點。
3.宣告建置圓形 Shape物件的方式與一般動態物件相似,做好之後設定富物件為CVS畫布。
程式如果正確的話就可以在任意位置下棋,目前程式下的都是黑子,我們最終設計的結果是自己下的是黑子,對手下的是白子,所以白子應該來自對手的下棋訊息,我們會在下一單元製作。


檢查勝負的程式
在此必須建立一個自訂的 Function 副程式(chk5),來執行檢查是否有五子連線的狀況,程式當然不太簡單,我們先試著建立只會檢查水平連線的程式碼:

1. 程式是以下棋的位置座標(i, j)為中心點,左右四點為搜尋範圍,如果要檢查的點沒超出棋盤(大於等於0,小於19)就去查驗S陣列中該點的值,1代表黑棋,2代表白棋,此副程式的參數tg就是1或2,代表要檢查的是黑或白棋連線。
2. 在此n是連線的棋子數目,副程式會像人為判斷一樣去數連續出現的同色棋子,有連續同色棋子時n持續加1,如果中斷了,就令 n 歸零重算。
3.如果n累計到達5就是連線成功回傳True。
4. 如果通通找完都未到達 n=5,則回傳False表示沒有連線。
我們在下棋的程式碼之後加上叫用chk5的程式如下紅框部分,就可以試試看程式會不會偵測水平5連線了!

成功的話會像這樣!


其他連線狀態的檢查程式
可能的連線方向除了水平向還有垂直向、左上到右下與左下到右上等四個方向,程式碼相當類似如下,chk5的完整程式碼如下:

試試看,應該各個方向的連線應該都能偵測了!

清除重玩
最後是清除重玩的按鍵,程式碼如下:

就是將CVS畫布裡面的Shape物件,也就是棋子清乾淨!同時重設S矩陣,這會讓它的內容通通回到預設值0!