五子棋 VB6.0

來源:互聯網
上載者:User

遊戲名稱:五子棋

作者:林偉

Email:ray530@21cn.com

  遊戲說明:

       相信這款遊戲已經無人不曉。但很多朋友都很想要這款遊戲的代碼。剛好今天我比較有時間。就試著寫一下,此遊戲為單機板,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: Ray530@21cn.com

 

 

 

 

 

 

 

原代碼:http://www.monthsoft.com/file/FiveGame.rar

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.