看到的都是用Java或是c++编的五子棋禁手规则,现求用vb编的禁手规则

xiazhimoer 2010-12-20 12:01:34
Dim qish As Integer '执棋手
Dim yy(-1 To 15, -1 To 15) As Integer '棋子坐标,比棋盘多一个边框以判定是否是边界棋
Dim jsh As Boolean '游戏结束标志
Dim t As Integer
Dim h(1 To 5) '连珠五子
Dim qqqqq As Integer
Dim t1, t2 As Integer '双方思考时间总和

Dim jilu(1 To 226) As Integer '操作记录
Dim kk '操作次数
Dim xsh As Integer '先手1为白棋2为黑棋


Public Sub Command1_Click() '开始
jsh = False '游戏未结束标记
qish = xsh '先手执棋标记
Command1.Enabled = False
Command2.Enabled = True
Command3.Enabled = False
If qish = 1 Then Timer3.Enabled = True: Timer4.Enabled = False Else Timer4.Enabled = True: Timer3.Enabled = False '用于记录双方思考时间总和
End Sub

Public Sub Command2_Click() '结束
For a = 1 To 226 '操作记录清零
jilu(a) = 0
Next a

kk = 0 '操作总次数清零
jsh = True '游戏结束标记

For a = 0 To 14 '将棋子图片从棋盘清除 '将控件数组当做二维数组处理
For b = 0 To 14
I(a * 15 + b).Picture = LoadPicture("") '
yy(a, b) = 0
Next b
Next a

Label1(0).Visible = True '恢复默认先手-白棋,Label1(0)可见
xsh = 1 '恢复默认先手-白棋
Label1(1).Visible = False 'Label1(0)不可见
t1 = 0: t2 = 0 '思考时间清零
Timer3.Enabled = False
Timer4.Enabled = False
Label3.Caption = ""
Label4.Caption = ""
Me.MouseIcon = Image4.Picture '鼠标改为白棋图标,用image4保存白棋图标,image4本身不可见
Command1.Enabled = True '允许开始
Command2.Enabled = False '不允许结束,因为已经结束
Command3.Enabled = False '不允许悔棋,因为无棋可悔
End Sub

Private Sub Command3_Click() '悔棋
a = jilu(kk) Mod 1000 '由于保存时用加1000表示白棋加2000表示黑棋,所以在此求余
b = a \ 15 '取整,求出是最近一步棋的纵坐标
c = a Mod 15 '求余,横坐标

I(a).Picture = LoadPicture("") '清除最后一次的操作记录
yy(b, c) = 0
jilu(kk) = 0
kk = kk - 1

If qish = 1 Then qish = 2: Me.MouseIcon = Image5.Picture Else qish = 1: Me.MouseIcon = Image4.Picture '恢复上次的状态
If kk = 0 Then Command3.Enabled = False '当记录数为零时,禁用悔棋
End Sub

Private Sub Command4_Click()
Unload Me '关闭程序
End Sub
Private Sub Form_Load()

For a = -1 To 15
For b = -1 To 15
yy(a, b) = 0 '棋子坐标清零
Next b
Next a

'以下制作棋盘,排列棋子位置
t = 0
I(0).Top = Image1.Top + 240 '定好第一个棋子的位置,以背景图片(棋盘图片)image1位置为标准
I(0).Left = Image1.Left + 240

For a = 1 To 14 '定好第一列棋子的位置
I(15 * a).Top = I(15 * (a - 1)).Top + 648
I(15 * a).Left = I(15 * (a - 1)).Left
Next a

For a = 0 To 14 '确定所有剩余棋子的位置
For b = 1 To 14
I(15 * a + b).Top = I(15 * a + b - 1).Top
I(15 * a + b).Left = I(15 * a + b - 1).Left + 648
Next b
Next a


Me.MouseIcon = Image4.Picture '默认白棋为先手,改变用户鼠标图形为白棋,此处鼠标图片并不是自定义类型
Me.MousePointer = 0 'form框内的鼠标图形为windows默认图形,而不是白棋
xsh = 1 '默认白棋为先手
qish = xsh '先手执棋标记
jsh = True '程序默认为结束状态
Command2.Enabled = False '禁用结束
Timer1.Enabled = False 'timer事件不执行,timer用于显示游戏没开始的提示
Timer2.Enabled = False
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.MousePointer = 0 '鼠标移回form时,鼠标变回windows默认鼠标图形
End Sub

Public Sub I_Click(Index As Integer) '下棋
If jsh = False Then '只有程序不处于结束状态才可以下棋
Command3.Enabled = True '只要下了棋了,悔棋就可用
kk = kk + 1 '记录下棋总步数
If qish = 1 And yy(Index \ 15, Index Mod 15) = 0 Then '如果是白棋在下,并且该处并没有棋子时
I(Index).Picture = Image2.Picture '那么被点击处,显示白棋图片,Image2用于保存白棋图片,程序运行时不可见
yy(Index \ 15, Index Mod 15) = 1 '记下该处下了一个白棋
jilu(kk) = 1000 + Index '保存下棋记录,加1000表示下了个白棋
Call wuzi(Index, 1) '子函数,用于判断是否有人胜利

qish = 2 '交换棋手
Me.MouseIcon = Image5.Picture 'Image5用于保存黑棋鼠标图形
Timer3.Enabled = False: Timer4.Enabled = True '白棋思考时间暂停,黑棋思考时间开始记录


Else: '黑棋部分,同白棋
If qish = 2 And yy(Index \ 15, Index Mod 15) = 0 Then
I(Index).Picture = Image3.Picture
yy(Index \ 15, Index Mod 15) = 2
jilu(kk) = 2000 + Index
Call wuzi(Index, 2)
qish = 1
Me.MouseIcon = Image4.Picture
Timer3.Enabled = True: Timer4.Enabled = False
End If
End If
Else:
Timer1.Enabled = True '显示游戏没开始的提示
End If
End Sub

Private Sub Image1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.MousePointer = 99 '当鼠标移动到棋盘image1上时,鼠标图形变为用户自定义定义图形,99是自定义鼠标代号
End Sub

Private Sub Image2_Click()
If jsh = True Then '结束游戏状态下被点击
xsh = 1 '则先手变为白棋
Me.MouseIcon = Image4.Picture
Label1(0).Visible = True
Label1(1).Visible = False
End If
End Sub
Private Sub Image3_Click()
If jsh = True Then '结束游戏状态下被点击
xsh = 2 '则先手变为白棋
Me.MouseIcon = Image5.Picture
Label1(0).Visible = False
Label1(1).Visible = True
End If
End Sub

Private Sub Image4_Click() 'Image5用于保存白棋鼠标图形

End Sub

Private Sub Image5_Click() 'Image5用于保存黑棋鼠标图形

End Sub

Private Sub Label1_Click(Index As Integer)

End Sub

Private Sub Label2_Click()

End Sub

Private Sub Label3_Click()

End Sub

Private Sub Label4_Click()

End Sub

Private Sub Timer1_Timer() '显示游戏没开始的提示
t = t + 1
If Label2.Visible = False Then Label2.Visible = True Else Label2.Visible = False
If t > 8 Then '提示语闪动八次
Label2.Visible = False
t = 0
Timer1.Enabled = False
End If
End Sub
Public Function wuzi(ii, qsh) '在这里判断是否有连续的五子出现
qqqqq = qsh '暂时记录是什么色的棋被判断
m = ii \ 15 '取整,行数
n = ii Mod 15 '求余,对应列数
q = 0
'行 - '判断所在行是否满五子
p = 1
f = 0
g = 0
For a = 1 To 4
If yy(m, n - a) <> qsh Then GoTo m1 Else q = a
Next a
m1:
For a = 0 To 4
f = m: g = n - q + a
If f <= 15 And g <= 15 And f >= -1 And g >= -1 Then
If yy(f, g) <> qsh Then GoTo n1 Else h(a + 1) = (f) * 15 + g
Else:
GoTo n1
End If
Next a
Timer2.Enabled = True: GoTo nn

n1:

'列 | '判断所在列是否满五子
p = 1 '所在行和刚下的棋子相同相邻的棋子数,p=1是因为包括它本身至少有一个
For a = 1 To 4 '向左找四格,
If yy(m - a, n) <> qsh Then GoTo m2 Else q = a '遇到和刚下的棋子不同的棋子时,记录该棋子编号,跳出循环,不再继续判断
Next a
m2:
For a = 0 To 4 '从记录下的第一个棋那里开始往后数同色棋子数,只数五个
f = m - q + a: g = n 'f是记录下的第一个棋子的横坐标,g是纵坐标
If f <= 15 And g <= 15 And f >= -1 And g >= -1 Then '保证坐标不会越界
If yy(f, g) <> qsh Then GoTo n2 Else h(a + 1) = (f) * 15 + g '当遇到不同的棋子时,证明在这里同样的棋子不满五个,跳到下面判断纵向是否有五子,否则将该棋子的位置保存到h数组中,便于显示连成五子的棋子
Else:
GoTo n2 '如果上面没有遇到不一样的棋子,则表示该行至少有五个棋子相同
End If
Next a
Timer2.Enabled = True: GoTo nn '如果上面没有遇到不一样的棋子,否则的话此行肯定已经被goto跳过,则表示该行至少有五个棋子相同,用timer的运行来显示胜利者和相连的棋子


'下面的判断方法与横向基本相同
n2:
'反斜 \ '判断所在斜下行是否满五子
p = 1
For a = 1 To 4
If yy(m - a, n - a) <> qsh Then GoTo m3 Else q = a
Next a
m3:
For a = 0 To 4
f = m - q + a: g = n - q + a
If f <= 15 And g <= 15 And f >= -1 And g >= -1 Then
If yy(f, g) <> qsh Then GoTo n3 Else h(a + 1) = (f) * 15 + g
Else:
GoTo n3
End If
Next a
Timer2.Enabled = True: GoTo nn


n3:
'正斜 / '判断所在斜上行是否满五子
p = 1
v = 1
For a = 1 To 4
If yy(m + a, n - a) <> qsh Then GoTo m4 Else q = a
Next a
m4:
For a = 0 To 4
f = m + q - a: g = n - q + a
If f <= 15 And g <= 15 And f >= -1 And g >= -1 Then
If yy(f, g) <> qsh Then GoTo nn Else h(a + 1) = (f) * 15 + g
Else:
GoTo nn
End If
Next a
Timer2.Enabled = True: GoTo nn

nn:
End Function


Private Sub Timer2_Timer()
t = t + 1
Me.Enabled = False 'form暂时禁止操作
If I(h(1)).Visible = False Then '五子闪动
For a = 1 To 5
I(h(a)).Visible = True
Next a

Else:
For a = 1 To 5
I(h(a)).Visible = False
Next a
End If
If t > 10 Then '闪动10次后停止
For a = 1 To 5
I(h(a)).Visible = True
Next a
t = 0
If qqqqq = 1 Then MsgBox "白棋获胜!"
If qqqqq = 2 Then MsgBox "黑棋获胜!"
Me.Enabled = True '恢复form1的可操作状态
Timer2.Enabled = False '停止timer2的运行
Call Command2_Click '游戏停止
End If
End Sub

Private Sub Timer3_Timer() '记录白棋的思考时间
t1 = t1 + 1
shi = t1 \ 3600
t1 = t1 Mod 3600
fen = t1 \ 60
miao = t1 Mod 60
Label3.Caption = shi & ":" & fen & ":" & miao
End Sub

Private Sub Timer4_Timer() '记录黑棋的思考时间
t2 = t2 + 1
shi = t2 \ 3600
t2 = t2 Mod 3600
fen = t2 \ 60
miao = t2 Mod 60
Label4.Caption = shi & ":" & fen & ":" & miao
End Sub
上面就是没禁手的五子棋代码
...全文
133 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
心匪石不可转 2010-12-20
  • 打赏
  • 举报
回复
dbcontrols 2010-12-20
  • 打赏
  • 举报
回复
什么是禁手规则 ?

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧