【VB6】如何用純VB代碼寫個五子棋程序?(一)

(本文適合VB初學者)

打開VB——新建標準EXE項目

 

 

 

完成這些最基本的之後點確定

我是打算寫一個雙人五子棋軟件

所以界面程序需要全屏/自由大小

在這裏我先做一個可接受大小的窗體

這樣就可以安排佈局了

改個名字顯得更專業一點

VB裏面承載繪圖的控件主要有窗體和picturebox

它們兩個可以用line函數畫直線/方塊,Circle函數畫圓

對於一個五子棋軟件已經夠用了

而我們一般不選用窗體作爲畫板是因爲窗體會被其它控件遮擋,且靈活性低。

所以這裏最佳用作棋盤的控件是picturebox

這裏我們修改一下棋盤的大小成正方形,順便修改一下棋盤控件的名字

在我所想的雙人五子棋軟件中,要實現非死控制形式的黑白棋落子交替,因此需要實現一個類似棋盒的需求,程序通過判斷上次觸碰的棋盒顏色來判斷落子顏色


簡單來說就是需要兩個棋盒

棋盒需要有哪些功能呢?
1、要有能力讓使用者區分黑白兩類棋子
2、要可以接受點擊事件
3、要可以改變位置

能實現這些功能的控件蠻多的,例如按鈕控件(commandButton)、picturebox、label、text……

這裏我們選取picturebox,因爲這個控件可以加載圖片

也就說我們可以從網上下載棋盒的圖片並用它表現出來

同理,它也可以表現棋盤的圖片

但是這裏我們就都暫時不找了

爲了開發速度

但是我們如果有需求,就可以立馬鳥槍換炮。這就是編程中一個很重要的遠見意識

可以看到,我將其命名爲了棋盒

但是細心的同學可能發現

棋盒後面爲啥多了個"(0)"?

這是因爲這兩個棋盒本質上是一類東西

也就意味着它們很多方法是共通的
那不如干脆把它們當成一個控件的兩個分身來看待

index屬性是將控件當做一個數組來看待

很多同學可能還不知道數組是啥

VB裏面數組的聲明是:
dim a(10)

使用數組前必須申明,否則會編譯錯誤

dim a(10)
這樣定義之後
相當於同時定義瞭如下變量:
a(0)
a(1)
...
a(10)

雙擊棋盒控件,在代碼編輯界面可看到棋盒的點擊事件後面包含了一個叫index的參數

棋盒的鼠標移動事件也包含index參數

index參數是啥?
聰明的同學應該聯想到了什麼……沒錯,它就是控件Index屬性的數字,及該控件在數組中的編號

也就是說,我可以寫一個事件的處理方法,就可以處理所有具有相同性質的控件操作

而區分這些控件的關鍵就是index參數

這裏,黑棋盒Index=0,白棋盒index=1.這是因爲數組默認從0起算

界面弄得差不多了,接下來就是邏輯部分了

五子棋五子棋,肯定要有棋盤才能下棋對吧

所以第一件事就是繪製一個棋盤出來

那我們什麼時候需要繪製棋盤呢?

下一局棋的時候就需要對吧

所以程序一打開就應當有一個繪製好的棋盤了

因此我們在程序啓動事件內寫繪製棋盤的代碼邏輯

雙擊窗體空白處

我們將獲得程序的窗體創建事件

這個事件內寫的代碼將在窗體加載時執行

繪製棋盤,我能想到的算法如下:
1、直線與直線相交
2、一個個方塊相疊
3、用圖片

這裏我們選取算法1,因爲最簡單,只需要畫15+15根線就可以繪製好五子棋棋盤了

而方塊需要繪製15*15個

圖片的話網上沒有合適的(我反正是信了)

在畫畫之前還有一個重要工作,就是建立直角座標系

爲啥不建立(0,0)-(14,14)這剛好15+15根線啊

因爲上下左右各空一點出來可以使棋盤更美觀的同時,有地方後面讓程序顯示棋盤的座標

座標系建立了接下來就要畫線了

這裏我們使用for結構來構建15+15線的繪製

這樣我們需要的棋盤應該就會在程序運行時畫好了

F5運行程序,咦爲什麼圖像沒有出現呢?

(運行前我已經把棋盤背景色修改成屎黃色了)

這是因爲autoredraw屬性爲false的緣故

所有帶有繪製函數的控件基本上都帶有這個屬性

它的作用簡單來說就是保持繪製內容,不讓它消失。

所以這裏我們要設置成true

再次運行程序

嗯,一個棋盤就畫好了

是不是很簡單- -

接下來就是完成落子的功能了

棋子有哪些屬性?顏色、大小、位置

顏色無非黑白,大小肯定是比一格略小,就直徑0.8吧

位置的話肯定是由鼠標點擊的棋盤位置來確定的

click事件只能感知是否點擊控件而無法告訴我們點擊位置

因此我們放棄它,而選用mousedown(鼠標點擊)事件

接下來我們就在我們點擊的位置生成一顆黑棋好了

運行程序點擊棋盤任意位置

獲得了一個空心黑圓

那如何畫出一個實心圓呢?別急,控件有專門的屬性來控制

再畫個圓就ok了

回到我們的需求

根據我們選擇的棋盒顏色來判斷落子的顏色對吧

所以我們要用一個變量來儲存我們現在到底是選擇的哪個棋盒

還記得棋盒的本質區別嗎?

index屬性!

首先,我們申明一個窗體級變量來存顏色。顏色的本質聰明的同學通過rgb函數的本質應該想到是數值了

可以看到,棋盒的click事件我也準備好了,萬事具備只差東風:觸發點擊棋盒事件時將被點擊的棋盒的標識記憶下來

記憶下來之後,我們只需要在落子前做一個棋盒判斷選擇相應落子色的邏輯,就可以實現我們根據點擊的棋盒來確定落子顏色的需求了

這裏有一點比較妙的是

我們把棋盒的顏色設置成了黑白兩色,那我們可以直接用我們記下的棋盒標識直接把棋盒的顏色取給落子呀!

這樣就不要做判斷邏輯了!

我先寫一個用判斷邏輯來做的實現:

效果如下:

第二種邏輯:

可以看到,語句更簡潔高效

而且本質上根據棋盒顏色決定棋子顏色的性質也更適合擴展:例如粉色的棋盒就可以下出粉色的棋子

第二種邏輯的表現也是滿足需求的

現在我們的軟件已經滿足了可以展現一場對局的棋子佈局了

那我要悔棋怎麼辦啊?

那我要再開一局怎麼辦啊?

我要棋子落得更整齊應該怎麼辦啊?

我想讓程序告訴我哪方勝利該怎麼辦啊?

我想雙方交換棋盒顏色該怎麼辦啊?

且看下回分解

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章