遊戲名稱:五子棋
作者:林偉
Email:[email protected]
遊戲說明:
相信這款遊戲已經無人不曉。但很多朋友都很想要這款遊戲的代碼。剛好今天我比較有時間。就試着寫一下,此遊戲爲單機板,2人輪流控制。你可根據自己的需要做一些修改。
那麼接下來就來介紹一下,遊戲的構思。
遊戲構思:
首先,我們知道,五子棋的棋盤是15*2條線。那麼我們在下棋的時候,必須將所下的棋對齊到某兩條線的交叉點上。其次,我們必須判斷將要下的某個點上,是否已經存在棋子,如果已經存在,那麼此任務必須中斷。再次,是關鍵的事情,就是怎樣判斷五個棋子是否連成了一串?分別是橫、豎、撇、納四個方向。假如我們所放下的棋子剛好符合這四個方向其中一個的條件。那麼該遊戲就可以結束了。
接下來就來介紹,怎樣實現上述功能。
我們首先將一個圖片框Picture1 作爲一個容器(棋盤)用於存放棋子。該棋子使用Shape控件btnblack() 控件數組,放入Picture1中。在圖片框中,我們用Line方法畫出一個(15*2)的線陣。
那麼先來看看這段代碼:
代碼1、
Private Sub Form_Load()
Const START = 14
Picture1.Scale (0, 0)-(START, START)
For i = 0 To START
Picture1.Line (i, 0)-(i, START)
Next i
For j = 0 To START
Picture1.Line (0, j)-(START, j)
Next j
Call Init
End Sub
我們用Form_Load() 事件來初始化線陣,在這個過程函數中,我們看到如下代碼:
代碼2、
Const START = 14
Picture1.Scale (0, 0)-(START, START)
該代碼的意思爲將Picture1分割爲15*15個點陣。每兩個點的數值就代表着每一個位置。起點爲(0,0)
接下來,我們必須想辦法將兩個點轉換爲數值,因爲我們聲明的是1維數組。我們可以自定義一個函數。來自動轉換,該函數名爲;ConventToNumber
代碼3、
Private Function ConventToNumber(X As Integer, Y As Integer, Optional opt As Boolean = False) As Integer '//將座標轉換爲數組元素
Dim Num As Integer
For i = 0 To 14
For j = 0 To 14
Num = Num + 1
If X = i And Y = j Then
If opt Then IsWho(Num) = Who '//opt代表新增一個棋的時候
ConventToNumber = Num
ReDim Preserve History(btnblack.UBound + 1)
History(btnblack.UBound) = Num
End If
Next j
Next i
End Function
然後看下段代碼:
代碼4、
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Arr(ConventToNumber(Int(Round(X)), Int(Round(Y)))) = True Then '如果當前存在棋子 則中斷任務
Exit Sub
Else
Arr(ConventToNumber(Int(Round(X)), Int(Round(Y)), True)) = True '將當前是否存在棋子設爲真
End If
Load btnblack(btnblack.UBound + 1)
btnblack(btnblack.UBound).Left = Int(Round(X)) - btnblack(btnblack.UBound).Width / 2
btnblack(btnblack.UBound).Top = Int(Round(Y)) - btnblack(btnblack.UBound).Height / 2
btnblack(btnblack.UBound).FillColor = ChangePlayerColor
Who = Not Who
btnblack(btnblack.UBound).Visible = True
Call getWon(Arr())
Call ChangePlayerColor
End Sub
該過程使用了ConventToNumber函數。目的是將當前捕捉的位置,轉換爲數值,並將Arr()數組的當前轉換的數值的元素,改爲True。表示已存在棋子。
接下來就介紹怎樣實現自動對齊功能。
在代碼4中。
btnblack(btnblack.UBound).Left = Int(Round(X)) - btnblack(btnblack.UBound).Width / 2
btnblack(btnblack.UBound).Top = Int(Round(Y)) - btnblack(btnblack.UBound).Height / 2
表示將當前傳入的座標值,取整。並減去棋子自身的一半。剛剛好對齊到交叉點上。
接下來介紹,怎樣判斷是否連串,請看下圖1-1:
在圖中,有0~255個數子,分別按順序排列着。這些數字代表着我們所聲明數組的各個元素。
數組類型爲Boolean代表該元素是否存在棋子。
Private Arr(255) As Boolean '//聲明是否存在棋子的數組變量
並用一個I循環,遍歷整個數組,對4個可能存在連串的位置進行判斷。是否都爲True。
並且再圖中,已給出4個方框。我們用36作爲中心點(代表當I循環到達36時)將4個可能發生連串的位置圈起來。
首先,我們可以發現一個規律。大家先看“/”型線。36、50、64、78、92。都是每隔14位。那麼很顯然,我們可以使用I循環的內部,再使用一個J循環,該循環用來遍歷“/”型線上5個點,是否都存在。如果存在則遊戲結束。
相同,其他3個圈起來的線,也擁有類似的規律。
Private Function getWon(Arr() As Boolean) '//此數組中返回是否擁有連串(5個一組)
Dim seriesSum As Integer
Dim H
For i = 0 To UBound(Arr) '//便利整個數組
For j = i To (i + 65) Mod 255 Step 16 '/
If Arr(j) And IsWho(j) = IsWho(i) Then seriesSum = seriesSum + 1
Next j
If IsFive(seriesSum) Then Call Win(IsWho(i)): Exit Function
For j = i To (i + 56) Mod 255 Step 14 '/
If Arr(j) And IsWho(j) = IsWho(i) Then seriesSum = seriesSum + 1
Next j
If IsFive(seriesSum) Then Call Win(IsWho(i)): Exit Function
For j = i To (i + 60) Mod 255 Step 15 ' -
If Arr(j) And IsWho(j) = IsWho(i) Then seriesSum = seriesSum + 1
Next j
If IsFive(seriesSum) Then Call Win(IsWho(i)): Exit Function
For j = i To (i + 4) Mod 255 Step 1 ' |
If Arr(j) And IsWho(j) = IsWho(i) Then seriesSum = seriesSum + 1
Next j
If IsFive(seriesSum) Then Call Win(IsWho(i)): Exit Function
Next i
End Function
同時強調,在每下棋的過程中,必須更換棋子的顏色。與當前玩家標識。我這裏使用的是Private Who As Boolean 此變量。並且在每加入一個棋子時,也必須標識該棋子是屬於哪個玩家的。我這裏使用Private IsWho(255) As Boolean此變量。
最後細節方面就不再討論。本人第一次發表論文,文采很差。還請見諒解。如果願意跟我交朋友,請加入QQ:630843。或Email: [email protected]
原代碼下載地址:http://www.monthsoft.com/file/FiveGame.rar