五子棋 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

 

 

 

 

 

 

在图中,有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

 

你可能感兴趣的:(五子棋)