中国象棋Delphi版本程序代码_第1页
中国象棋Delphi版本程序代码_第2页
中国象棋Delphi版本程序代码_第3页
中国象棋Delphi版本程序代码_第4页
中国象棋Delphi版本程序代码_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、unit Unit1;interfaceuses 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;

2、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; B

3、itBtn5: 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)

4、; 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 Pai

5、ntCMoveDrop(); /画出可走点过程 procedure WhoWin(); /判断输赢过程 procedure IsNextWin();/判断是否将军 procedure RemHistory();/走棋记录 procedure RepentChess(n:integer); procedure FindAGoodMove(); /寻找一个优秀的走法 procedure AddPoint(row,column:integer);/加入一个相关点 function Eveluate(nSide:integer):integer;/估值函数 function Eveluate1(nSi

6、de: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;

7、/猜想过程中生产一个新局面 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,alp

8、ha,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,No

9、wC,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(S

10、ender: 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: In

11、teger); 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 N13

12、Click(Sender: TObject); private Private declarations public Public declarations end;var Form1: TForm1;/棋盘格子单位大小mBit:integer;/棋子数组:所有棋子的数值mChess: array1.14 of string =(车,马,相,士,帅,炮,兵,車,馬,象,仕,将,炮,卒);/=棋子价值=/棋子的基础价值m_BaseValue: array1.14 of integer=(500,350,250,250,10000,370,100,500,350,250,250,10000,37

13、0,100);/棋子灵活度基础价值m_Flexible:array1.14 of integer=(6,12,1,1,0,6,15,6,12,1,1,0,6,15);/每一个位置上的棋子的灵活性 即可走步数m_FlexibleNum:array1.10,1.9of integer;/每一个位置被威胁的信息m_AttackNum:array1.10,1.9of integer;/每一个位置被保护的信息m_GuardNum:array1.10,1.9of integer;/每一个棋子是总价值m_ChessValue:array1.10,1.9of integer;/红兵附加值矩阵mBing:arr

14、ay1.10,1.9of 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:array1.10,1.9

15、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:array1.9 of st

16、ring =(1,2,3,4,5,6,7,8,9);NumWord2:array1.10 of string=(一,二,三,四,五,六,七,八,九,十);NumWord3:array1.14 of integer=/摆子时盒子里剩余的棋子数量(2,2,2,2,1,2,5,2,2,2,2,1,2,5);/棋盘数组:记录什么位置有什么棋子 有子地方为mChess里面的数值,无子为0ChessBoard: array1.10,1.9 of integer;/电脑猜想时棋盘数组:记录什么位置有什么棋子 有子地方为mChess里面的数值,无子为0nPosition: array1.10,1.9 of i

17、nteger;/自定义棋盘盒子数组ChessBox:array1.2,1.7of integer;/定义导航点数组 能走的坐标点存在数组中值为1,不能走为0CMoveDrop:array1.10,1.9 of integer;/棋盘1拾子标志(True表示已经拾取一个棋子)mPickFlag : boolean;/棋盘2拾子标志(True表示已经拾取一个棋子)mPickFlag2:boolean;/在paintbox1拾起棋子的值mPickChess: integer;/在paintbox2拾起的棋子值mPickChess2:integer;/拾起棋子的行号mPickRow : integer

18、;/拾起棋子的列号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为红方

19、,0为黑方mPWhoPlay:string;/判定是否移动棋子IsMove:boolean;/胜利Win : boolean;/走棋步数MCSteep:integer;/总的走法数mMoveCount:integer;/相关位置点的总数mPosCount:integer;/调用估值函数的次数useEveluateCount:integer;/搜索的最大深度mMaxDepth:integer;/Memo1当前加上的最后一行MemoMaxLine:integer;type /自定义记录类型 用来记录走棋记录 ChessRecord=record ChessBoard:array1.10,1.9of

20、 integer; Win:boolean; WhoPlay:string;end;var History:array0.300of ChessRecord;type HaveNum=record Number:integer;end;var ChessHaveNum:array1.14of HaveNum; /自定义棋盘是摆起盒子里面剩余的棋子数type Point=record row:integer; column:integer;end;varRelatePos:array1.20of Point; /与一个棋子相关的位置type MoveList=record /走法列表 FormR

21、:integer; FormC:integer; ToR:integer; ToC:integer;end;varnMoveList:array0.10,1.100of MoveList; /走法列表nBestMove:MoveList;/最佳走法implementationend.implementation$R *.dfmprocedure TForm1.FormCreate(Sender: TObject);vari,j: integer;begin/设置棋盘格子单位大小,控制棋盘大小mBit:=50; /建议在4555之间 50最佳/设置paintbox1的大小 和 位置paintbo

22、x1.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

23、;/初始化胜利提示label4.Caption:=;/设置form1的大小 和 颜色form1.Width:=19*mBit;form1.Height:=14*mBit;/初始化可走点for i:=1 to 10 do for j:=1 to 9 do CMoveDropi,j:=0;/初始化棋盘数组for i:=1 to 10 do for j:=1 to 9 do begin ChessBoardi,j:=0; nPositioni,j:=0; end;/初始化先手 FirstPlay:=;/初始化游戏模式GameMode:=0;/拾子标志为false mPickFlag:=false;/

24、能走棋标志为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:

25、TObject);vari,j:integer;beginlabel3.Caption:=走棋步数:第+inttostr(MCSteep)+步;/初始化胜利提示label4.Caption:=;label1.Font.Name:=宋体;label1.Font.Size:=25;label1.Caption:=WhoPlay+方走棋;/paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clblack;paintbox1.Canvas.Brush.Color:=clSilver;/画出棋盘的外框paintbox1.Canvas.Re

26、ctangle(0,0,10*mBit,11*mBit); /棋盘外框for i:=1 to 9 do /棋盘边的行标和列标begin paintbox1.Canvas.TextOut(i*mBit-3,10,NumWord1i); paintbox1.Canvas.TextOut(i*mBit-3,10*mBit+25,NumWord1i);end;for i:=1 to 10 dobegin paintbox1.Canvas.TextOut(10,i*mBit-5,NumWord2i); paintbox1.Canvas.TextOut(9*mBit+25,i*mBit-5,NumWord

27、2i);end;paintbox1.Canvas.Font.Name:=宋体;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);/棋盘

28、上面的横向直线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*mBi

29、t); 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.C

30、anvas.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 i9;/黑方炮格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);/for i:=1 to 10 do for j:=1 t

31、o 9 do if ChessBoardi,j 0 then begin paintbox1.Canvas.Brush.Color:=clBtnFace; /画出棋子 if ChessBoardi,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; paintbox1.Canvas.Font

32、.Name:=隶书; paintbox1.Canvas.Font.Color:=clred; paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChessChessBoardi,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; pain

33、tbox1.Canvas.Font.Name:=隶书; paintbox1.Canvas.Font.Color:=clblack; paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChessChessBoardi,j); end end;/end;procedure TForm1.FormPaint(Sender: TObject); /游戏界面beginform1.Canvas.Pen.Width:=2;form1.Canvas.Rectangle(10,10,19*mBit-15,55);/最上方外框form1.Canvas.Rectangle(

34、11*mBit-30,mBit+15,19*mBit-15,12*mBit+15);end;procedure TForm1.NewGame1Click(Sender: TObject);vari,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; Memo

35、1.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; label1.Font.Name:=宋体; label1.Fo

36、nt.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 ChessBoardi,j:=0; end; /(1车,2马,3象,4士,5帅,6炮,7兵,8車,9馬,10相,11仕,12将,13炮,14卒); /设置黑方的棋子 ChessBoard1,1:=8; ChessBoard1,2:=9; Ches

37、sBoard1,3:=10; ChessBoard1,4:=11; ChessBoard1,5:=12; ChessBoard1,6:=11; ChessBoard1,7:=10; ChessBoard1,8:=9; ChessBoard1,9:=8; ChessBoard3,2:=13; ChessBoard3,8:=13; ChessBoard4,1:=14; ChessBoard4,3:=14; ChessBoard4,5:=14; ChessBoard4,7:=14; ChessBoard4,9:=14; /设置红方的棋子 ChessBoard10,1:=1; ChessBoard10

38、,2:=2; ChessBoard10,3:=3; ChessBoard10,4:=4; ChessBoard10,5:=5; ChessBoard10,6:=4; ChessBoard10,7:=3; ChessBoard10,8:=2; ChessBoard10,9:=1; ChessBoard8,2:=6; ChessBoard8,8:=6; ChessBoard7,1:=7; ChessBoard7,3:=7; ChessBoard7,5:=7; ChessBoard7,7:=7; ChessBoard7,9:=7; refresh();/更新棋盘 RemHistory(); if(G

39、ameMode=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:=clgr

40、een; 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); /画兵格过程beginif x

41、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,

42、y+j); end;if x9*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.Ca

43、nvas.LineTo(x+i,y+j); end; end;procedure TForm1.Eixt1Click(Sender: TObject);beginif(MessageDlg(确定要退出游戏?,mtConfirmation,mbYes,mbNo,0)=mrYes then close;end;procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);varrow,column:integer;/鼠标落点的行,列号Lcro

44、ss : real;/鼠标落点到棋盘交叉点的距离i,j:integer;beginif 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:=ChessB

45、oardrow,column; /当前选中棋子属于哪一方 if(ChessBoardrow,column=7)and(ChessBoardrow,column0)then mPWhoPlay:=红;/红方 if(ChessBoardrow,column7)then mPWhoPlay:=黑;/黑方 /计算出鼠标落点到棋盘交叉点的距离 Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit); if(win=false)then/判断输赢 begin if (Button = mbLeft) then begin /行号在(110) ,列号在(19)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row=1)and (row=1)and(column=9)and (Lcross=(mBit div 2) then begin if (mPickFlag = false) then begin if (ChessBoardrow,column0)and(mPWhoPlay=WhoPlay) then begin mPickChess:=ChessBoardrow,column;/拾起棋子赋值 /拾起棋子的坐标 mPickRow:=row; mPickColumn:=column; /拾起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论