中国象棋Delphi版本程序代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, Buttons,Unit2,Unit3;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
MainMenu1: TMainMenu;
Game1: TMenuItem;
NewGame1: TMenuItem;
Eixt1: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
Label4: TLabel;
s1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
GroupBox1: TGroupBox;
PaintBox2: TPaintBox;
BitBtn2: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
GroupBox2: TGroupBox;
Memo1: TMemo;
BitBtn7: TBitBtn;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
RadioGroup1: TRadioGroup;
RadioGroup2: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure NewGame1Click(Sender: TObject);
procedure Eixt1Click(Sender: TObject);
procedure CrossPaint(x,y,i,j:integer); //自定义画兵格过程
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FindDrop(NowR,NowC:integer); //扫描可以走棋的点过程
procedure PaintCMoveDrop(); //画出可走点过程
procedure WhoWin(); //判断输赢过程
procedure IsNextWin();//判断是否将军
procedure RemHistory();//走棋记录
procedure RepentChess(n:integer);
procedure FindAGoodMove(); //寻找一个优秀的走法
procedure AddPoint(row,column:integer);//加入一个相关点
function Eveluate(nSide:integer):integer;//估值函数
function Eveluate1(nSide:integer):integer;//测试估值函数
function GetRelatePiece(row,column:integer):integer;//枚举一个位置上棋子所有相关的点
function GetBingValue(row,column:integer):integer;//为兵返回附加值
//创建可能的走法 nPly记录扫描的层数,nSide记录到那边走棋 0为红方,1为黑方 function CreatePossibleMove(nPly,nSide:integer):integer;
function MakeMove(depth,n:integer):integer;//猜想过程中生产一个新局面
procedure UnMakeMove(depth,n,nChessID:integer); //猜想过程中根据走法恢复一个棋盘
function IsGameOver(depth:integer):integer;//猜想过程中判断给定局面是否结束 function AddMove(FormR,FormC,ToR,ToC,nPly:integer):integer;//在nMoveList中插入一个走法
function NegaMax(depth:integer):integer; //深度优先搜索负极大技校
function Alpha_Beta(depth,alpha,beta:integer):integer;//Alpha-Beta搜索算法 function ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //走棋规则函数
function ChessMoveLawPos(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //猜想过程走棋规则函数
function CanTouch(NowR,NowC,ToR,ToC,nChessID:integer):boolean;//判断能不能到达目标点
function ChessPutLaw(NowR,NowC,ToR,ToC:integer):boolean; //摆起规则函数
function ChessMove(NowR,NowC,ToR,ToC:integer):boolean; //走棋函数
function AIChessMove(NowR,NowC,ToR,ToC:integer):boolean; //电脑走棋
procedure BitBtn1Click(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure PaintBox2Paint(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure PaintBox2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure N13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//棋盘格子单位大小
mBit:integer;
//棋子数组:所有棋子的数值
mChess: array[1..14] of string =
('车','马','相','士','帅','炮','兵','車','馬','象','仕','将','炮','卒');
//===============================棋子价值==============================// //棋子的基础价值
m_BaseValue: array[1..14] of integer=
(500,350,250,250,10000,370,100,500,350,250,250,10000,370,100);
//棋子灵活度基础价值
m_Flexible:array[1..14] of integer=
(6,12,1,1,0,6,15,6,12,1,1,0,6,15);
//每一个位置上的棋子的灵活性即可走步数
m_FlexibleNum:array[1..10,1..9]of integer;
//每一个位置被威胁的信息
m_AttackNum:array[1..10,1..9]of integer;
//每一个位置被保护的信息
m_GuardNum:array[1..10,1..9]of integer;
//每一个棋子是总价值
m_ChessValue:array[1..10,1..9]of integer;
//红兵附加值矩阵
mBing:array[1..10,1..9]of integer=
(
(0,0,0,0,0,0,0,0,0),
(90,90,110,120,120,120,110,90,90),
(90,90,110,120,120,120,110,90,90),
(70,90,110,110,110,110,110,90,70),
(70,70,70,70,70,70,70,70,70),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0)
);
//黑卒附加值矩阵
mZhuzi:array[1..10,1..9]of integer=
(
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,0),
(70,70,70,70,70,70,70,70,70),
(70,90,110,110,110,110,110,90,70),
(90,90,110,120,120,120,110,90,90),
(90,90,110,120,120,120,110,90,90),
(0,0,0,0,0,0,0,0,0)
);
//===============================棋子价值==============================//
//棋盘两边的数表
NumWord1:array[1..9] of string =
('1','2','3','4','5','6','7','8','9');
NumWord2:array[1..10] of string=
('一','二','三','四','五','六','七','八','九','十');
NumWord3:array[1..14] of integer=//摆子时盒子里剩余的棋子数量
(2,2,2,2,1,2,5,2,2,2,2,1,2,5);
//棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0 ChessBoard: array[1..10,1..9] of integer;
//电脑猜想时棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0
nPosition: array[1..10,1..9] of integer;
//自定义棋盘盒子数组
ChessBox:array[1..2,1..7]of integer;
//定义导航点数组能走的坐标点存在数组中值为1,不能走为0
CMoveDrop:array[1..10,1..9] of integer;
//棋盘1拾子标志(True表示已经拾取一个棋子)
mPickFlag : boolean;
//棋盘2拾子标志(True表示已经拾取一个棋子)
mPickFlag2:boolean;
//在paintbox1拾起棋子的值
mPickChess: integer;
//在paintbox2拾起的棋子值
mPickChess2:integer;
//拾起棋子的行号
mPickRow : integer;
//拾起棋子的列号
mPickColumn :integer;
//最大价值棋子的行列
MVCRow,MVCColumn:integer;
//走棋规则,允许落子标志
CanDropFlag : boolean;
//鼠标在Paintbox1点中坐标
MouseRow,MouseColumn:integer;
//鼠标在paintbox2点中的坐标
MouseR2,MouseC2:integer;
//定义到谁走棋
WhoPlay:string;
//定义先手方
FirstPlay:string;
GameMode:integer; //定义游戏模式 1:人人对弈 2:人机对弈 3:自定义棋局 4:思考模式
//拾起棋子为哪一方 1为红方,0为黑方
mPWhoPlay:string;
//判定是否移动棋子
IsMove:boolean;
//胜利
Win : boolean;
//走棋步数
MCSteep:integer;
//总的走法数
mMoveCount:integer;
//相关位置点的总数
mPosCount:integer;
//调用估值函数的次数
useEveluateCount:integer;
//搜索的最大深度
mMaxDepth:integer;
//Memo1当前加上的最后一行
MemoMaxLine:integer;
type //自定义记录类型用来记录走棋记录
ChessRecord=record
ChessBoard:array[1..10,1..9]of integer;
Win:boolean;
WhoPlay:string;
end;
var
History:array[0..300]of ChessRecord;
type
HaveNum=record
Number:integer;
end;
var ChessHaveNum:array[1..14]of HaveNum; //自定义棋盘是摆起盒子里面剩余的棋子数
type
Point=record
row:integer;
column:integer;
end;
var
RelatePos:array[1..20]of Point; //与一个棋子相关的位置
type
MoveList=record //走法列表
FormR:integer;
FormC:integer;
ToR:integer;
ToC:integer;
end;
var
nMoveList:array[0..10,1..100]of MoveList; //走法列表
nBestMove:MoveList;//最佳走法
implementation
end.
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var
i,j: integer;
begin
//设置棋盘格子单位大小,控制棋盘大小
mBit:=50; //建议在45~55之间 50最佳
//设置paintbox1的大小和位置
paintbox1.Top:=65;
paintbox1.Left:=10;
paintbox1.Width:=10*mBit;
paintbox1.Height:=11*mBit;
//设置label1的大小和位置
label1.Width:=150;
label1.Height:=37;
label1.Left:=15*mBit+15;
label1.Top:=15;
//设置label2的位置大小
label2.Width:=115;
label2.Height:=37;
label2.Left:=13*mBit;
label2.Top:=15;
//设置label3的位置
label3.Left:=30;
label3.Top:=15;
//初始化胜利提示
label4.Caption:='';
//设置form1的大小和颜色
form1.Width:=19*mBit;
form1.Height:=14*mBit;
//初始化可走点
for i:=1 to 10 do
for j:=1 to 9 do
CMoveDrop[i,j]:=0;
//初始化棋盘数组
for i:=1 to 10 do
for j:=1 to 9 do
begin
ChessBoard[i,j]:=0;
nPosition[i,j]:=0;
end;
//初始化先手
FirstPlay:='';
//初始化游戏模式
GameMode:=0;
//拾子标志为false
mPickFlag:=false;
//能走棋标志为false
CanDropFlag:=false;
//是否移动棋子为false
IsMove:=false;
//初始化走棋步数
MCSteep:=0;
//初始化最大走法数
mMoveCount:=0;
//初始化相关位置数
mPosCount:=0;
//初始化游戏模式、先手方、电脑难度 GameMode:=2;
N7.Checked:=true;
FirstPlay:='红';
N2.Checked:=true;
mMaxDepth:=3;
N12.Checked:=true;
//胜利标志
win:=false;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i,j:integer;
begin
label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';
//初始化胜利提示
label4.Caption:='';
https://www.360docs.net/doc/4413561818.html,:='宋体';
label1.Font.Size:=25;
label1.Caption:=WhoPlay+'方走棋';
//<=========================画棋盘begin============================> paintbox1.Canvas.Pen.Width:=2;
paintbox1.Canvas.Pen.Color:=clblack;
paintbox1.Canvas.Brush.Color:=clSilver;//画出棋盘的外框
paintbox1.Canvas.Rectangle(0,0,10*mBit,11*mBit); //棋盘外框
for i:=1 to 9 do //棋盘边的行标和列标begin
paintbox1.Canvas.TextOut(i*mBit-3,10,NumWord1[i]);
paintbox1.Canvas.TextOut(i*mBit-3,10*mBit+25,NumWord1[i]);
end;
for i:=1 to 10 do
begin
paintbox1.Canvas.TextOut(10,i*mBit-5,NumWord2[i]);
paintbox1.Canvas.TextOut(9*mBit+25,i*mBit-5,NumWord2[i]);
end;
https://www.360docs.net/doc/4413561818.html,:='宋体';
paintbox1.Canvas.font.Size:=mBit div 2;
paintbox1.Canvas.TextOut(mBit+35,5*mBit+8,' 楚河汉界');
//棋盘外边的字
//棋盘两边的纵向直线
paintbox1.Canvas.MoveTo(mBit,mBit);
paintbox1.Canvas.LineTo(mBit,10*mBit); paintbox1.Canvas.MoveTo(9*mBit,mBit); paintbox1.Canvas.LineTo(9*mBit,10*mBit);
//棋盘上面的横向直线
for i:=1 to 10 do
begin
paintbox1.Canvas.MoveTo(mBit,i*mBit);
paintbox1.Canvas.LineTo(9*mBit,i*mBit);
end;
//棋盘上的纵向直线
for i:=2 to 8 do
begin
paintbox1.Canvas.MoveTo(i*mBit,mBit);
paintbox1.Canvas.LineTo(i*mBit,5*mBit); paintbox1.Canvas.MoveTo(i*mBit,6*mBit); paintbox1.Canvas.LineTo(i*mBit,10*mBit); end;
//棋盘上的田字格斜线
paintbox1.Canvas.MoveTo(4*mBit,mBit); paintbox1.Canvas.LineTo(6*mBit,3*mBit); paintbox1.Canvas.MoveTo(4*mBit,3*mBit); paintbox1.Canvas.LineTo(6*mBit,mBit);
paintbox1.Canvas.MoveTo(4*mBit,8*mBit); paintbox1.Canvas.LineTo(6*mBit,10*mBit); paintbox1.Canvas.MoveTo(4*mBit,10*mBit); paintbox1.Canvas.LineTo(6*mBit,8*mBit);
//画兵格炮格
i:=1;
repeat
CrossPaint(i*mBit,4*mBit,5,15);//黑方兵格 CrossPaint(i*mBit,7*mBit,5,15);//红方兵格 i:=i+2;
until i>9;
//黑方炮格
CrossPaint(2*mBit,3*mBit,5,15);
CrossPaint(8*mBit,3*mBit,5,15);
//红方炮格
CrossPaint(2*mBit,8*mBit,5,15);
CrossPaint(8*mBit,8*mBit,5,15);
//<=========================画棋盘end============================>
//<=========================画棋子begin================================>
for i:=1 to 10 do
for j:=1 to 9 do
if ChessBoard[i,j]<> 0 then
begin
paintbox1.Canvas.Brush.Color:=clBtnFace;
//画出棋子
if ChessBoard[i,j]<=7 then
begin
paintbox1.Canvas.Pen.Width:=2;
paintbox1.Canvas.Pen.Color:=clred;
paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);
paintbox1.Canvas.Font.Size:=22;
https://www.360docs.net/doc/4413561818.html,:='隶书';
paintbox1.Canvas.Font.Color:=clred;
paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); end
else
begin
paintbox1.Canvas.Pen.Width:=2;
paintbox1.Canvas.Pen.Color:=clblack;
paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);
paintbox1.Canvas.font.Size:=22;
https://www.360docs.net/doc/4413561818.html,:='隶书';
paintbox1.Canvas.Font.Color:=clblack;
paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); end
end;
//<=========================画棋子end================================>
end;
procedure TForm1.FormPaint(Sender: TObject); //游戏界面
begin
form1.Canvas.Pen.Width:=2;
form1.Canvas.Rectangle(10,10,19*mBit-15,55);//最上方外框
form1.Canvas.Rectangle(11*mBit-30,mBit+15,19*mBit-15,12*mBit+15);
end;
procedure TForm1.NewGame1Click(Sender: TObject);
var
i,j:integer;
begin
if(FirstPlay<>'')and((GameMode=1)or(GameMode=2))then
begin
if(MessageDlg('确定要开始新游戏吗?',mtConfirmation,[mbYes,mbNo],0))=mrYes then
begin
GroupBox1.Visible:=false;//隐藏GroupBox1
Memo1.Lines.Clear;
Memo1.Lines.Add('新游戏开始!');
MemoMaxLine:=Memo1.Lines.Add('由'+FirstPlay+'先走棋!');
//拾子标志为false
mPickFlag:=false;
//能走棋标志为false
CanDropFlag:=false;
//胜利标志
win:=false;
//初始化走棋一方
WhoPlay:=FirstPlay;
if(WhoPlay='红')then
label1.Font.Color:=clred;
if(WhoPlay='黑')then
label1.Font.Color:=clblack;
https://www.360docs.net/doc/4413561818.html,:='宋体';
label1.Font.Size:=25;
label1.Caption:='红方走棋';
//初始化胜利提示
label4.Caption:='';
//初始化走棋步数
MCSteep:=0;
label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';
//初始化棋盘数组
for i:=1 to 10 do
for j:=1 to 9 do
begin
ChessBoard[i,j]:=0;
end;
//(1'车',2'马',3'象',4'士',5'帅',6'炮','7兵',8'車',9'馬',10'相',11'仕',12'将',13'炮',14'卒');
//设置黑方的棋子
ChessBoard[1,1]:=8;
ChessBoard[1,2]:=9;
ChessBoard[1,3]:=10;
ChessBoard[1,4]:=11;
ChessBoard[1,5]:=12;
ChessBoard[1,6]:=11;
ChessBoard[1,7]:=10;
ChessBoard[1,8]:=9;
ChessBoard[1,9]:=8;
ChessBoard[3,2]:=13;
ChessBoard[3,8]:=13;
ChessBoard[4,1]:=14;
ChessBoard[4,3]:=14;
ChessBoard[4,5]:=14;
ChessBoard[4,7]:=14;
ChessBoard[4,9]:=14;
//设置红方的棋子
ChessBoard[10,1]:=1;
ChessBoard[10,2]:=2;
ChessBoard[10,3]:=3;
ChessBoard[10,4]:=4;
ChessBoard[10,5]:=5;
ChessBoard[10,6]:=4;
ChessBoard[10,7]:=3;
ChessBoard[10,8]:=2;
ChessBoard[10,9]:=1;
ChessBoard[8,2]:=6;
ChessBoard[8,8]:=6;
ChessBoard[7,1]:=7;
ChessBoard[7,3]:=7;
ChessBoard[7,5]:=7;
ChessBoard[7,7]:=7;
ChessBoard[7,9]:=7;
refresh();//更新棋盘
RemHistory();
if(GameMode=2)and(FirstPlay='黑')then //人机对弈模式由黑方先手
begin
FindAGoodMove();
AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC);
if(isMove=true)then
begin
RemHistory();//记录棋子移动
WhoPlay:='红';
label1.Font.Color:=clred;
refresh();
paintbox1.Canvas.Pen.Width:=2;
paintbox1.Canvas.Pen.Color:=clgreen;
CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);//棋子起走点标记
CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落点标记 isMove:=false;
end;
end;
end;//if(MessageDlg('确定要开始新游戏吗
end
else
MessageDlg('请设置游戏模式!',mtWarning,[mbOk],0);
end;
procedure TForm1.CrossPaint(x,y,i,j:integer); //画兵格过程
begin
if x<>mBit then
begin
//兵格坐标左上部
paintbox1.Canvas.MoveTo(x-i,y-i);
paintbox1.Canvas.LineTo(x-j,y-i);
paintbox1.Canvas.MoveTo(x-i,y-i);
paintbox1.Canvas.LineTo(x-i,y-j);
//兵格坐标左下部
paintbox1.Canvas.MoveTo(x-i,y+i);
paintbox1.Canvas.LineTo(x-j,y+i);
paintbox1.Canvas.MoveTo(x-i,y+i);
paintbox1.Canvas.LineTo(x-i,y+j);
end;
if x<>9*mBit then
begin
//兵格坐标右上部
paintbox1.Canvas.MoveTo(x+i,y-i);
paintbox1.Canvas.LineTo(x+i,y-j);
paintbox1.Canvas.MoveTo(x+i,y-i);
paintbox1.Canvas.LineTo(x+j,y-i);
//兵格坐标右下部
paintbox1.Canvas.MoveTo(x+i,y+i);
paintbox1.Canvas.LineTo(x+j,y+i);
paintbox1.Canvas.MoveTo(x+i,y+i);
paintbox1.Canvas.LineTo(x+i,y+j);
end;
end;
procedure TForm1.Eixt1Click(Sender: TObject);
begin
if(MessageDlg('确定要退出游戏?',mtConfirmation,[mbYes,mbNo],0))=mrYes then close;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
row,column:integer;//鼠标落点的行,列号
Lcross : real;//鼠标落点到棋盘交叉点的距离
i,j:integer;
begin
if GameMode=1 then//判断游戏模式
begin
//计算出鼠标落下的行,列号
row:=Y div mBit;
if Y mod mBit>= (mBit div 2)+1 then
row:=row+1;
column:= x div mBit;
if X mod mBit>= (mBit div 2)+1 then
column:=column+1;
//记录鼠标点下的坐标
MouseColumn:=column;
MouseRow:=row;
//当前鼠标点中的棋子
mPickChess:=ChessBoard[row,column];
//当前选中棋子属于哪一方
if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)then
mPWhoPlay:='红';//红方
if(ChessBoard[row,column]>7)then
mPWhoPlay:='黑';//黑方
//计算出鼠标落点到棋盘交叉点的距离
Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));
if(win=false)then//判断输赢
begin
if (Button = mbLeft) then
begin
//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div 2)) then
begin
if (mPickFlag = false) then
begin
if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) then
begin
mPickChess:=ChessBoard[row,column];//拾起棋子赋值
//拾起棋子的坐标
mPickRow:=row;
mPickColumn:=column;
//拾起棋子标志重画
paintbox1.Canvas.Pen.Width:=1;
paintbox1.Canvas.Pen.Color:=clred;
paintbox1.Canvas.Brush.Color:=clblue;
paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;
https://www.360docs.net/doc/4413561818.html,:='华文楷体';
paintbox1.Canvas.Font.Color:=clwhite;
paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);
//设置拾子标志为true
mPickFlag:=true;
//能走棋标志为false
CanDropFlag:=false;
//扫描能走的点
FindDrop(mPickRow,mPickColumn);
//画出能走的点
PaintCMoveDrop();
end;//选中棋子
end
else //可以下子
begin
//调用ChessMove过程,移动棋子
ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);
if(IsMove=false)then //如果没有移动
begin
refresh();//更新棋盘
mPickFlag:=false;//目标点不合法更新棋盘
//继续点自己的棋子直接选中
if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) then
begin
mPickChess:=ChessBoard[row,column];//拾起棋子赋值
//拾起棋子的坐标
mPickRow:=row;
mPickColumn:=column;
//拾起棋子标志重画
paintbox1.Canvas.Pen.Width:=1;
paintbox1.Canvas.Pen.Color:=clred;
paintbox1.Canvas.Brush.Color:=clblue;
paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22);
paintbox1.Canvas.Font.Size:=21;
https://www.360docs.net/doc/4413561818.html,:='华文楷体';
paintbox1.Canvas.Font.Color:=clwhite;
paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);
//设置拾子标志为true
mPickFlag:=true;
//能走棋标志为false
CanDropFlag:=false;
//扫描能走的点
FindDrop(mPickRow,mPickColumn);
//画出能走的点
PaintCMoveDrop();
end;
end;
if(IsMove=true)then //目标点合法更新走棋方
begin
//MFindDrop(MouseRow,MouseColumn);//移动到目标后该棋子可走点
refresh();//更新棋盘
IsNextWin();//判断是否将军
WhoWin(); //判断输赢
if(Win=true)then
exit;
if(WhoPlay='红')then //交换走棋方
begin
WhoPlay:='黑';
label1.Font.Color:=clblack;
end
else
begin
WhoPlay:='红';
label1.Font.Color:=clred;
end;
label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';
refresh();//更新棋盘
RemHistory();//记录棋子移动
paintbox1.Canvas.Pen.Width:=2;
paintbox1.Canvas.Pen.Color:=clgreen;
CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);//棋子起走点标记
CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);//棋子落点标记
IsMove:=false;
mPickFlag:=false;
end;
end;
end;
end;
end;//if(win=false)then
end;//if(GameMode=1)
if(GameMode=2)then //人机对弈
begin
if(WhoPlay='红')then //红方走棋
begin
//计算出鼠标落下的行,列号
row:=Y div mBit;
if Y mod mBit>= (mBit div 2)+1 then
row:=row+1;
column:= x div mBit;
if X mod mBit>= (mBit div 2)+1 then
column:=column+1;
//记录鼠标点下的坐标
MouseColumn:=column;
MouseRow:=row;
//当前鼠标点中的棋子
mPickChess:=ChessBoard[row,column];
//当前选中棋子属于哪一方
if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)then
mPWhoPlay:='红';//红方
if(ChessBoard[row,column]>7)then
mPWhoPlay:='黑';//黑方
//计算出鼠标落点到棋盘交叉点的距离
Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));
if(win=false)then//判断输赢
begin
if (Button = mbLeft) then
begin
//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div