JAVA中国象棋游戏设计.docx
- 文档编号:8020193
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:33
- 大小:185.42KB
JAVA中国象棋游戏设计.docx
《JAVA中国象棋游戏设计.docx》由会员分享,可在线阅读,更多相关《JAVA中国象棋游戏设计.docx(33页珍藏版)》请在冰豆网上搜索。
JAVA中国象棋游戏设计
佛山科学技术学院
《可视化编程技术》课程设计报告
中国象棋游戏设计
******
学号:
**********
年级专业:
12级教育技术学2
*******
学院:
教育科学学院
广东★佛山
提交日期:
2014年6月
1.前言………………………………………………………………………………2
2.概要设计…………………………………………………………………………2
2.1开发环境……………………………………………………………………2
2.2象棋功能……………………………………………………………………2
2.3界面设计……………………………………………………………………3
3.详细设计………………………………………………………………………4
3.1象棋面板的java类的说明………………………………………………4
4.运行结果…………………………………………………………………………8
6.源程序…………………………………………………………………………24
设计总结……………………………………………………………………………32
1前言
随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。
文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单有趣的中国象棋游戏,可以实现简单的中国象棋游戏功能,满足日常益智娱乐需要。
Java是由Sun公司开发的新一代纯面向对象的网络编程语言。
其目标是建立一种在任意种机器、任一种操作系统的网络环境中运行的软件,实行所谓的“程序写一次,到处运行”的目标。
正因为如此,Java已成为当今Internet上最流行、最受欢迎的一种程序开发语言。
Java开发小组把Java按特性分为基本版、移动版、企业版,每个版本有一个软件开发包。
Java基本版本叫Java2标准版(Java2StandardEdition,J2SE),它包含建立Java应用程序或者是Applet所需的应用程序编程接口(API)。
Java2移动版(TheJava2MobileEdition,J2ME)包含创建无线Java应用程序的API。
还有Java2企业版(TheJava2Enterprise,J2EE)是J2SE的增强版本,包含建立多层架构应用程序API。
Java语言是由C++语言发展起而来的,是一种彻底的面向对象的程序设计语言。
作为一种纯面向对象的程序设计语言,它非常适合大型软件的开发。
Java语言去掉了C++语言的一些容易引起错误的特性。
Java语言的特点有:
面向对象、跨平台、安全性、多线程和图形功能强。
关键字:
Java象棋游戏,游戏类,中国象棋游戏
2概要设计
2.1开发环境
开发平台:
MicrosoftWindowsXPProfessionalServicePack2
开发工具:
JBuilder2007+JDK1.6.0_02
2.2象棋功能
功能1:
下棋,游戏开始后通过鼠标点击对棋子进行移动。
功能2:
悔棋,通过back键可以后退一次最近的操作
功能3:
存档,对当前的棋局进行保存
功能4:
读档,可以继承之前保存的记录,继续进行游戏
功能5:
可以设置进行不同模式的对战,可进行双人单机,网络对战,人机对战
功能6:
翻转棋盘,可以使红黑双方对调
2.3界面设计
图2.3象棋面板
3详细设计
3.1象棋面板使用的Java类的说明
packageorg.acerge.engine;
importjava.io.Serializable;
importjava.util.ArrayList;
publicclassActiveBoardimplementsSerializable{
//Rank[x],File[x],Bottom[x]比x%10,x/10,x*10运算快
publicstaticfinalint[]RANK={//File[19]=1,Rank[19]=9;
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9
};
publicstaticfinalintFILE[]={//File[12]=1,Rank[12]=2;
0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,8,8
};
publicstaticfinalint[]BOTTOM={
0,10,20,30,40,50,60,70,80
};
publicstaticfinalint[]HORSE_LEG_TABLE={//int
-10,0,-10,0,0,0,0,0,0,-1,0,
0,0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,-1,0,0,0,
1,0,0,0,0,0,0,10,0,10
//Move.Dst-Move.Src={-21,-19,-12,-8,8,12,19,21}
//HorseLeg[Dst-Src+21]={-10,-10,-1,1,-1,,1,10,10}:
蹩马腿的增量
//LegalMove:
returnSquares[Move.Src+HorseLegTab[Move.Dst-Move.Src+21]]==0
};
publicstaticfinalint[]PIECE_TYPES={
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6,
7,8,8,9,9,10,10,11,11,12,12,13,13,13,13,13
};
publicfinalstaticintMAX_MOVE_NUM=256;
publicfinalstaticintLOOP_HASH_MASK=0x3ff;
publicfinalstaticintMAX_CONSECUTIVE_MOVES=200;
privateintplayer;//0=Red(White)and1=Black
privateint[]evalue;//int[2]TotalValueofRed(0)/Black
(1)Pieces
privateint[]squares;//int[90]PieceIndexesofeachsquare,Squares[i]=0:
Unoccupied,16-31:
Red,32-47=Black
privateint[]pieces;//int[48]SquareIndexesofeachpiece,-1=Captured//被吃了
//Square[x]=y(y:
indexofPieceTypesinSquare[x]),
//Pieces[y]=x(yisthepieceType,xrepresentpieceTypeYinSquare5),
//x:
indexoflocationinboard(0~89)
privateint[]bitFiles;//[9]方便按行位纵线查询BitFiles[1]表示第1列(b纵线)上的棋子
privateint[]bitRanks;//[10]方便按列位横线查询
privateBitBoard[]pieceBits;//[14]分兵种及红黑的棋子位棋盘
privateBitBoardallPieces;//整个棋盘
//ZobristKeyandLock
privatelongzobristKey,zobristLock;
//HistoryMoveNodes,用来作为循环重复检测
privateintmoveNum;
MoveNode[]moveList;//[ChessStruct.MaxMoveNum];
char[]loopHash;//[LoopHashMask+1];
publicActiveBoard(){
inti;
player=0;
evalue=newint[2];
evalue[0]=evalue[1]=0;
squares=newint[90];
for(i=0;i<90;i++){
squares[i]=0;
}
pieces=newint[48];
for(i=16;i<48;i++){
pieces[i]=-1;
}
bitFiles=newint[9];
for(i=0;i<9;i++){
bitFiles[i]=0;
}
bitRanks=newint[10];
for(i=0;i<10;i++){
bitRanks[i]=0;
}
pieceBits=newBitBoard[14];
for(i=0;i<14;i++){
pieceBits[i]=newBitBoard(0);
}
allPieces=newBitBoard(0);
zobristKey=zobristLock=0;
moveNum=1;
moveList=newMoveNode[MAX_MOVE_NUM];
for(i=0;i moveList[i]=newMoveNode(); } loopHash=newchar[LOOP_HASH_MASK+1]; for(i=0;i loopHash[i]=0; } } privatevoidchangeSide(){ player=1-player; zobristKey^=PreMoveNodesGen.ZobristKeyPlayer; zobristLock^=PreMoveNodesGen.ZobristLockPlayer; } privatevoidclearSquare(intSquare){ intPiece; Piece=squares[Square]; squares[Square]=0; pieces[Piece]=-1; changePiece(Square,Piece); } privatevoidclearPiece(intPiece){ intSquare; Square=pieces[Piece]; squares[Square]=0; pieces[Piece]=-1; changePiece(Square,Piece); } privatevoidsetPiece(intSquare,intPiece){ squares[Square]=Piece; pieces[Piece]=Square; changePiece(Square,Piece,true); } publicvoidnullMove(){ MoveNodeThisMove=newMoveNode(); changeSide(); ThisMove.src=ThisMove.dst=ThisMove.cap=-1; ThisMove.chk=false; moveList[moveNum]=ThisMove; moveNum++; } publicvoidundoNull(){ moveNum--; changeSide(); } //MoveDetectionProcedures publicbooleannarrowCap(MoveNodeMove){ returnnarrowCap(Move,false); } publicbooleannarrowCap(MoveNodeMove,booleanAdvisorBishop){//是否吃子 intCaptured; //Move.Dst=00010001or00010010: red仕相 //Move.Dst=00100010or00100010: black士象 //>00010010or>00100010: 其他棋子 Captured=squares[Move.dst]&0xf; if(Captured>10){ Captured=RANK[Move.dst]; return(player! =0)? (Captured>=5): (Captured<=4); }else{ returnAdvisorBishop||Captured>4; } } publicMoveNodelastMove(){ returnmoveList[moveNum-1]; } publicintevaluation(){ returnevalue[player]-evalue[1-player]; } privatevoidchangePiece(intSquare,intPiece){ changePiece(Square,Piece,false); } privatevoidchangePiece(intSquare,intPiece,booleanIsAdd){ intx,y,PieceType,Side,Value; allPieces.assignXor(PreMoveNodesGen.BitMask[Square]); x=FILE[Square]; y=RANK[Square]; bitFiles[x]^=1< bitRanks[y]^=1< PieceType=PIECE_TYPES[Piece]; pieceBits[PieceType].assignXor(PreMoveNodesGen.BitMask[Square]); zobristKey^=PreMoveNodesGen.ZobristKeyTable[PieceType][Square]; zobristLock^=PreMoveNodesGen.ZobristLockTable[PieceType][Square]; if(PieceType<7){ Side=0; Value=CCEvalue.BasicValues[PieceType]+CCEvalue.PosValues[PieceType][Square]; }else{ Side=1; Value=CCEvalue.BasicValues[PieceType-7]+CCEvalue.PosValues[PieceType-7][89-Square]; } if(IsAdd){ evalue[Side]+=Value; }else{ evalue[Side]-=Value; } } publicbooleanmovePiece(MoveNodeMove){ intMoved,Captured; MoveNodeThisMove; longOldZobristKey; if(Move.src<0||Move.dst<0)returnfalse;//addforsearchfunction OldZobristKey=zobristKey; Moved=squares[Move.src]; Captured=squares[Move.dst]; if(Captured! =0){ clearSquare(Move.dst); } clearSquare(Move.src); setPiece(Move.dst,Moved); if(checked(player)){ Moved=squares[Move.dst]; clearSquare(Move.dst); setPiece(Move.src,Moved); if(Captured! =0){ setPiece(Move.dst,Captured); } returnfalse; }else{ if(loopHash[(int)(OldZobristKey&LOOP_HASH_MASK)]==0){ loopHash[(int)(OldZobristKey&LOOP_HASH_MASK)]=(char)moveNum; } changeSide(); ThisMove=Move; ThisMove.cap=Captured; ThisMove.chk=checked(player); moveList[moveNum]=ThisMove; moveNum++; returntrue; } } publicvoidundoMove(){ intMoved; MoveNodeThisMove; moveNum--; ThisMove=moveList[moveNum]; Moved=squares[ThisMove.dst]; clearSquare(ThisMove.dst); setPiece(ThisMove.src,Moved); if(ThisMove.cap! =0){ setPiece(ThisMove.dst,ThisMove.cap); } changeSide(); if(loopHash[(int)(zobristKey&LOOP_HASH_MASK)]==moveNum){ loopHash[(int)(zobristKey&LOOP_HASH_MASK)]=0; } } //LeagalMoveDetectionProcedures publicbooleanleagalMove(MoveNodeMove){ intPiece,Attack,x,y,BitWord; Piece=squares[Move.src]; if((Piece&(player! =0? 32: 16))==0){ returnfalse;//所选的棋子是否是当前Player的 } Attack=squares[Move.dst]; if((Attack&(player! =0? 32: 16))! =0){ returnfalse;//所吃的棋子是否是对方的 } switch(PIECE_TYPES[Piece]-(player! =0? 7: 0)){ case5: //炮,吃子时中间要有炮架 x=FILE[Move.src]; y=RANK[Move.src]; if(x==FILE[Move.dst]){//进退 BitWord=bitFiles[x]; if(Move.src if((Attack&(player! =0? 16: 32))! =0){//吃子 returnMove.dst==PreMoveNodesGen.FileCannonCapMax[y][BitWord]+BOTTOM[x]; }else{//不吃子 returnMove.dst<=PreMoveNodesGen.FileNonCapMax[y][BitWord]+BOTTOM[x]; } }else{//Move.Src>Move.Dst,退 if((Attack&(player! =0? 16: 32))! =0){ returnMove.dst==PreMoveNodesGen.FileCannonCapMin[y][BitWord]+BOTTOM[x]; }else{ returnMove.dst>=PreM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 中国象棋 游戏 设计