五子棋 VB6.0

遊戲名稱:五子棋

作者:林偉

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個點陣。每兩個點的數值就代表着每一個位置。起點爲(00

 

接下來,我們必須想辦法將兩個點轉換爲數值,因爲我們聲明的是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

PIC1-1在圖中,有0~255個數子,分別按順序排列着。這些數字代表着我們所聲明數組的各個元素。

數組類型爲Boolean代表該元素是否存在棋子。

 

Private Arr(255) As Boolean                                               '//聲明是否存在棋子的數組變量

 

並用一個I循環,遍歷整個數組,對4個可能存在連串的位置進行判斷。是否都爲True

並且再圖中,已給出4個方框。我們用36作爲中心點(代表當I循環到達36時)將4個可能發生連串的位置圈起來。

首先,我們可以發現一個規律。大家先看“/”型線。3650647892。都是每隔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此變量。

 

最後細節方面就不再討論。本人第一次發表論文,文采很差。還請見諒解。如果願意跟我交朋友,請加入QQ630843。或Email: [email protected]

 

原代碼下載地址:http://www.monthsoft.com/file/FiveGame.rar

 

發佈了11 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章