中國象棋Delphi版本程序代碼_第1頁
中國象棋Delphi版本程序代碼_第2頁
中國象棋Delphi版本程序代碼_第3頁
中國象棋Delphi版本程序代碼_第4頁
中國象棋Delphi版本程序代碼_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,Menus,ExtCtrls,StdCtrls,Buttons,Unit2,Unit3;typeTForm1=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;procedureFormCreate(Sender:TObject);procedurePaintBox1Paint(Sender:TObject);procedureNewGame1Click(Sender:TObject);procedureEixt1Click(Sender:TObject);procedureCrossPaint(x,y,i,j:integer); // 自定義畫兵格過程procedurePaintBox1MouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);procedureFindDrop(NowR,NowC:integer); // 掃描可以走棋的點(diǎn)過程procedurePaintCMoveDrop();// 畫出可走點(diǎn)過程procedureWhoWin(); // 判斷輸贏過程procedureIsNextWin();// 判斷是否將軍procedureRemHistory();// 走棋記錄procedureRepentChess(n:integer);procedureFindAGoodMove();// 尋找一個(gè)優(yōu)秀的走法procedureAddPoint(row,column:integer);// 加入一個(gè)相關(guān)點(diǎn)functionEveluate(nSide:integer):integer;//functionEveluate1(nSide:integer):integer;//functionGetRelatePiece(row,column:integer):integer;//

估值函數(shù)測試估值函數(shù)枚舉一個(gè)位置上棋子所有相關(guān)的點(diǎn)functionGetBingValue(row,column:integer):integer;// 為兵返回附加值創(chuàng)建可能的走法nPly記錄掃描的層數(shù),nSide記錄到那邊走棋0為紅方,1為黑方functionCreatePossibleMove(nPly,nSide:integer):integer;functionMakeMove(depth,n:integer):integer;// 猜想過程中生產(chǎn)一個(gè)新局面procedureUnMakeMove(depth,n,nChessID:integer);// 猜想過程中根據(jù)走法恢復(fù)一個(gè)棋盤functionIsGameOver(depth:integer):integer;// 猜想過程中判斷給定局面是否結(jié)束function AddMove(FormR,FormC,ToR,ToC,nPly:integer):integer;// 在nMoveList

中插入一個(gè)走法functionNegaMax(depth:integer):integer; // 深度優(yōu)先搜索負(fù)極大技校functionAlpha_Beta(depth,alpha,beta:integer):integer;//Alpha-BetafunctionChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean;//

搜索算法走棋規(guī)則函數(shù)functionChessMoveLawPos(NowR,NowC,ToR,ToC,nChessID:integer):boolean;

//猜想過程走棋規(guī)則函數(shù)functionCanTouch(NowR,NowC,ToR,ToC,nChessID:integer):boolean;//

判斷能不能到達(dá)目標(biāo)點(diǎn)functionChessPutLaw(NowR,NowC,ToR,ToC:integer):boolean;//functionChessMove(NowR,NowC,ToR,ToC:integer):boolean;//functionAIChessMove(NowR,NowC,ToR,ToC:integer):boolean;//

擺起規(guī)則函數(shù)走棋函數(shù)電腦走棋procedureBitBtn1Click(Sender:TObject);procedureFormPaint(Sender:TObject);procedureBitBtn3Click(Sender:TObject);procedureN3Click(Sender:TObject);procedureN2Click(Sender:TObject);procedureN6Click(Sender:TObject);procedureN7Click(Sender:TObject);procedurePaintBox2Paint(Sender:TObject);procedureN8Click(Sender:TObject);procedurePaintBox2MouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);procedureBitBtn5Click(Sender:TObject);procedureBitBtn4Click(Sender:TObject);procedureBitBtn2Click(Sender:TObject);procedureBitBtn6Click(Sender:TObject);procedureBitBtn7Click(Sender:TObject);procedureN11Click(Sender:TObject);procedureN12Click(Sender:TObject);procedureN13Click(Sender:TObject);private{Privatedeclarations}public{Publicdeclarations}end;varForm1:TForm1;棋盤格子單位大小mBit:integer;棋子數(shù)組:所有棋子的數(shù)值mChess:array[1..14]ofstring=('車',' 馬',' 相',' 士',' 帥',' 炮',' 兵',' 車',' 馬',' 象',' 仕',' 將',' 炮',' 卒');//===============================棋子價(jià)值==============================//棋子的基礎(chǔ)價(jià)值m_BaseValue:array[1..14]ofinteger=(500,350,250,250,10000,370,100,500,350,250,250,10000,370,100);棋子靈活度基礎(chǔ)價(jià)值m_Flexible:array[1..14]ofinteger=(6,12,1,1,0,6,15,6,12,1,1,0,6,15);//每一個(gè)位置上的棋子的靈活性 即可走步數(shù)m_FlexibleNum:array[1..10,1..9]ofinteger;每一個(gè)位置被威脅的信息m_AttackNum:array[1..10,1..9]ofinteger;每一個(gè)位置被保護(hù)的信息m_GuardNum:array[1..10,1..9]ofinteger;每一個(gè)棋子是總價(jià)值m_ChessValue:array[1..10,1..9]ofinteger;紅兵附加值矩陣mBing:array[1..10,1..9]ofinteger=((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]ofinteger=((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));//===============================棋子價(jià)值==============================////棋盤兩邊的數(shù)表NumWord1:array[1..9]ofstring=('1','2','3','4','5','6','7','8','9');NumWord2:array[1..10]ofstring=('一',' 二',' 三',' 四',' 五','

六','

七','

八','

九','

十');NumWord3:array[1..14]ofinteger=//

擺子時(shí)盒子里剩余的棋子數(shù)量(2,2,2,2,1,2,5,2,2,2,2,1,2,5);//棋盤數(shù)組:記錄什么位置有什么棋子

有子地方為

mChess里面的數(shù)值,無子為

0ChessBoard:array[1..10,1..9]ofinteger;//電腦猜想時(shí)棋盤數(shù)組: 記錄什么位置有什么棋子

有子地方為

mChess里面的數(shù)值,無子為0nPosition:array[1..10,1..9]ofinteger;//自定義棋盤盒子數(shù)組ChessBox:array[1..2,1..7]ofinteger;定義導(dǎo)航點(diǎn)數(shù)組能走的坐標(biāo)點(diǎn)存在數(shù)組中值為1,不能走為0CMoveDrop:array[1..10,1..9]ofinteger;棋盤1拾子標(biāo)志(True表示已經(jīng)拾取一個(gè)棋子)mPickFlag:boolean;棋盤2拾子標(biāo)志(True表示已經(jīng)拾取一個(gè)棋子)mPickFlag2:boolean;//在paintbox1 拾起棋子的值mPickChess:integer;//在paintbox2 拾起的棋子值mPickChess2:integer;拾起棋子的行號mPickRow:integer;拾起棋子的列號mPickColumn:integer;最大價(jià)值棋子的行列MVCRow,MVCColumn:integer;走棋規(guī)則,允許落子標(biāo)志CanDropFlag:boolean;//鼠標(biāo)在Paintbox1 點(diǎn)中坐標(biāo)MouseRow,MouseColumn:integer;//鼠標(biāo)在paintbox2 點(diǎn)中的坐標(biāo)MouseR2,MouseC2:integer;定義到誰走棋WhoPlay:string;定義先手方FirstPlay:string;GameMode:integer;//定義游戲模式1:人人對弈2:人機(jī)對弈3:自定義棋局4:思考模式拾起棋子為哪一方1為紅方,0為黑方mPWhoPlay:string;判定是否移動棋子IsMove:boolean;勝利Win:boolean;走棋步數(shù)MCSteep:integer;總的走法數(shù)mMoveCount:integer;相關(guān)位置點(diǎn)的總數(shù)mPosCount:integer;調(diào)用估值函數(shù)的次數(shù)useEveluateCount:integer;搜索的最大深度mMaxDepth:integer;//Memo1當(dāng)前加上的最后一行MemoMaxLine:integer;type// 自定義記錄類型 用來記錄走棋記錄ChessRecord=recordChessBoard:array[1..10,1..9]ofinteger;Win:boolean;WhoPlay:string;end;varHistory:array[0..300]ofChessRecord;typeHaveNum=recordNumber:integer;end;varChessHaveNum:array[1..14]of HaveNum; // 自定義棋盤是擺起盒子里面剩余的棋子數(shù)typePoint=recordrow:integer;column:integer;end;varRelatePos:array[1..20]ofPoint; //typeMoveList=record// 走法列表FormR:integer;FormC:integer;ToR:integer;ToC:integer;

與一個(gè)棋子相關(guān)的位置end;varnMoveList:array[0..10,1..100]ofMoveList;nBestMove:MoveList;// 最佳走法implementation

//

走法列表end.implementation{$R*.dfm}procedureTForm1.FormCreate(Sender:TObject);vari,j:integer;begin設(shè)置棋盤格子單位大小,控制棋盤大小mBit:=50;// 建議在45~55之間 50 最佳//設(shè)置paintbox1 的大小 和位置paintbox1.Top:=65;paintbox1.Left:=10;paintbox1.Width:=10*mBit;paintbox1.Height:=11*mBit;設(shè)置label1的大小和位置label1.Width:=150;label1.Height:=37;label1.Left:=15*mBit+15;label1.Top:=15;設(shè)置label2的位置大小label2.Width:=115;label2.Height:=37;label2.Left:=13*mBit;label2.Top:=15;//設(shè)置label3 的位置label3.Left:=30;label3.Top:=15;初始化勝利提示label4.Caption:='';設(shè)置form1的大小和顏色form1.Width:=19*mBit;form1.Height:=14*mBit;初始化可走點(diǎn)fori:=1to10doforj:=1to9doCMoveDrop[i,j]:=0;初始化棋盤數(shù)組fori:=1to10doforj:=1to9dobeginChessBoard[i,j]:=0;nPosition[i,j]:=0;end;初始化先手FirstPlay:='';初始化游戲模式GameMode:=0;拾子標(biāo)志為falsemPickFlag:=false;能走棋標(biāo)志為falseCanDropFlag:=false;是否移動棋子為falseIsMove:=false;初始化走棋步數(shù)MCSteep:=0;初始化最大走法數(shù)mMoveCount:=0;初始化相關(guān)位置數(shù)mPosCount:=0;初始化游戲模式、先手方、電腦難度GameMode:=2;N7.Checked:=true;FirstPlay:=' 紅';N2.Checked:=true;mMaxDepth:=3;N12.Checked:=true;勝利標(biāo)志win:=false;end;procedureTForm1.PaintBox1Paint(Sender:TObject);vari,j:integer;beginlabel3.Caption:='

走棋步數(shù):第

'+inttostr(MCSteep)+'

步';//初始化勝利提示label4.Caption:='';label1.Font.Name:='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);// 棋盤外框fori:=1to9do //begin

棋盤邊的行標(biāo)和列標(biāo)paintbox1.Canvas.TextOut(i*mBit-3,10,NumWord1[i]);paintbox1.Canvas.TextOut(i*mBit-3,10*mBit+25,NumWord1[i]);end;fori:=1to10dobeginpaintbox1.Canvas.TextOut(10,i*mBit-5,NumWord2[i]);paintbox1.Canvas.TextOut(9*mBit+25,i*mBit-5,NumWord2[i]);end;paintbox1.Canvas.Font.Name:=' 宋體';paintbox1.Canvas.font.Size:=mBitdiv2;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);棋盤上面的橫向直線fori:=1to10dobeginpaintbox1.Canvas.MoveTo(mBit,i*mBit);paintbox1.Canvas.LineTo(9*mBit,i*mBit);end;棋盤上的縱向直線fori:=2to8dobeginpaintbox1.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;repeatCrossPaint(i*mBit,4*mBit,5,15);// 黑方兵格CrossPaint(i*mBit,7*mBit,5,15);// 紅方兵格i:=i+2;untili>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================================>fori:=1to10doforj:=1to9doifChessBoard[i,j]<>0thenbeginpaintbox1.Canvas.Brush.Color:=clBtnFace;畫出棋子ifChessBoard[i,j]<=7thenbeginpaintbox1.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.Name:='隸書';paintbox1.Canvas.Font.Color:=clred;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]);endelsebeginpaintbox1.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;paintbox1.Canvas.Font.Name:='隸書';paintbox1.Canvas.Font.Color:=clblack;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]);endend;//<=========================畫棋子end================================>end;procedureTForm1.FormPaint(Sender:TObject);// 游戲界面beginform1.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;procedureTForm1.NewGame1Click(Sender:TObject);vari,j:integer;beginif(FirstPlay<>'')and((GameMode=1)or(GameMode=2))thenbeginif(MessageDlg(' 確定要開始新游戲嗎? ',mtConfirmation,[mbYes,mbNo],0))=mrYesthenbeginGroupBox1.Visible:=false;// 隱藏GroupBox1Memo1.Lines.Clear;Memo1.Lines.Add(' 新游戲開始! ');MemoMaxLine:=Memo1.Lines.Add(' 由'+FirstPlay+' 先走棋!');拾子標(biāo)志為falsemPickFlag:=false;能走棋標(biāo)志為falseCanDropFlag:=false;勝利標(biāo)志win:=false;初始化走棋一方WhoPlay:=FirstPlay;if(WhoPlay='

紅')thenlabel1.Font.Color:=clred;if(WhoPlay='

黑')thenlabel1.Font.Color:=clblack;label1.Font.Name:=' 宋體';label1.Font.Size:=25;label1.Caption:=' 紅方走棋';初始化勝利提示label4.Caption:='';初始化走棋步數(shù)MCSteep:=0;label3.Caption:=' 走棋步數(shù):第 '+inttostr(MCSteep)+' 步';初始化棋盤數(shù)組fori:=1to10doforj:=1to9dobeginChessBoard[i,j]:=0;end;//(1' 車',2' 馬',3'',12' 將',13' 炮',14' 卒');

象',4'

士',5'

帥',6'

炮','7

兵',8'

車',9'

馬',10'

相',11'

仕設(shè)置黑方的棋子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;設(shè)置紅方的棋子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//

人機(jī)對弈模式由黑方先手beginFindAGoodMove();AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC);if(isMove=true)thenbeginRemHistory();// 記錄棋子移動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);// 棋子起走點(diǎn)標(biāo)記CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落點(diǎn)標(biāo)記isMove:=false;end;end;end;//if(MessageDlg(' 確定要開始新游戲嗎endelseMessageDlg(' 請?jiān)O(shè)置游戲模式! ',mtWarning,[mbOk],0);end;procedureTForm1.CrossPaint(x,y,i,j:integer);//begin

畫兵格過程ifx<>mBitthenbegin兵格坐標(biāo)左上部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);兵格坐標(biāo)左下部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;ifx<>9*mBitthenbegin兵格坐標(biāo)右上部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);兵格坐標(biāo)右下部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;procedureTForm1.Eixt1Click(Sender:TObject);beginif(MessageDlg(' 確定要退出游戲? ',mtConfirmation,[mbYes,mbNo],0))=mrYesthenclose;end;procedureTForm1.PaintBox1MouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);varrow,column:integer;// 鼠標(biāo)落點(diǎn)的行,列號Lcross:real;// 鼠標(biāo)落點(diǎn)到棋盤交叉點(diǎn)的距離i,j:integer;beginifGameMode=1then// 判斷游戲模式begin計(jì)算出鼠標(biāo)落下的行,列號row:=YdivmBit;ifYmodmBit>=(mBitdiv2)+1thenrow:=row+1;column:=xdivmBit;ifXmodmBit>=(mBitdiv2)+1thencolumn:=column+1;記錄鼠標(biāo)點(diǎn)下的坐標(biāo)MouseColumn:=column;MouseRow:=row;當(dāng)前鼠標(biāo)點(diǎn)中的棋子mPickChess:=ChessBoard[row,column];當(dāng)前選中棋子屬于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:=' 紅';// 紅方if(ChessBoard[row,column]>7)thenmPWhoPlay:=' 黑';// 黑方計(jì)算出鼠標(biāo)落點(diǎn)到棋盤交叉點(diǎn)的距離if(win=false)then// 判斷輸贏beginif(Button=mbLeft)thenbegin行號在(1~10),列號在(1~9)且鼠標(biāo)到棋盤交叉點(diǎn)的距離小于棋盤格子的一半if(row>=1)and(row<=10)and(column>=1)and(column<=9)and(Lcross<=(mBitdiv2))thenbeginif(mPickFlag=false)thenbeginif(ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay)thenbeginmPickChess:=ChessBoard[row,column];// 拾起棋子賦值拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);設(shè)置拾子標(biāo)志為truemPickFlag:=true;能走棋標(biāo)志為falseCanDropFlag:=false;掃描能走的點(diǎn)FindDrop(mPickRow,mPickColumn);畫出能走的點(diǎn)PaintCMoveDrop();end;// 選中棋子endelse// 可以下子begin調(diào)用ChessMove過程,移動棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then// 如果沒有移動beginrefresh();// 更新棋盤mPickFlag:=false;// 目標(biāo)點(diǎn)不合法更新棋盤// 繼續(xù)點(diǎn)自己的棋子 直接選中if(ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay)thenbeginmPickChess:=ChessBoard[row,column];// 拾起棋子賦值// 拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;// 拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);// 設(shè)置拾子標(biāo)志為 truemPickFlag:=true;// 能走棋標(biāo)志為 falseCanDropFlag:=false;// 掃描能走的點(diǎn)FindDrop(mPickRow,mPickColumn);// 畫出能走的點(diǎn)PaintCMoveDrop();end;end;if(IsMove=true)then// 目標(biāo)點(diǎn)合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);// 移動到目標(biāo)后該棋子可走點(diǎn)refresh();// 更新棋盤IsNextWin();// 判斷是否將軍WhoWin(); // 判斷輸贏if(Win=true)thenexit;if(WhoPlay=' 紅')then// 交換走棋方beginWhoPlay:=' 黑';label1.Font.Color:=clblack;endelsebeginWhoPlay:=' 紅';label1.Font.Color:=clred;end;label3.Caption:=' 走棋步數(shù):第 '+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);//

步';棋子起走點(diǎn)標(biāo)記棋子落點(diǎn)標(biāo)記IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;//if(GameMode=1)if(GameMode=2)then// 人機(jī)對弈beginif(WhoPlay='

紅')then//

紅方走棋begin計(jì)算出鼠標(biāo)落下的行,列號row:=YdivmBit;ifYmodmBit>=(mBitdiv2)+1thenrow:=row+1;column:=xdivmBit;ifXmodmBit>=(mBitdiv2)+1thencolumn:=column+1;記錄鼠標(biāo)點(diǎn)下的坐標(biāo)MouseColumn:=column;MouseRow:=row;當(dāng)前鼠標(biāo)點(diǎn)中的棋子mPickChess:=ChessBoard[row,column];當(dāng)前選中棋子屬于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:=' 紅';// 紅方if(ChessBoard[row,column]>7)thenmPWhoPlay:=' 黑';// 黑方計(jì)算出鼠標(biāo)落點(diǎn)到棋盤交叉點(diǎn)的距離Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(win=false)then// 判斷輸贏beginif(Button=mbLeft)thenbegin行號在(1~10),列號在(1~9)且鼠標(biāo)到棋盤交叉點(diǎn)的距離小于棋盤格子的一半if(row>=1)and(row<=10)and(column>=1)and(column<=9)and(Lcross<=(mBitdiv2))thenbeginif(mPickFlag=false)thenbeginif(ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay)thenbeginmPickChess:=ChessBoard[row,column];// 拾起棋子賦值拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);設(shè)置拾子標(biāo)志為truemPickFlag:=true;能走棋標(biāo)志為falseCanDropFlag:=false;掃描能走的點(diǎn)FindDrop(mPickRow,mPickColumn);畫出能走的點(diǎn)PaintCMoveDrop();end;// 選中棋子endelse// 可以下子begin調(diào)用ChessMove過程,移動棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then//

如果沒有移動beginrefresh();// 更新棋盤mPickFlag:=false;// 目標(biāo)點(diǎn)不合法更新棋盤// 繼續(xù)點(diǎn)自己的棋子 直接選中if(ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay)thenbeginmPickChess:=ChessBoard[row,column];// 拾起棋子賦值// 拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;// 拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);// 設(shè)置拾子標(biāo)志為 truemPickFlag:=true;// 能走棋標(biāo)志為 falseCanDropFlag:=false;// 掃描能走的點(diǎn)FindDrop(mPickRow,mPickColumn);// 畫出能走的點(diǎn)PaintCMoveDrop();end;end;if(IsMove=true)then// 目標(biāo)點(diǎn)合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);// 移動到目標(biāo)后該棋子可走點(diǎn)refresh();//IsNextWin();//WhoWin(); //

更新棋盤判斷是否將軍判斷輸贏if(Win=true)thenexit;//

交換走棋方WhoPlay:=' 黑';label1.Font.Color:=clblack;label3.Caption:='refresh();//

走棋步數(shù):第更新棋盤

'+inttostr(MCSteep)+'

步';RemHistory();// 記錄棋子移動paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);// 棋子起走點(diǎn)標(biāo)記CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);// 棋子落點(diǎn)標(biāo)記IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;// 紅方走棋if(WhoPlay=' 黑')then // 黑方走棋beginif(win=false)thenbeginFindAGoodMove(); // 尋找一個(gè)優(yōu)秀的走法AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC);if(isMove=true)thenbeginrefresh();IsNextWin();// 判斷是否將軍WhoWin();// 判斷輸贏if(Win=true)thenexit;WhoPlay:=' 紅';RemHistory();// 記錄棋子移動label1.Font.Color:=clred;refresh();paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);// 棋子起走點(diǎn)標(biāo)記CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);// 棋子落點(diǎn)標(biāo)記isMove:=false;end;end;//if(win=false)thenend;// 黑方走棋e(cuò)nd;// 人機(jī)對弈if(Win=true)thenshowmessage(WhoPlay+' 方已獲勝,本局結(jié)束,請重新開始! ');if(GameMode=3)then// 自定義棋盤模式begin計(jì)算出鼠標(biāo)落下的行,列號row:=YdivmBit;ifYmodmBit>=(mBitdiv2)+1thenrow:=row+1;column:=xdivmBit;ifXmodmBit>=(mBitdiv2)+1thencolumn:=column+1;記錄鼠標(biāo)點(diǎn)下的坐標(biāo)MouseColumn:=column;MouseRow:=row;當(dāng)前鼠標(biāo)點(diǎn)中的棋子mPickChess:=ChessBoard[row,column];當(dāng)前選中棋子屬于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:=' 紅';// 紅方if(ChessBoard[row,column]>7)thenmPWhoPlay:=' 黑';// 黑方計(jì)算出鼠標(biāo)落點(diǎn)到棋盤交叉點(diǎn)的距離Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(Button=mbLeft)thenbegin行號在(1~10),列號在(1~9)且鼠標(biāo)到棋盤交叉點(diǎn)的距離小于棋盤格子的一半if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBitthenbeginif(mPickFlag2=true)thenbeginif(CMoveDrop[row,column]=1)thenbeginif(ChessHaveNum[mPickChess2].Number<>0)then// 該子棋盒里面還有剩余begin

div2))Memo1.Lines.Add(mPWhoPlay+mChess[mPickChess2]+' 擺 在'+'('+inttostr(row)+','+inttostr(column)+')');ChessBoard[row,column]:=mPickChess2;擺子以后該子剩余:ChessHaveNum[mPickChess2].Number:=ChessHaveNum[mPickChess2].Number-1;mPickFlag2:=false;refresh();GroupBox1.Refresh();endelseshowmessage('棋盤里能擺的“'+mChess[mPickChess2]+'”已經(jīng)滿了!');endelse// 選中棋盒又點(diǎn)棋盤上不能擺子的地方beginmPickFlag2:=false;refresh();GroupBox1.Refresh();end;end;當(dāng)前沒有選中棋子mPickFlag2=falseif(mPickFlag2=false)and(mPickFlag=false)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickChess:=ChessBoard[row,column];// 拾起棋子賦值拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);mPickFlag:=true;exit;end;end;if(mPickFlag2=false)and(mPickFlag=true)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickFlag:=false;refresh();mPickChess:=ChessBoard[row,column];// 拾起棋子賦值拾起棋子的坐標(biāo)mPickRow:=row;mPickColumn:=column;拾起棋子標(biāo)志重畫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;paintbox1.Canvas.Font.Name:=' 華文楷體';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column]]);mPickFlag:=true;exit;end;end;end;end;end;//if(GameMode=3)thenend;//PaintBox1MouseDown//==================棋子走begin==================//functionTform1.ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean;vari,j:integer;// 循環(huán)變量begincasenChessIDof//------------------

車走法

begin--------------------------//1:beginif(ToC=NowC)then//

豎走beginif(ToR>NowR)then//

從上到下beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfori:=(NowR+1)to(ToR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;if(ToR<NowR)then// 從下到上beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfori:=(ToR+1)to(NowR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;end;if(ToR=NowR)then //

橫著走beginif(ToC>NowC)then //

從左到右beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfori:=(NowC+1)to(ToC-1)doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;if(ToC<NowC)then // 從右到左beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfori:=(ToC+1)to(NowC-1)doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;end;end;//------------------

車走法

end--------------------------////-------------------

馬走法

begin----------------------//2:begin馬走日子if((abs(ToC-NowC)+abs(ToR-NowR))=3)and(ToC<>NowC)and(ToR<>NowR)thenbegin豎日且無子當(dāng)馬腳if(abs(ToR-NowR)=2)and(ChessBoard[(NowR+ToR)div2,NowC]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;// 橫日 且無子當(dāng)馬腳if(abs(ToC-NowC)=2)and(ChessBoard[NowR,(NowC+ToC)div2]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;end;end;//-------------------

馬走法

end----------------------////-------------------

相走法

begin--------------------//3:begin相走田if(ToR>5)and(abs(ToR-NowR)=2)and(abs(ToC-NowC)=2)thenif(ChessBoard[(ToR+NowR)div2,(ToC+NowC)div2]=0)then// 田字格中間無子if(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then// 目標(biāo)點(diǎn)無子或不是己方CanDropFlag:=true;end;//-------------------

相走法

end--------------------////-------------------

士走法

begin------------------//4:beginif(ToR>=8)and(ToR<=10)and(ToC>=4)and(ToC<=6)then//在王的田字格if(ToR<>NowR)and(ToC<>NowC)and(abs(ToR-NowR)=1)and(abs(ToC-NowC)=1)then//走斜線if(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then// 目標(biāo)點(diǎn)無子或不是己方CanDropFlag:=true;end;//-------------------

士走法

end------------------////-------------------

帥走法

begin----------------//5:beginif(ToR>=8)and(ToR<=10)and(ToC>=4)and(ToC<=6)thenbeginif(abs(ToR-NowR)+abs(ToC-NowC))=1then//當(dāng)前點(diǎn)到目標(biāo)點(diǎn)的距離是否為一if(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;end;if(ChessBoard[ToR,ToC]=12)and(NowC=ToC)thenbeginfori:=(ToR+1)to(NowR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;//-------------------//-------------------

帥走法end----------------//炮的走法 begin-------------//6:beginif(ToC=NowC)then//

豎走beginif(ToR>NowR)then//

從上到下beginj:=0;for i:=(NowR+1) to(ToR-1) doif(ChessBoard[i,NowC]<>0)thenj:=j+1;if(j=0)and(ChessBoard[ToR,ToC]=0)then//CanDropFlag:=true;if(j=1)and(ChessBoard[ToR,ToC]>7)then//CanDropFlag:=true;end;if(ToR<NowR)then// 從下到上beginj:=0;for i:=(ToR+1) to (NowR-1)doif(ChessBoard[i,NowC]<>0)thenj:=j+1;if(j=0)and(ChessBoard[ToR,ToC]=0)then//CanDropFlag:=true;if(j=1)and(ChessBoard[ToR,ToC]>7)then//CanDropFlag:=true;end;end;if(ToR=NowR)then // 橫著走beginif(ToC>NowC)then // 從左到右beginj:=0;

////

循環(huán)計(jì)算當(dāng)前點(diǎn)到目標(biāo)點(diǎn)之間有幾顆棋子無棋子有一顆棋子并且目標(biāo)點(diǎn)的棋子為敵方循環(huán)計(jì)算當(dāng)前點(diǎn)到目標(biāo)點(diǎn)之間有幾顆棋子無棋子并且目標(biāo)點(diǎn)為空有一顆棋子并且目標(biāo)點(diǎn)的棋子為敵方fori:=(NowC+1)to(ToC-1)do //if(ChessBoard[NowR,i]<>0)thenj:=j+1;if(j=0)and(ChessBoard[ToR,ToC]=0)then//CanDropFlag:=true;if(j=1)and(ChessBoard[ToR,ToC]>7)then//CanDropFlag:=true;end;if(ToC<NowC)then // 從右到左beginj:=0;fori:=(ToC+1)to(NowC-1)do //if(ChessBoard[NowR,i]<>0)thenj:=j+1;if(j=0)and(ChessBoard[ToR,ToC]=0)then//CanDropFlag:=true;if(j=1)and(ChessBoard[ToR,ToC]>7)then//

循環(huán)計(jì)算當(dāng)前點(diǎn)到目標(biāo)點(diǎn)之間有幾顆棋子無棋子并且目標(biāo)點(diǎn)為空有一顆棋子并且目標(biāo)點(diǎn)的棋子為敵方循環(huán)計(jì)算當(dāng)前點(diǎn)到目標(biāo)點(diǎn)之間有幾顆棋子無棋子并且目標(biāo)點(diǎn)為空有一顆棋子并且目標(biāo)點(diǎn)的棋子為敵方CanDropFlag:=true;end;end;end;//-------------------

炮的走法

end-------------////------------------

兵走法

begin---------------------//7:beginif(NowR>5)and(NowC=ToC)and(ToR=NowR-1)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;if(NowR<=5)thenif((NowC=ToC)and(ToR=NowR-1))or((NowR=ToR)and(ToC=NowC+1))or((NowR=ToR)and(ToC=NowC-1))thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;end;//-------------------

兵走法

end-----------------------////------------------

車走法

begin--------------------------//8:beginif(ToC=NowC)then//

豎走beginif(ToR>NowR)then//

從下到上beginif(ChessBoard[ToR,ToC]<=7)thenbeginfori:=(NowR+1)to(ToR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;if(ToR<NowR)then// 從上到下beginif(ChessBoard[ToR,ToC]<=7)thenbeginfori:=(ToR+1)to(No

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論