游戏名称:五子棋
作者:林伟
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