您现在的位置是: 首页 > 成语查询 成语查询
Chessboard Mountain_chessboard
tamoadmin 2024-07-22 人已围观
简介1.求跳棋游戏VB代码2.国际象棋 英语作文60 词 1国际象棋有2000年的历史 2 每个棋盘有64个格子 3一副国际象3.用VB编写的跳棋游戏源代码,最好有论文。因为是毕业设计和论文都要交4.国际象棋中象英语怎么拼?棋盘覆盖问题?问题描述:在一个2k2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型
1.求跳棋游戏VB代码
2.国际象棋 英语作文60 词 1国际象棋有2000年的历史 2 每个棋盘有64个格子 3一副国际象
3.用VB编写的跳棋游戏源代码,最好有论文。因为是毕业设计和论文都要交
4.国际象棋中象英语怎么拼?
棋盘覆盖问题?
问题描述:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 ?
代码:#include<stdio.h>?
int tile=0;//整型变量,记录L型骨牌的数量 ?int Matrix[100][100];//定义数据结构 ?
void ChessBoard(int tr,int tc,int dr,int dc,int size)?
{//tr和tc分别是棋盘左上角方格的行号、列号;dr和dc分别是特殊方格的行号、列号 ? if(size==1) ?return; ?int t=tile++;//L型骨牌号,初值为0 ? int s=size/2;//分割棋盘 ?
if(dr<tr+s&&dc<tc+s)//用L型骨牌号覆盖左上角子棋盘 ?ChessBoard(tr,tc,dr,dc,s);// 特殊方格在此棋盘中 ?else? {//特殊方格不在此棋盘中用 ,t号L型骨牌覆盖右下角 ? Matrix[tr+s-1][tc+s-1]=t; // 覆盖本子棋盘中的其余方格 ? ChessBoard(tr,tc,tr+s-1,tc+s-1,s); ?}? if(dr<tr+s&&dc>=tc+s)//用L型骨牌号覆盖右上角子棋盘 ?ChessBoard(tr,tc,dr,dc,s);// 特殊方格在此棋盘中 ?else? {//特殊方格不在此棋盘中用 ,t号L型骨牌覆盖左下角 ? Matrix[tr+s-1][tc+s]=t;// 覆盖本子棋盘中的其余方格 ? ChessBoard(tr,tc+s,tr+s-1,tc+s,s); ?}? if(dr>=tr+s&&dc<tc+s)//用L型骨牌号覆盖左下角子棋盘 ?ChessBoard(tr+s,tc,dr,dc,s);// 特殊方格在此棋盘中 ?else? {//特殊方格不在此棋盘中用 ,t号L型骨牌覆盖右上角 ? Matrix[tr+s][tc+s-1]=t;// 覆盖本子棋盘中的其余方格 ? ChessBoard(tr+s,tc,tr+s,tc+s-1,s); ?}? if(dr>=tr+s&&dc>=tc+s)//用L型骨牌号覆盖右上角子棋盘 ?ChessBoard(tr+s,tc+s,dr,dc,s);// 特殊方格在此棋盘中 ?else? {//特殊方格不在此棋盘中用 ,t号L型骨牌覆盖左上角 ? Matrix[tr+s][tc+s]=t;// 覆盖本子棋盘中的其余方格 ? ChessBoard(tr+s,tc+s,tr+s,tc+s,s); ?} ?}?
int main() ?{ ? int size,r,c,row,col; ?//memset(Matrix,0,sizeof(Matrix)); for(int i=0;i<=100;i++)//初始化 为零 ?{ ?for(int j=0;j<=100;j++) ?{ ? Matrix[i][j]=0; ?} } ?scanf("%d",&size);//输入棋盘大小 ? scanf("%d%d",&row,&col);//输入特殊方格位置 ?ChessBoard(0,0,row,col,size); ?for (r = 0; r < size; r++)//输出棋盘覆盖结果 ?{ ?for (c = 0; c < size; c++) { ?printf("%2d ",Matrix[r][c]); } ?printf("\n"); } ?return 0; ?}
输出结果:
求跳棋游戏VB代码
import?jax.swing.*;
import?jax.swing.border.*;
import?ja.awt.*;
import?ja.beans.*;
import?ja.util.*;
/**
*?面板上的光标改变成为手型 *?@author?hardneedl */final?class?ChessPaint?extends?JFrame{
private?static?final?Dimension?SIZE?=?new?Dimension(600,400);
public?Dimension?getMinimumSize()?{return?SIZE;}
public?Dimension?getMaximumSize()?{return?SIZE;}
public?Dimension?getPreferredSize()?{return?SIZE;}
public?String?getTitle()?{return?"ChessPaint";}
/**
*?棋盘 *?实现属性变化监听 */private?class?Chessboard?extends?Observable?implements?PropertyChangeListener{
private?int?columns,?rows,?cellWidth;
private?PropertyChangeSupport?propertyChangeSupport?=?new?PropertyChangeSupport(this);
private?Chessboard(int?columns,?int?rows,?int?cellWidth)?{
this.columns?=?columns;
this.rows?=?rows;
this.cellWidth?=?cellWidth;
}
private?int?getColumns()?{
return?columns;
}
private?void?setColumns(int?columns)?{
propertyChangeSupport.firePropertyChange("columns",?this.columns,?columns);
this.columns?=?columns;
}
private?int?getRows()?{
return?rows;
}
private?void?setRows(int?rows)?{
propertyChangeSupport.firePropertyChange("columns",?this.rows,?rows);
this.rows?=?rows;
}
private?int?getCellWidth()?{
return?cellWidth;
}
private?void?setCellWidth(int?cellWidth)?{
this.cellWidth?=?cellWidth;
}
public?void?propertyChange(PropertyChangeEvent?evt)?{
switch?(evt.getPropertyName())?{
case?"columns":
case?"rows":
case?"cellWidth":
if?(!evt.getOldValue().equals(evt.getNewValue()))?{
setChanged();
notifyObservers(this);
}
break;
}
}
}
/**
*?画笔 */private?interface?Brush?{
void?paint(Graphics?g);
Component?getCompoment();
}
abstract?private?class?ChessboardBrush?implements?Brush,?Observer?{
private?Chessboard?chessboard;
private?ChessboardBrush(Chessboard?chessboard)?{
this.chessboard?=?chessboard;
}
public?void?paint(Graphics?g)?{
if?(chessboard?==?null)?return;
Graphics2D?g2?=?(Graphics2D)?g.create();
//背景白色
g2.setColor(Color.WHITE);
g2.fillRect(0,0,?getCompoment().getWidth(),?getCompoment().getHeight());
//整体偏移坐标系
g2.translate(100,100);
g2.setColor(Color.BLACK);
//绘制行线
for?(int?r?=?0;?r?<=?chessboard.getRows();?r?++)
g2.drawLine(0,?r?*?chessboard.getCellWidth(),?chessboard.getColumns()?*?chessboard.getCellWidth(),?r?*?chessboard.getCellWidth());
//绘制竖线
for?(int?c?=?0;?c?<=?chessboard.getColumns();?c++)
g2.drawLine(c?*?chessboard.getCellWidth(),?0,?chessboard.getCellWidth()?*?c?,?chessboard.getRows()?*?chessboard.getCellWidth());
g2.dispose();
}
public?void?update(Observable?o,?Object?arg)?{
if?(arg?instanceof?Chessboard)
chessboard?=?(Chessboard)arg;
}
}
/*画布*/
private?class?Canvas?extends?JComponent{
private?Brush?getBrush()?{
return?brush;
}
private?void?setBrush(Brush?brush)?{
this.brush?=?brush;
}
private?Brush?brush;
private?Canvas()?{
super();
}
protected?void?paintComponent(Graphics?g)?{
super.paintComponent(g);
if(isVisible()?&&?brush?!=?null)
brush.paint(g);
}
public?Border?getBorder()?{
return?BorderFactory.createLineBorder(Color.BLUE,2);
}
}
private?Canvas?canvas;
private?ChessboardBrush?brush;
private?Chessboard?chessboard;
private?ChessPaint()?{
super();
init();
addListeners();
doLay();
}
private?void?init(){
chessboard?=?new?Chessboard(19,19,30);
canvas?=?new?Canvas();
brush?=?new?ChessboardBrush(chessboard)?{
public?Component?getCompoment()?{
return?canvas;
}
};
canvas.setBrush(brush);
chessboard.addObserver(brush);
}
private?void?addListeners(){
}
private?void?doLay(){
Container?container?=?getContentPane();
container.add(canvas,?BorderLayout.CENTER);
pack();
setVisible(true);
}
public?static?void?main(String...?args)?{
System.setProperty("swing.defaultlaf","com.sun.ja.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.invokeLater(ChessPaint::new);
}
}
国际象棋 英语作文60 词 1国际象棋有2000年的历史 2 每个棋盘有64个格子 3一副国际象
VB跳棋代码:
窗体代码:
Dim ChessBoard(-2 To 10, -2 To 10) As Byte ''棋盘(8竖*8棋)
Dim x(10) As Integer, y(10) As Integer ''搜索的每种走法
Dim x1(10) As Integer, y1(10) As Integer ''搜索的每种走法的可吃子坐标
Dim BestLocate As CHESSER
Dim CurrentPlayer As Byte ''当前玩家
Dim CurrentStep As Integer ''当前步
Dim 人机模式 As Boolean
Dim cSel As Byte ''玩家选择了哪个棋子
Dim tTemp As Boolean
Const MAXDOWNPOINT = 7
Rem 如果Cer为1(黑方),则返回2(红方),否则返加1(黑方)
Public Function NextCer(ByVal Cer As Byte) As Byte
NextCer = 1
If Cer = 1 Then NextCer = 2
End Function
Rem 棋盘
Private Sub Initial()
Dim i As Integer, j As Integer
For i = 1 To 8: For j = 1 To 8: ChessBoard(i, j) = 0: Next j: Next i
ChessBoard(1, 2) = 201
ChessBoard(1, 4) = 201
ChessBoard(1, 6) = 201
ChessBoard(1, 8) = 201
ChessBoard(2, 1) = 201
ChessBoard(2, 3) = 201
ChessBoard(2, 5) = 201
ChessBoard(2, 7) = 201
ChessBoard(3, 2) = 201
ChessBoard(3, 4) = 201
ChessBoard(3, 6) = 201
ChessBoard(3, 8) = 201
ChessBoard(6, 1) = 101
ChessBoard(6, 3) = 101
ChessBoard(6, 5) = 101
ChessBoard(6, 7) = 101
ChessBoard(7, 2) = 101
ChessBoard(7, 4) = 101
ChessBoard(7, 6) = 101
ChessBoard(7, 8) = 101
ChessBoard(8, 1) = 101
ChessBoard(8, 3) = 101
ChessBoard(8, 5) = 101
ChessBoard(8, 7) = 101
End Sub
Rem 反显示(将屏幕显示的内容存入ChessBoard数组)
Private Sub ReDisplay()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If cbText(k).Text = "" Then ChessBoard(i, j) = 0
If cbText(k).Text = "101" Then ChessBoard(i, j) = 101
If cbText(k).Text = "201" Then ChessBoard(i, j) = 201
If cbText(k).Text = "102" Then ChessBoard(i, j) = 102
If cbText(k).Text = "202" Then ChessBoard(i, j) = 202
k = k + 1
Next j
Next i
End Sub
Rem 显示(将ChessBoard数组的内容显示到屏幕后)
Private Sub Display()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If ChessBoard(i, j) = 0 Then
cbText(k).Text = ""
Else
cbText(k).Text = ChessBoard(i, j)
End If
k = k + 1
Next j
Next i
Call 胜负判断
End Sub
Rem 胜负判断
Private Sub 胜负判断()
Dim i As Integer, j As Integer
Dim a As Integer, b As Integer
a = 0: b = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = 1 Then a = a + 1 ''计算玩家的棋子数
If Int(ChessBoard(i, j) / 100) = 2 Then b = b + 1 ''计算电脑的棋子数
Next j
Next i
If a = 0 Then Call MsgBox("我赢了!", vbOKOnly + 32, "提示:"): Exit Sub
If b = 0 Then Call MsgBox("我认输了!", vbOKOnly + 32, "提示:"): Exit Sub
End Sub
Rem 返回估值
Private Function CurrentValue(Cer As Byte) As Integer
Dim i As Integer, j As Integer
CurrentValue = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = Cer Then _
CurrentValue = CurrentValue + ChessBoard(i, j) Mod 100 * 100 + 100 ''是我方的棋子,棋子为1加100分,棋子为2加200分
If Int(ChessBoard(i, j) / 100) = NextCer(Cer) Then _
CurrentValue = CurrentValue - (ChessBoard(i, j) Mod 100 * 100 + 100) ''对方的棋子,棋子为1减100分,棋子为2减200分
Next j
Next i
End Function
Rem 如果Cer方i,j的棋子还可以吃子则返回True
Private Function IsLine(Cer As Byte, i As Byte, j As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
IsLine = False
''开始搜索棋盘
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目标坐标
y = (j - 1) - 1
x1 = i - 1 ''吃子坐标
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
End If
End Function
Rem 如果Cer方的棋子还可以吃子则返回True
Private Function IsLine2(Cer As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
Dim i As Integer, j As Integer
IsLine2 = False
''开始搜索棋盘
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目标坐标
y = (j - 1) - 1
x1 = i - 1 ''吃子坐标
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
End If
Next j
Next i
End Function
Rem 搜索程序
Private Function Search(Cer As Byte, Steps As Integer, IsTop As Boolean, UpMax As Integer)
Dim a As Integer, b As Integer, b1 As Integer, b2 As Integer, i As Integer, j As Integer, k As Integer, l As Integer, v As Integer
Dim MaxValue As Integer
Dim Sc(40) As CHESSER
Dim IsEat(7) As Boolean ''搜索到的7种走法有没有吃子
Dim EAT As Boolean ''有没有吃子
If IsTop Then
List1.Clear
For i = 0 To 40: Sc(i).Allow = False: Next i ';默认情况下所有走法皆不允许,如果所有值均为False则皆允许
End If
EAT = False
For i = 0 To 7: IsEat(7) = False: Next i ''默认情况所有搜索到的走法都没有吃子
Steps = Steps - 1
If Steps < 1 And IsLine2(Cer) = False Then
''如果我方无子可吃时才返回估值
Search = -CurrentValue(Cer) ''返回估值
Exit Function
End If
k = 0
''开始搜索棋盘
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
For i1 = 1 To MAXDOWNPOINT: x(i1) = 0: x1(i1) = 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))
If Cer = 1 And ChessBoard(i, j) Mod 100 <> 2 Then x(2) = -2: x(3) = -2
''下一句解释:如果是红棋(201、202),不允许后退(删除x(0)、x(1))
If Cer = 2 And ChessBoard(i, j) Mod 100 <> 2 Then x(0) = -2: x(1) = -2
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(4) = (i - 1) - 1 ''目标坐标
y(4) = (j - 1) - 1
x1(4) = i - 1 ''吃子坐标
y1(4) = j - 1
If x(4) > 0 And y(4) > 0 And x(4) < 9 And y(4) < 9 And ChessBoard(x(4), y(4)) = 0 Then _
EAT = True: IsEat(4) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(5) = (i - 1) - 1
y(5) = (j + 1) + 1
x1(5) = i - 1
y1(5) = j + 1
If x(5) > 0 And y(5) > 0 And x(5) < 9 And y(5) < 9 And ChessBoard(x(5), y(5)) = 0 Then _
EAT = True: IsEat(5) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(6) = (i + 1) + 1
y(6) = (j - 1) - 1
x1(6) = i + 1
y1(6) = j - 1
If x(6) > 0 And y(6) > 0 And x(6) < 9 And y(6) < 9 And ChessBoard(x(6), y(6)) = 0 Then _
EAT = True: IsEat(6) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(7) = (i + 1) + 1
y(7) = (j + 1) + 1
x1(7) = i + 1
y1(7) = j + 1
If x(7) > 0 And y(7) > 0 And x(7) < 9 And y(7) < 9 And ChessBoard(x(7), y(7)) = 0 Then _
EAT = True: IsEat(7) = True ''有可吃子,必需走此步,其余走法无效
End If
''如果有吃子走法,删除没有吃子的其它走法
If EAT = True Then
For a = 0 To 7
If IsEat(a) = False Then x(a) = -1
Next a
End If
''存入Sc(走法表)中
For a = 0 To 7
'If x(a) = 5 And y(a) = 2 Then Stop
''如果超过棋盘将不能走
If x(a) > 0 And y(a) > 0 And x(a) < 9 And y(a) < 9 Then
''如果目标有棋子则不能走,为0才存入
If ChessBoard(x(a), y(a)) = 0 Then
''将走法存入“走法表”
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)
If IsEat(a) = True Then Sc(k).Allow = True ''如果有吃子,则允许此着走法
k = k + 1
End If
End If
Next a
'If EAT = True Then i = 100: j = 100 ''如果有吃子则不必再搜索
End If
Next j
Next i
MaxValue = -30000 ''当前分数
tTemp = False
''搜索是否有允许走法,如果没有则所有走法皆允许
For i = 0 To k - 1
If Sc(i).Allow = True Then tTemp = True
Next i
''如果有允许走法,则除允许走法外,其余走法皆不允许走
If tTemp = False Then
For i = 0 To k - 1: Sc(i).Allow = True: Next i
End If
''试走每种走法
For i = 0 To k - 1
If Sc(i).Allow = True Then
b1 = ChessBoard(Sc(i).Initx, Sc(i).Inity) ''记录起点棋子和终点棋子
b2 = ChessBoard(Sc(i).ObjX, Sc(i).ObjY)
b = ChessBoard(Sc(i).x1, Sc(i).y1) ''记录被吃子位置的棋子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = 0 ''清除起点的棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b1 ''试下棋
ChessBoard(Sc(i).x1, Sc(i).y1) = 0 ''清除被吃子位置的棋子
''如果到边界则威力加强
''下句:如果是黑方(101、102)
If Cer = 1 Then
''下句:如果走到第一行则棋子变成102,威力加强
If Sc(i).ObjX = 1 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 102
End If
''下句:如果是红方(201、202)
If Cer = 2 Then
''下句:如果走到第八行则棋子变成202,威力加强
If Sc(i).ObjX = 8 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 202
End If
If b > 0 And IsLine(Cer, Sc(i).ObjX, Sc(i).ObjY) = True And EAT = True Then
''如果可连续吃子
v = CurrentValue(Cer) + 300 ''V为当前局面价值加300分
Else
v = Search(NextCer(Cer), Steps - 1, False, -UpMax) ''没有连续可吃子,继续搜索
End If
''恢复棋盘
ChessBoard(Sc(i).x1, Sc(i).y1) = b ''恢复被吃子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = b1 ''记录起点棋子和终点棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b2
'' 显示每种走法的得分
If IsTop Then
List1.AddItem "从" & Str(Sc(i).Initx) & "," & Str(Sc(i).Inity) & _
"到" & Str(Sc(i).ObjX) & "," & Str(Sc(i).ObjY) & "得分:" & Str(v)
End If
'如果这种走法分数高,记录
If IsTop And (v > MaxValue Or MaxValue = -30000) Then
BestLocate.Initx = Sc(i).Initx
BestLocate.Inity = Sc(i).Inity
BestLocate.ObjX = Sc(i).ObjX
BestLocate.ObjY = Sc(i).ObjY
BestLocate.x1 = Sc(i).x1
BestLocate.y1 = Sc(i).y1
MaxValue = v
End If
If v > MaxValue Then MaxValue = v
'下句: 如果 MaxValue >= -UpMax //α-β剪枝, 符合剪枝条件的就Cut掉。UpMax为上层的MaxValue
If IsTop = False And MaxValue >= -UpMax Then i = 100 ''剪枝程序
End If
Next i
If IsTop = False Then Search = -MaxValue Else Search = MaxValue
End Function
Private Sub cbText_Click(Index As Integer)
Dim i As Integer, j As Integer, C As Integer ''C记载吃子
Dim Temp As String, Temp2 As String, Temp3 As String
Dim x As Byte, y As Byte, x2 As Byte, y2 As Byte
If cbText(Index).BackColor <> &HC0E0FF Then Call MsgBox("落棋无效!", vbOKOnly + 32, "提示:"): Exit Sub
If cSel = 0 And Trim(cbText(Index).Text) > "" Then cSel = Index: cbText(cSel).ForeColor = QBColor(12): Exit Sub ''如果玩家一个也没先且当前棋盘位置有棋子,则标示玩家选择此棋子
If cSel <> 0 And Val(cbText(Index).Text) = Val(cbText(cSel).Text) Then cbText(cSel).ForeColor = H80000008&: cSel = 0: Exit Sub ''如果玩家两次选择相同的棋子则取消选择
If cSel <> 0 Then
''下棋
cbText(Index).Text = cbText(cSel).Text
''判断是否可变成加强棋
k = Val(cbText(Index).Text)
If Int(k / 100) = 1 And Index < 8 Then cbText(Index).Text = "102" ''如果1方走到顶端就变成加强棋
If Int(k / 100) = 2 And Index > 55 Then cbText(Index).Text = "202" ''如果2方走到顶端就变成加强棋
cbText(cSel).Text = ""
cbText(cSel).ForeColor = H80000008&
''判断有没有吃子
''向上左斜
If Index - cSel = -18 Then
cbText(Index + 9).Text = "": ''被吃子
C = Index + 9
End If
''向上右斜
If Index - cSel = -14 Then
cbText(Index + 7).Text = "": ''被吃子
C = Index + 7
End If
''向下左斜
If Index - cSel = 14 Then
cbText(Index - 7).Text = "": ''被吃子
C = Index - 7
End If
''向下右斜
If Index - cSel = 18 Then
cbText(Index - 9).Text = "": ''被吃子
C = Index - 9
End If
''存储走法
k = 0: Temp = "": Temp2 = "": Temp = ""
For i = 1 To 8
For j = 1 To 8
If k = cSel Then Temp = "从" & Str(i) + "," + Str(j)
If k = Index Then Temp2 = " 到" + Str(i) + "," + Str(j): x = i: y = j
If k = C Then Temp3 = "吃子 " & Str(i) & "," & Str(j): x2 = i: y2 = j
k = k + 1
Next j
Next i
List2.AddItem "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方" + Temp + Temp2 + Temp3
CurrentStep = CurrentStep + 1
Text3.Text = Temp + Temp2
cSel = 0
Call ReDisplay
''下句:如果是人机模式并且玩家还没有可吃子
If 人机模式 = True And (IsLine(CurrentPlayer, x, y) = True And x2 > 1 And y2 > 2) = False Then
'If 人机模式 = True Then
''看玩家走了哪方的棋子,就运算另一方的棋子
CurrentPlayer = NextCer(Int(Val(cbText(Index).Text) / 100))
Call Command2_Click ''如果是人机模式则让电脑运长
End If
End If
End Sub
Private Sub Command1_Click()
List2.Clear ''清除棋谱
CurrentStep = 1
Call Initial
Call Display
End Sub
Private Sub Command2_Click()
Dim t As Boolean
Command2.Enabled = False
t:
Text1.Text = Str(Search(CurrentPlayer, Val(Text2.Text), True, 0))
Command2.Enabled = True
With BestLocate
t = DownChess(.Initx, .Inity, .ObjX, .ObjY, .x1, .y1)
Call Display
If t = True And IsLine(CurrentPlayer, .ObjX, .ObjY) Then Call MsgBox("我还想再吃一个"): GoTo t ''如果所下之棋还能吃子(连续吃)则再运算
End With
CurrentPlayer = NextCer(CurrentPlayer)
End Sub
Rem 移棋
Rem Sx,Sy:起点棋子 Ex,Ey:终点棋子 Ax,Ay:被吃子
Rem 如果有吃子则返回True
Private Function DownChess(Sx As Byte, Sy As Byte, ex As Byte, ey As Byte, Ax As Byte, Ay As Byte) As Boolean
ChessBoard(ex, ey) = ChessBoard(Sx, Sy)
ChessBoard(Sx, Sy) = 0
ChessBoard(Ax, Ay) = 0 ''清除被吃子
If Ax <> 0 And Ay <> 0 Then DownChess = True Else DownChess = False
Text3.Text = "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方从" & Str(Sx) + "," + Str(Sy) + "到" + Str(ex) + "," + Str(ey) & _
"吃子 " & Str(Ax) & "," & Str(Ay)
CurrentStep = CurrentStep + 1
List2.AddItem Text3.Text
''下句:如果是黑方(101、102)
If Int(ChessBoard(ex, ey) / 100) = 1 Then
''下句:如果走到第一行则棋子变成102,威力加强
If ex = 1 Then ChessBoard(ex, ey) = 102
End If
''下句:如果是红方(201、202)
If Int(ChessBoard(ex, ey) / 100) = 2 Then
''下句:如果走到第八行则棋子变成202,威力加强
If ex = 8 Then ChessBoard(ex, ey) = 202
End If
End Function
Rem 运算一
Private Sub Command3_Click()
CurrentPlayer = 1
Call Command2_Click
End Sub
Rem 运算二
Private Sub Command4_Click()
CurrentPlayer = 2
Call Command2_Click
End Sub
Private Sub Command5_Click()
Call ReDisplay
End Sub
Private Sub Command6_Click()
If 人机模式 = False Then 人机模式 = True Else 人机模式 = False
If 人机模式 = False Then Command6.Caption = " 人机模式": Command6.ToolTipText = "当前模式:对战" Else Command6.Caption = " 休息模式": Command6.ToolTipText = "当前模式:人机对战"
End Sub
Private Sub Command7_Click()
End
End Sub
Rem 存谱
Private Sub Command8_Click()
On Error GoTo e
Dim i As Integer
Open InputBox("请输入文件名:") For Output As #1
For i = 0 To List2.ListCount - 1
Print #1, List2.List(i)
Next i
Close #1
Exit Sub
e:
Call MsgBox("存储错误!", vbOKOnly + 32, "提示:")
Err.Clear
Exit Sub
End Sub
Private Sub Form_Load()
人机模式 = False
cSel = 0
CurrentPlayer = 1
Call Command1_Click
End Sub
模块代码:
Type CHESSER
Chess As Byte ''为何棋,在BestLocate则标明为何数组
Initx As Byte ''起初棋的位置
Inity As Byte
ObjX As Byte ''经运算后的落棋点
ObjY As Byte
x1 As Byte
y1 As Byte
Allow As Boolean ''是否允许
End Type
用VB编写的跳棋游戏源代码,最好有论文。因为是毕业设计和论文都要交
Chess is believed to he a history of more than 2000 years.
It is a two-player strategy board game played on a chessboard, a checkered gameboard with 64 squares arranged in an eight-by-eight grid.
There are 32 pieces in one chessboard.
It is one of the world's most popular games.
It is played by millions of people worldwide during their spare time.
There are also many chess variants, with different rules, different pieces, and different boards.
国际象棋中象英语怎么拼?
用VB编写的跳棋游戏源代码,最好有论文。因为是毕业设计和论文都要交
回答:
[1]唉,可惜了你的100分了啊,这里估计是没答案了啊,毕竟一般人不会为了100分亲自编写个程序给你吧?
[2]VB跳棋代码:
窗体代码:
Dim ChessBoard(-2 To 10, -2 To 10) As Byte ''棋盘(8竖*8棋)
Dim x(10) As Integer, y(10) As Integer ''搜索的每种走法
Dim x1(10) As Integer, y1(10) As Integer ''搜索的每种走法的可吃子坐标
Dim BestLocate As CHESSER
Dim CurrentPlayer As Byte ''当前玩家
Dim CurrentStep As Integer ''当前步
Dim 人机模式 As Boolean
Dim cSel As Byte ''玩家选择了哪个棋子
Dim tTemp As Boolean
Const MAXDOWNPOINT = 7
Rem 如果Cer为1(黑方),则返回2(红方),否则返加1(黑方)
Public Function NextCer(ByVal Cer As Byte) As Byte
NextCer = 1
If Cer = 1 Then NextCer = 2
End Function
Rem 棋盘
Private Sub Initial()
Dim i As Integer, j As Integer
For i = 1 To 8: For j = 1 To 8: ChessBoard(i, j) = 0: Next j: Next i
ChessBoard(1, 2) = 201
ChessBoard(1, 4) = 201
ChessBoard(1, 6) = 201
ChessBoard(1, 8) = 201
ChessBoard(2, 1) = 201
ChessBoard(2, 3) = 201
ChessBoard(2, 5) = 201
ChessBoard(2, 7) = 201
ChessBoard(3, 2) = 201
ChessBoard(3, 4) = 201
ChessBoard(3, 6) = 201
ChessBoard(3, 8) = 201
ChessBoard(6, 1) = 101
ChessBoard(6, 3) = 101
ChessBoard(6, 5) = 101
ChessBoard(6, 7) = 101
ChessBoard(7, 2) = 101
ChessBoard(7, 4) = 101
ChessBoard(7, 6) = 101
ChessBoard(7, 8) = 101
ChessBoard(8, 1) = 101
ChessBoard(8, 3) = 101
ChessBoard(8, 5) = 101
ChessBoard(8, 7) = 101
End Sub
Rem 反显示(将屏幕显示的内容存入ChessBoard数组)
Private Sub ReDisplay()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If cbText(k).Text = "" Then ChessBoard(i, j) = 0
If cbText(k).Text = "101" Then ChessBoard(i, j) = 101
If cbText(k).Text = "201" Then ChessBoard(i, j) = 201
If cbText(k).Text = "102" Then ChessBoard(i, j) = 102
If cbText(k).Text = "202" Then ChessBoard(i, j) = 202
k = k + 1
Next j
Next i
End Sub
Rem 显示(将ChessBoard数组的内容显示到屏幕后)
Private Sub Display()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If ChessBoard(i, j) = 0 Then
cbText(k).Text = ""
Else
cbText(k).Text = ChessBoard(i, j)
End If
k = k + 1
Next j
Next i
Call 胜负判断
End Sub
Rem 胜负判断
Private Sub 胜负判断()
Dim i As Integer, j As Integer
Dim a As Integer, b As Integer
a = 0: b = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = 1 Then a = a + 1 ''计算玩家的棋子数
If Int(ChessBoard(i, j) / 100) = 2 Then b = b + 1 ''计算电脑的棋子数
Next j
Next i
If a = 0 Then Call MsgBox("我赢了!", vbOKOnly + 32, "提示:"): Exit Sub
If b = 0 Then Call MsgBox("我认输了!", vbOKOnly + 32, "提示:"): Exit Sub
End Sub
Rem 返回估值
Private Function CurrentValue(Cer As Byte) As Integer
Dim i As Integer, j As Integer
CurrentValue = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = Cer Then _
CurrentValue = CurrentValue + ChessBoard(i, j) Mod 100 * 100 + 100 ''是我方的棋子,棋子为1加100分,棋子为2加200分
If Int(ChessBoard(i, j) / 100) = NextCer(Cer) Then _
CurrentValue = CurrentValue - (ChessBoard(i, j) Mod 100 * 100 + 100) ''对方的棋子,棋子为1减100分,棋子为2减200分
Next j
Next i
End Function
Rem 如果Cer方i,j的棋子还可以吃子则返回True
Private Function IsLine(Cer As Byte, i As Byte, j As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
IsLine = False
''开始搜索棋盘
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目标坐标
y = (j - 1) - 1
x1 = i - 1 ''吃子坐标
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
End If
End Function
Rem 如果Cer方的棋子还可以吃子则返回True
Private Function IsLine2(Cer As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
Dim i As Integer, j As Integer
IsLine2 = False
''开始搜索棋盘
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目标坐标
y = (j - 1) - 1
x1 = i - 1 ''吃子坐标
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
End If
Next j
Next i
End Function
Rem 搜索程序
Private Function Search(Cer As Byte, Steps As Integer, IsTop As Boolean, UpMax As Integer)
Dim a As Integer, b As Integer, b1 As Integer, b2 As Integer, i As Integer, j As Integer, k As Integer, l As Integer, v As Integer
Dim MaxValue As Integer
Dim Sc(40) As CHESSER
Dim IsEat(7) As Boolean ''搜索到的7种走法有没有吃子
Dim EAT As Boolean ''有没有吃子
If IsTop Then
List1.Clear
For i = 0 To 40: Sc(i).Allow = False: Next i ';默认情况下所有走法皆不允许,如果所有值均为False则皆允许
End If
EAT = False
For i = 0 To 7: IsEat(7) = False: Next i ''默认情况所有搜索到的走法都没有吃子
Steps = Steps - 1
If Steps < 1 And IsLine2(Cer) = False Then
''如果我方无子可吃时才返回估值
Search = -CurrentValue(Cer) ''返回估值
Exit Function
End If
k = 0
''开始搜索棋盘
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
For i1 = 1 To MAXDOWNPOINT: x(i1) = 0: x1(i1) = 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))
If Cer = 1 And ChessBoard(i, j) Mod 100 <> 2 Then x(2) = -2: x(3) = -2
''下一句解释:如果是红棋(201、202),不允许后退(删除x(0)、x(1))
If Cer = 2 And ChessBoard(i, j) Mod 100 <> 2 Then x(0) = -2: x(1) = -2
''吃子式走法1:即如果基本走法的位置有对方的棋子则可以跳吃(走法限制:Cer为1或棋子为加强棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(4) = (i - 1) - 1 ''目标坐标
y(4) = (j - 1) - 1
x1(4) = i - 1 ''吃子坐标
y1(4) = j - 1
If x(4) > 0 And y(4) > 0 And x(4) < 9 And y(4) < 9 And ChessBoard(x(4), y(4)) = 0 Then _
EAT = True: IsEat(4) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(5) = (i - 1) - 1
y(5) = (j + 1) + 1
x1(5) = i - 1
y1(5) = j + 1
If x(5) > 0 And y(5) > 0 And x(5) < 9 And y(5) < 9 And ChessBoard(x(5), y(5)) = 0 Then _
EAT = True: IsEat(5) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(6) = (i + 1) + 1
y(6) = (j - 1) - 1
x1(6) = i + 1
y1(6) = j - 1
If x(6) > 0 And y(6) > 0 And x(6) < 9 And y(6) < 9 And ChessBoard(x(6), y(6)) = 0 Then _
EAT = True: IsEat(6) = True ''有可吃子,必需走此步,其余走法无效
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(7) = (i + 1) + 1
y(7) = (j + 1) + 1
x1(7) = i + 1
y1(7) = j + 1
If x(7) > 0 And y(7) > 0 And x(7) < 9 And y(7) < 9 And ChessBoard(x(7), y(7)) = 0 Then _
EAT = True: IsEat(7) = True ''有可吃子,必需走此步,其余走法无效
End If
''如果有吃子走法,删除没有吃子的其它走法
If EAT = True Then
For a = 0 To 7
If IsEat(a) = False Then x(a) = -1
Next a
End If
''存入Sc(走法表)中
For a = 0 To 7
'If x(a) = 5 And y(a) = 2 Then Stop
''如果超过棋盘将不能走
If x(a) > 0 And y(a) > 0 And x(a) < 9 And y(a) < 9 Then
''如果目标有棋子则不能走,为0才存入
If ChessBoard(x(a), y(a)) = 0 Then
''将走法存入“走法表”
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)
If IsEat(a) = True Then Sc(k).Allow = True ''如果有吃子,则允许此着走法
k = k + 1
End If
End If
Next a
'If EAT = True Then i = 100: j = 100 ''如果有吃子则不必再搜索
End If
Next j
Next i
MaxValue = -30000 ''当前分数
tTemp = False
''搜索是否有允许走法,如果没有则所有走法皆允许
For i = 0 To k - 1
If Sc(i).Allow = True Then tTemp = True
Next i
''如果有允许走法,则除允许走法外,其余走法皆不允许走
If tTemp = False Then
For i = 0 To k - 1: Sc(i).Allow = True: Next i
End If
''试走每种走法
For i = 0 To k - 1
If Sc(i).Allow = True Then
b1 = ChessBoard(Sc(i).Initx, Sc(i).Inity) ''记录起点棋子和终点棋子
b2 = ChessBoard(Sc(i).ObjX, Sc(i).ObjY)
b = ChessBoard(Sc(i).x1, Sc(i).y1) ''记录被吃子位置的棋子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = 0 ''清除起点的棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b1 ''试下棋
ChessBoard(Sc(i).x1, Sc(i).y1) = 0 ''清除被吃子位置的棋子
''如果到边界则威力加强
''下句:如果是黑方(101、102)
If Cer = 1 Then
''下句:如果走到第一行则棋子变成102,威力加强
If Sc(i).ObjX = 1 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 102
End If
''下句:如果是红方(201、202)
If Cer = 2 Then
''下句:如果走到第八行则棋子变成202,威力加强
If Sc(i).ObjX = 8 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 202
End If
If b > 0 And IsLine(Cer, Sc(i).ObjX, Sc(i).ObjY) = True And EAT = True Then
''如果可连续吃子
v = CurrentValue(Cer) + 300 ''V为当前局面价值加300分
Else
v = Search(NextCer(Cer), Steps - 1, False, -UpMax) ''没有连续可吃子,继续搜索
End If
''恢复棋盘
ChessBoard(Sc(i).x1, Sc(i).y1) = b ''恢复被吃子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = b1 ''记录起点棋子和终点棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b2
'' 显示每种走法的得分
If IsTop Then
List1.AddItem "从" & Str(Sc(i).Initx) & "," & Str(Sc(i).Inity) & _
"到" & Str(Sc(i).ObjX) & "," & Str(Sc(i).ObjY) & "得分:" & Str(v)
End If
'如果这种走法分数高,记录
If IsTop And (v > MaxValue Or MaxValue = -30000) Then
BestLocate.Initx = Sc(i).Initx
BestLocate.Inity = Sc(i).Inity
BestLocate.ObjX = Sc(i).ObjX
BestLocate.ObjY = Sc(i).ObjY
BestLocate.x1 = Sc(i).x1
BestLocate.y1 = Sc(i).y1
MaxValue = v
End If
If v > MaxValue Then MaxValue = v
'下句: 如果 MaxValue >= -UpMax //α-β剪枝, 符合剪枝条件的就Cut掉。UpMax为上层的MaxValue
If IsTop = False And MaxValue >= -UpMax Then i = 100 ''剪枝程序
End If
Next i
If IsTop = False Then Search = -MaxValue Else Search = MaxValue
End Function
Private Sub cbText_Click(Index As Integer)
Dim i As Integer, j As Integer, C As Integer ''C记载吃子
Dim Temp As String, Temp2 As String, Temp3 As String
Dim x As Byte, y As Byte, x2 As Byte, y2 As Byte
If cbText(Index).BackColor <> &HC0E0FF Then Call MsgBox("落棋无效!", vbOKOnly + 32, "提示:"): Exit Sub
If cSel = 0 And Trim(cbText(Index).Text) > "" Then cSel = Index: cbText(cSel).ForeColor = QBColor(12): Exit Sub ''如果玩家一个也没先且当前棋盘位置有棋子,则标示玩家选择此棋子
If cSel <> 0 And Val(cbText(Index).Text) = Val(cbText(cSel).Text) Then cbText(cSel).ForeColor = H80000008&: cSel = 0: Exit Sub ''如果玩家两次选择相同的棋子则取消选择
If cSel <> 0 Then
''下棋
cbText(Index).Text = cbText(cSel).Text
''判断是否可变成加强棋
k = Val(cbText(Index).Text)
If Int(k / 100) = 1 And Index < 8 Then cbText(Index).Text = "102" ''如果1方走到顶端就变成加强棋
If Int(k / 100) = 2 And Index > 55 Then cbText(Index).Text = "202" ''如果2方走到顶端就变成加强棋
cbText(cSel).Text = ""
cbText(cSel).ForeColor = H80000008&
''判断有没有吃子
''向上左斜
If Index - cSel = -18 Then
cbText(Index + 9).Text = "": ''被吃子
C = Index + 9
End If
''向上右斜
If Index - cSel = -14 Then
cbText(Index + 7).Text = "": ''被吃子
C = Index + 7
End If
''向下左斜
If Index - cSel = 14 Then
cbText(Index - 7).Text = "": ''被吃子
C = Index - 7
End If
''向下右斜
If Index - cSel = 18 Then
cbText(Index - 9).Text = "": ''被吃子
C = Index - 9
End If
''存储走法
k = 0: Temp = "": Temp2 = "": Temp = ""
For i = 1 To 8
For j = 1 To 8
If k = cSel Then Temp = "从" & Str(i) + "," + Str(j)
If k = Index Then Temp2 = " 到" + Str(i) + "," + Str(j): x = i: y = j
If k = C Then Temp3 = "吃子 " & Str(i) & "," & Str(j): x2 = i: y2 = j
k = k + 1
Next j
Next i
List2.AddItem "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方" + Temp + Temp2 + Temp3
CurrentStep = CurrentStep + 1
Text3.Text = Temp + Temp2
cSel = 0
Call ReDisplay
''下句:如果是人机模式并且玩家还没有可吃子
If 人机模式 = True And (IsLine(CurrentPlayer, x, y) = True And x2 > 1 And y2 > 2) = False Then
'If 人机模式 = True Then
''看玩家走了哪方的棋子,就运算另一方的棋子
CurrentPlayer = NextCer(Int(Val(cbText(Index).Text) / 100))
Call Command2_Click ''如果是人机模式则让电脑运长
End If
End If
End Sub
Private Sub Command1_Click()
List2.Clear ''清除棋谱
CurrentStep = 1
Call Initial
Call Display
End Sub
Private Sub Command2_Click()
Dim t As Boolean
Command2.Enabled = False
t:
Text1.Text = Str(Search(CurrentPlayer, Val(Text2.Text), True, 0))
Command2.Enabled = True
With BestLocate
t = DownChess(.Initx, .Inity, .ObjX, .ObjY, .x1, .y1)
Call Display
If t = True And IsLine(CurrentPlayer, .ObjX, .ObjY) Then Call MsgBox("我还想再吃一个"): GoTo t ''如果所下之棋还能吃子(连续吃)则再运算
End With
CurrentPlayer = NextCer(CurrentPlayer)
End Sub
Rem 移棋
Rem Sx,Sy:起点棋子 Ex,Ey:终点棋子 Ax,Ay:被吃子
Rem 如果有吃子则返回True
Private Function DownChess(Sx As Byte, Sy As Byte, ex As Byte, ey As Byte, Ax As Byte, Ay As Byte) As Boolean
ChessBoard(ex, ey) = ChessBoard(Sx, Sy)
ChessBoard(Sx, Sy) = 0
ChessBoard(Ax, Ay) = 0 ''清除被吃子
If Ax <> 0 And Ay <> 0 Then DownChess = True Else DownChess = False
Text3.Text = "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方从" & Str(Sx) + "," + Str(Sy) + "到" + Str(ex) + "," + Str(ey) & _
"吃子 " & Str(Ax) & "," & Str(Ay)
CurrentStep = CurrentStep + 1
List2.AddItem Text3.Text
''下句:如果是黑方(101、102)
If Int(ChessBoard(ex, ey) / 100) = 1 Then
''下句:如果走到第一行则棋子变成102,威力加强
If ex = 1 Then ChessBoard(ex, ey) = 102
End If
''下句:如果是红方(201、202)
If Int(ChessBoard(ex, ey) / 100) = 2 Then
''下句:如果走到第八行则棋子变成202,威力加强
If ex = 8 Then ChessBoard(ex, ey) = 202
End If
End Function
Rem 运算一
Private Sub Command3_Click()
CurrentPlayer = 1
Call Command2_Click
End Sub
Rem 运算二
Private Sub Command4_Click()
CurrentPlayer = 2
Call Command2_Click
End Sub
Private Sub Command5_Click()
Call ReDisplay
End Sub
Private Sub Command6_Click()
If 人机模式 = False Then 人机模式 = True Else 人机模式 = False
If 人机模式 = False Then Command6.Caption = " 人机模式": Command6.ToolTipText = "当前模式:对战" Else Command6.Caption = " 休息模式": Command6.ToolTipText = "当前模式:人机对战"
End Sub
Private Sub Command7_Click()
End
End Sub
Rem 存谱
Private Sub Command8_Click()
On Error GoTo e
Dim i As Integer
Open InputBox("请输入文件名:") For Output As #1
For i = 0 To List2.ListCount - 1
Print #1, List2.List(i)
Next i
Close #1
Exit Sub
e:
Call MsgBox("存储错误!", vbOKOnly + 32, "提示:")
Err.Clear
Exit Sub
End Sub
Private Sub Form_Load()
人机模式 = False
cSel = 0
CurrentPlayer = 1
Call Command1_Click
End Sub
模块代码:
Type CHESSER
Chess As Byte ''为何棋,在BestLocate则标明为何数组
Initx As Byte ''起初棋的位置
Inity As Byte
ObjX As Byte ''经运算后的落棋点
ObjY As Byte
x1 As Byte
y1 As Byte
Allow As Boolean ''是否允许
End Type
国际象棋有六种棋子:King、Queen、Bishop、Rook、Knight、Pawn。
它们分别被翻译成:王、后、象、车、马、兵。
“King”翻译成“王”、“Queen”翻译成“后”都很自然。
“Bishop”本意是“主教”,由于该棋子是斜着走的,与中国象棋中的相(象)走法相仿,可翻译成“象”。
“Rook”有“城堡”之意,走法跟中国象棋中的车相同,翻译成“车”很准确。
“Knight”是“骑士”,走法跟中国象棋中的马接近,但没有“蹩马腿”,翻译成“马”理所当然。
“Pawn”翻译为“兵”,妥当。