求跳棋游戏的VB代码
表单代码:
Dimchess板(-2to10,-2to10)作为字节板(8垂直*8国际象棋)
Dim x (10)为整数,y (10)为整数''每种方式进行搜索。
Dim x 1 (10)为整数,y 1 (10)为整数''搜索到的每一步棋的可食用子坐标。
Dim BestLocate As CHESSER
将当前播放器显示为字节''当前播放器
Dim CurrentStep As Integer ' '当前步骤
模糊人机模式为布尔型
玩家选择了哪个棋子?
Dim tTemp为布尔值
Const MAXDOWNPOINT = 7
Rem如果Cer是1(黑色方块),则返回2(红色方块),否则将加上1(黑色方块)。
公共函数NextCer(ByVal Cer As Byte) As Byte
NextCer = 1
如果Cer = 1,则NextCer = 2
结束功能
Rem棋盘
私有Sub首字母()
Dim i为整数,j为整数
For i = 1到8: For j = 1到8:棋盘(I,j) = 0:下一个j:下一个I
棋盘(1,2) = 201
棋盘(1,4) = 201
棋盘(1,6) = 201
棋盘(1,8) = 201
棋盘(2,1) = 201
棋盘(2,3) = 201
棋盘(2,5) = 201
棋盘(2,7) = 201
棋盘(3,2) = 201
棋盘(3,4) = 201
棋盘(3,6) = 201
棋盘(3,8) = 201
棋盘(6,1) = 101
棋盘(6,3) = 101
棋盘(6,5) = 101
棋盘(6,7) = 101
棋盘(7,2) = 101
棋盘(7,4) = 101
棋盘(7,6) = 101
棋盘(7,8) = 101
棋盘(8,1) = 101
棋盘(8,3) = 101
棋盘(8,5) = 101
棋盘(8,7) = 101
末端接头
Rem反转显示(将屏幕上显示的内容保存到棋盘数组中)
私有Sub重新显示()
Dim i为整数,j为整数,k为整数
k = 0
对于i = 1到8
对于j = 1到8
If cbText(k)。Text = " "那么棋盘(I,j) = 0
If cbText(k)。Text = "101 "那么棋盘(I,j) = 101
If cbText(k)。Text = "201 "那么棋盘(I,j) = 201
If cbText(k)。Text = "102 "那么棋盘(I,j) = 102
If cbText(k)。Text = "202 "那么棋盘(I,j) = 202
k = k + 1
下一个j
接下来我
末端接头
Rem显示(在屏幕后面显示棋盘数组的内容)
私有子显示器()
Dim i为整数,j为整数,k为整数
k = 0
对于i = 1到8
对于j = 1到8
如果棋盘(I,j) = 0,则
cbText(k)。文本= " "
其他
cbText(k)。Text =棋盘(I,j)
如果…就会结束
k = k + 1
下一个j
接下来我
称胜利或失败为判断
末端接头
Rem胜利或失败判断
二等兵对胜败的判断()
Dim i为整数,j为整数
Dim a为整数,b为整数
a = 0: b = 0
对于i = 1到8
对于j = 1到8
如果int(国际象棋棋盘(I,j)/100)= 1那么a = a+1 ' '计算棋手的棋子数。
如果int(棋盘(I,J)/100) = 2thenb = b+1 ' '计算计算机上的棋子数。
下一个j
接下来我
如果a = 0,则调用MsgBox("我赢了!"),vbOKOnly+32,"提示:"):退出Sub
如果b = 0那么调用MsgBox("我放弃!"),vbOKOnly+32,"提示:"):退出Sub
末端接头
Rem回报评估
私有函数CurrentValue(Cer为字节)为整数
Dim i为整数,j为整数
当前值= 0
对于i = 1到8
对于j = 1到8
如果Int(棋盘(I,j) / 100) = Cer那么_
当前值=当前值+棋盘(I,J)mod 100 * 100+100 ' '是我们的棋子,棋子是1加100点,棋子是2加200点。
如果Int(棋盘(I,j) / 100) = NextCer(Cer)那么_
当前值=当前值-(棋盘(I,J)mod 100 * 100+100)'对方棋子为1减100点,棋子为2减200点。
下一个j
接下来我
结束功能
如果Cer方I和J的棋子还能吃,Rem返回True。
私有函数IsLine(Cer为字节,I为字节,j为字节)为布尔值
Dim x为字节,y为字节,x1为字节,y1为字节
IsLine = False
开始搜索棋盘。
如果是Cer这边的棋子。
如果Int(棋盘(I,j) / 100) = Cer那么
‘吃子’式是1:即如果基础式的位置有对手的棋子,可以跳过去吃(式的限制:Cer是1或者棋子只能移动用于强化棋)。
如果Int(棋盘(i - 1,j-1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
X = (i-1)-1 ' '目标坐标
y = (j - 1) - 1
X1 = i-1 ' '池子坐标
y1 = j - 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么is line = True '如果有吃的,返回True。
如果…就会结束
吃孩子走路的方法2
如果Int(棋盘(i - 1,j+1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么is line = True '如果有吃的,返回True。
如果…就会结束
吃吃走走3
如果Int(棋盘(i + 1,j-1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么is line = True '如果有吃的,返回True。
如果…就会结束
“像吃饭一样走路”4
如果Int(棋盘(i + 1,j+1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么is line = True '如果有吃的,返回True。
如果…就会结束
如果…就会结束
结束功能
如果Cer的碎片还能被吃掉,Rem返回True。
私有函数IsLine2(Cer为字节)为布尔值
Dim x为字节,y为字节,x1为字节,y1为字节
Dim i为整数,j为整数
IsLine2 = False
开始搜索棋盘。
对于i = 1到8
对于j = 1到8
如果是Cer这边的棋子。
如果Int(棋盘(I,j) / 100) = Cer那么
‘吃子’式是1:即如果基础式的位置有对手的棋子,可以跳过去吃(式的限制:Cer是1或者棋子只能移动用于强化棋)。
如果Int(棋盘(i - 1,j-1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
X = (i-1)-1 ' '目标坐标
y = (j - 1) - 1
X1 = i-1 ' '池子坐标
y1 = j - 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0然后是第2行=真'如果有吃的,返回真。
如果…就会结束
吃孩子走路的方法2
如果Int(棋盘(i - 1,j+1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0然后是第2行=真'如果有吃的,返回真。
如果…就会结束
吃吃走走3
如果Int(棋盘(i + 1,j-1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么是2号线=真'如果有吃的,返回真。
如果…就会结束
“像吃饭一样走路”4
如果Int(棋盘(i + 1,j+1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
如果x & gt0和y & gt0和x & lt9和y & lt9和棋盘(x,y) = 0那么是2号线=真'如果有吃的,返回真。
如果…就会结束
如果…就会结束
下一个j
接下来我
结束功能
Rem搜索程序
私有函数搜索(Cer为字节,Steps为整数,IsTop为布尔,UpMax为整数)
Dim a为整数,b为整数,b1为整数,b2为整数,I为整数,j为整数,k为整数,l为整数,v为整数
Dim MaxValue为整数
Dim Sc(40)作为CHESSER
Dim IsEat(7) As Boolean ' '你吃了你搜索到的七种方式吗?
迪姆是不是像布尔''一样吃了一个孩子?
如果IsTop,则
List1。清楚的
对于i = 0到40: Sc(i)。Allow = False:下一个I ';默认情况下,不允许所有遍历,如果所有值都为假,则允许所有遍历。
如果…就会结束
吃=假
对于i = 0到7: IsEat(7) = False: Next i '默认情况下,所有搜索到的招式都不吃。
步骤数=步骤数- 1
如果步骤& lt1和IsLine2(Cer) = False然后
如果我们没有孩子吃,我们将回到估值
Search = -CurrentValue(Cer)' '返回估计值。
退出功能
如果…就会结束
k = 0
开始搜索棋盘。
对于i = 1到8
对于j = 1到8
如果是Cer这边的棋子。
如果Int(棋盘(I,j) / 100) = Cer那么
for I 1 = 1 tomaxdownpoint:x(I 1)= 0:x 1(I 1)= 0:next ' ' x记录所有移动,并清空x。
列出所有的方法。
基本方式:左上、右上、左下、右下。
x(0) = i - 1: y(0) = j - 1
x(1)= I-1:y(1)= j+1
x(2) = i + 1: y(2) = j - 1
x(3) = i + 1: y(3) = j + 1
棋子代表:白棋101(普通),102(有底强棋)
红棋201(普通),202(过底强力棋)
下一句解释:如果是白(101,102),则不允许退(删除x(2),x(3))。
如果Cer = 1且棋盘(I,j)Mod 100 & lt;& gt2那么x(2) = -2: x(3) = -2
下一句解释:如果是红棋(201,202),不允许退(删除x(0),x(1))。
如果Cer = 2且棋盘(I,j)Mod 100 & lt;& gt2那么x(0) = -2: x(1) = -2
‘吃子’式是1:即如果基础式的位置有对手的棋子,可以跳过去吃(式的限制:Cer是1或者棋子只能移动用于强化棋)。
如果Int(棋盘(i - 1,j-1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
X(4) = (i-1)-1 ' '目标坐标。
y(4) = (j - 1) - 1
X1(4) = i-1 ' '池子坐标
y1(4) = j - 1
如果x(4)>0和y(4)>0和x(4)& lt;9和y(4)& lt;9和棋盘(x(4),y(4)) = 0 Then _
EAT = True: IsEat(4) = True ' '你有东西吃,必须走这一步,其他方式无效。
如果…就会结束
吃孩子走路的方法2
如果Int(棋盘(i - 1,j+1)/100)= next Cer(Cer)And(Cer = 1或棋盘(I,j) Mod 100 = 2)则
x(5) = (i - 1) - 1
y(5) = (j + 1) + 1
x1(5) = i - 1
y1(5) = j + 1
如果x(5)>0和y(5)>0和x(5)& lt;9和y(5)& lt;9和棋盘(x(5),y(5)) = 0 Then _
EAT = True: IsEat(5) = True ' '你有东西吃,必须走这一步,其他方式无效。
如果…就会结束
吃吃走走3
如果Int(棋盘(i + 1,j-1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x(6) = (i + 1) + 1
y(6) = (j - 1) - 1
x1(6) = i + 1
y1(6) = j - 1
如果x(6)>0和y(6)>0和x(6)& lt;9和y(6)& lt;9和棋盘(x(6),y(6)) = 0 Then _
EAT = True: IsEat(6) = True ' '你有东西吃,必须走这一步,其他方式无效。
如果…就会结束
“像吃饭一样走路”4
如果Int(棋盘(i + 1,j+1)/100)= next Cer(Cer)And(Cer = 2或棋盘(I,j) Mod 100 = 2)则
x(7) = (i + 1) + 1
y(7) = (j + 1) + 1
x1(7) = i + 1
y1(7) = j + 1
如果x(7)>0和y(7)>0和x(7)& lt;9和y(7)& lt;9和棋盘(x(7),y(7)) = 0 Then _
EAT = True: IsEat(7) = True ' '你有东西吃,必须走这一步,其他方式无效。
如果…就会结束
如果有吃孩子的方法,不吃孩子的删除其他方法。
如果吃=真,那么
对于a = 0到7
如果IsEat(a) = False,则x(a) = -1
下一个a
如果…就会结束
存储在Sc(移动表)中
对于a = 0到7
如果x(a) = 5,y(a) = 2,那么停止
如果你过了棋盘,你就不能走了。
如果x(a)>0和y(a)>0和x(a)& lt;9和y(a)& lt;那就9
如果目标有棋子,你就不能去。如果为0,则保存。
如果棋盘(x(a),y(a)) = 0则
将移动保存在“移动表”中
Sc(k)。Initx = i
Sc(k)。Inity = j
Sc(k)。ObjX = x(a)
Sc(k)。ObjY = y(a)
Sc(k).x1 = x1(a)' '被吃掉的位置
Sc(k).y1 = y1(a)
如果iseat (a) = true,则sc (k)。Allow = true ' '如果有子级,则允许此移动。
k = k + 1
如果…就会结束
如果…就会结束
下一个a
如果eat = true那么I = 100: J = 100 ' '如果有孩子,就不用再搜索了。
如果…就会结束
下一个j
接下来我
MaxValue = -30000 ' '当前分数
tTemp = False
搜索是否有允许的移动,如果没有,则允许所有移动。
对于i = 0至k - 1
如果Sc(i)。Allow = True Then tTemp = True
接下来我
如果存在允许的移动,则除了允许的移动之外,所有其他移动都是不允许的。
如果tTemp = False,则
对于i = 0到k - 1: Sc(i)。Allow = True:下一个I
如果…就会结束
想尽一切办法。
对于i = 0至k - 1
如果Sc(i)。那么Allow = True
B1 =棋盘(SC (I))。initx,SC (I)。inity)' '记录开始和结束片段。
b2 =棋盘(Sc(i)。ObjX,Sc(i)。ObjY)
B =棋盘(SC (I) .x1,SC(I). y 1)‘’记录已经吃掉的棋子。
棋盘(sc(一)。initx,sc (I)。inity) = 0 ' '清除起始棋子。
棋盘(sc(一)。objx,sc (I)。objy) = b1 ' '试下棋。
棋盘(SC(一)。x1,SC (I)。y1) = 0 ' '清除被吃掉位置的棋子。
如果你到达边界,你的力量会增加。
下一句:如果是黑的(101,102)
如果Cer = 1,则
下一句:如果你去第一线,棋子就变成102,威力增强。
如果Sc(i)。ObjX = 1然后棋盘(Sc(i)。ObjX,Sc(i)。ObjY) = 102
如果…就会结束
下一句:如果是红色(201,202)
如果Cer = 2,则
下一句:如果到了八线,棋子变成202,力量增强。
如果Sc(i)。ObjX = 8那么棋盘(Sc(i)。ObjX,Sc(i)。ObjY) = 202
如果…就会结束
如果b & gt0和IsLine(Cer,Sc(i))。ObjX,Sc(i)。ObjY) = True,那么EAT = True
如果能连续吃小孩。
V =当前值(Cer)+300 ''V是当前情况值加上300点。
其他
V = search (next cer (cer),steps-1,false,-up max)‘’没有连续的食物可以吃,继续搜索。
如果…就会结束
恢复棋盘
棋盘(sc(一)。x1,sc (I)。y1) = b ' '还原被吃掉的孩子。
棋盘(sc(一)。initx,sc (I)。inity) = b1 ' '记录开始和结束片段。
棋盘(Sc(一)。ObjX,Sc(i)。ObjY) = b2
显示每次行走的分数。
如果IsTop,则
列表1。加法“从”&;Str(Sc(i))。Initx)和amp“,”& ampStr(Sc(i))。inity)& amp;_
“到”&;Str(Sc(i))。ObjX)& amp;“,”& ampStr(Sc(i))。ObjY)& amp;"分数:" &;Str(v)
如果…就会结束
如果这个动作得分高,就记录下来。
如果IsTop和(v & gtMaxValue或MaxValue = -30000)那么
最佳定位。Initx = Sc(i)。Initx
最佳定位。Inity = Sc(i)。无限
最佳定位。ObjX = Sc(i)。ObjX
最佳定位。ObjY = Sc(i)。ObjY
bestlocate . x 1 = Sc(I). x 1
bestlocate . y 1 = Sc(I). y 1
最大值= v
如果…就会结束
如果v & gtMaxValue Then MaxValue = v
下一句:如果最大值>;= -UpMax //α-β剪枝,符合剪枝条件的会被剪掉。UpMax是上层的最大值。
如果IsTop = False并且MaxValue & gt= -UpMax Then i = 100 ' '修剪程序
如果…就会结束
接下来我
如果IsTop = False,则Search = -MaxValue,否则Search = MaxValue
结束功能
Private Sub cbText_Click(索引为整数)
Dim I asinteger,J asinteger,C asinteger'' c记录吃小孩。
Dim Temp为字符串,Temp2为字符串,Temp3为字符串
Dim x为字节,y为字节,x2为字节,y2为字节
If cbText(索引)。BackColor & lt& gt& ampHC0E0FF然后调用MsgBox("象棋无效!",vbOKOnly+32,"提示:"):退出Sub
如果cSel = 0且Trim(cbText(Index))。Text)>" "那么csel = index: cbtext (csel)。forecolor = QB color(12):exit sub ' '如果所有棋手都不是第一,且当前棋盘位置有一枚棋子,则表示该棋手选中了这枚棋子。
如果cSel & lt& gt0和Val(cbText(Index))。Text) = Val(cbText(cSel)。Text)然后是cbText(cSel)。ForeColor = H80000008 & amp:cSel = 0: Exit Sub '如果玩家选择同一个棋子两次,则取消选择。
如果cSel & lt& gt那么0
下棋。
cbText(索引)。Text = cbText(cSel)。文本
判断是否可以变成强化棋。
k = Val(cbText(Index))。正文)
如果Int(k / 100) = 1且Index & lt8然后是CB文本(索引)。text = "102 " '如果1到顶,就成了补强棋。
如果Int(k / 100) = 2且Index & gt55然后cbText(索引)。Text = "202 " '如果两个玩家去顶,就变成了强化棋。
cbText(cSel)。文本= " "
cbText(cSel)。ForeColor = H80000008 & amp
来判断有没有小孩吃。
向左上方倾斜。
如果Index - cSel = -18,则
CbText(索引+9)。Text = " ":' '吃了。
C =指数+ 9
如果…就会结束
向右上方倾斜。
如果Index - cSel = -14,则
CbText(索引+7)。Text = " ":' '吃了。
C =指数+ 7
如果…就会结束
向左下方倾斜。
如果Index - cSel = 14,则
CbText(索引-7)。Text = " ":' '吃了。
C =指数- 7
如果…就会结束
向右斜下方。
如果Index - cSel = 18,则
CbText(索引-9)。Text = " ":' '吃了。
C =指数- 9
如果…就会结束
'存储方法'
k = 0: Temp = "": Temp2 = "": Temp = " " "
对于i = 1到8
对于j = 1到8
如果k = cSel,则Temp = " from " &;Str(i) +","+ Str(j)
如果k = Index那么Temp2 = "to"+str (i)+","+str (j): x = i: y = j。
如果k = C,那么Temp3 = "池子" &;Str(i)和amp“,”& ampStr(j): x2 = i: y2 = j
k = k + 1
下一个j
接下来我
列表2。AddItem“第一”&;当前步骤“手”& Str(CurrentPlayer)+“方”+Temp+Temp2+Temp3。
当前步骤=当前步骤+ 1
短信3。Text =温度+温度2
cSel = 0
呼叫重新显示
下一句:如果是人机模式,玩家没东西吃。
如果人机模式=真且(is line(当前玩家,x,y) =真且x2 > 1且y2 & gt2) =假那么
如果人机模式=真,则
看玩家走了棋子的哪一面,再算棋子的另一面。
current player = NextCer(Int(Val(CB text(Index))。Text) / 100))
调用Command2_Click ' '如果是人机模式,让电脑长时间运行。
如果…就会结束
如果…就会结束
末端接头
私有子命令1_Click()
列表2。清除''清除棋谱。
CurrentStep = 1
呼叫初始
呼叫显示
末端接头
私有子命令2_Click()
将t标注为布尔值
命令2。启用=假
t:
Text1。Text = Str(Search(CurrentPlayer,Val(Text2。Text),True,0))
命令2。启用=真
使用BestLocate
t =下切(。Initx,。Inity,。ObjX,。ObjY,. x1,.. y1)
呼叫显示
如果t = true并且是line(当前玩家,。objx,。objy)然后调用msgbox("我想再吃一个"):GoTo t '如果还能吃到棋(连续吃),再计算一次。
以…结尾
current player = next cer(current player)
末端接头
雷姆下象棋。
Rem Sx,Sy:开始棋Ex,Ey:结束棋Ax,Ay:被吃掉。
如果有孩子,Rem返回True。
私有函数DownChess(Sx作为字节,Sy作为字节,ex作为字节,ey作为字节,Ax作为字节,Ay作为字节)作为布尔
棋盘(ex,ey) =棋盘(Sx,Sy)
棋盘(Sx,Sy) = 0
棋盘(Ax,Ay) = 0 ' '清除被吃掉的孩子。
如果Ax & lt& gt0和Ay & lt& gt0则DownChess = True否则DownChess = False
短信3。text = " no . " &;当前步骤“手”& Str(CurrentPlayer)+“方聪”&;Str(Sx)+","+Str(Sy)+"到"+str (ex)+","+Str(ey)&;_
“吃了孩子”&;Str(Ax)和amp“,”& ampStr(Ay)
当前步骤=当前步骤+ 1
列表2。AddItem文本3。文本
下一句:如果是黑的(101,102)
如果Int(棋盘(ex,ey) / 100) = 1那么
下一句:如果你去第一线,棋子就变成102,威力增强。
如果ex = 1,那么棋盘(ex,ey) = 102
如果…就会结束
下一句:如果是红色(201,202)
如果Int(棋盘(ex,ey) / 100) = 2那么
下一句:如果到了八线,棋子变成202,力量增强。
如果ex = 8,那么棋盘(ex,ey) = 202
如果…就会结束
结束功能
Rem一号行动
私有子命令3_Click()
CurrentPlayer = 1
呼叫命令2_Click
末端接头
远程操作2
私有子命令4_Click()
CurrentPlayer = 2
呼叫命令2_Click
末端接头
私有子命令5_Click()
呼叫重新显示
末端接头
私有子命令6_Click()
如果人机模式=假,则人机模式=真,否则人机模式=假
如果人机模式=假,则命令6。Caption = "人机模式":Command6。ToolTipText = "当前模式:每个人都在战斗" Else命令6。Caption = "休息模式":Command6。ToolTipText = "当前模式:人机对战"
末端接头
私有子命令7_Click()
结束
末端接头
快速眼动存储光谱
私有子命令8_Click()
出错时转到e
将I标注为整数
打开InputBox("请输入文件名:")作为#1输出。
对于i = 0到List2。列表计数- 1
打印编号1,列表2。列表(一)
接下来我
关闭#1
出口接头
e:
调用MsgBox("存储错误!",vbOKOnly+32,"提示:")
呃。清楚的
出口接头
末端接头
私有子窗体_Load()
人机模式=假
cSel = 0
CurrentPlayer = 1
呼叫命令1_Click
末端接头
模块代码:
CHESSER型
定位为字节''为什么定位,在BestLocate中,为什么指示数组。
Initx的初始位置为字节“”
初始化为字节
运算后ObjX的棋点为Byte ' '。
对象作为字节
x1作为字节
y1作为字节
是否允许作为布尔值“”使用?
结束类型