佛山科学技术学院《可视化编程技术》课程设计报告中国象棋游戏设计学生姓名:柯智学号:2012914231年级专业:12级教育技术学2指导老师:容汝佳学院:教育科学学院广东★佛山提交日期:2014年6月1目录1.前言………………………………………………………………………………22.概要设计…………………………………………………………………………22.1开发环境……………………………………………………………………22.2象棋功能……………………………………………………………………22.3界面设计……………………………………………………………………33.详细设计………………………………………………………………………43.1象棋面板的JAVA类的说明………………………………………………44.运行结果…………………………………………………………………………86.源程序…………………………………………………………………………24设计总结……………………………………………………………………………3221前言随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。文本编辑器是个人计算机最司空见惯的应用程序了,在学习了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_022.2象棋功能3功能1:下棋,游戏开始后通过鼠标点击对棋子进行移动。功能2:悔棋,通过back键可以后退一次最近的操作功能3:存档,对当前的棋局进行保存功能4:读档,可以继承之前保存的记录,继续进行游戏功能5:可以设置进行不同模式的对战,可进行双人单机,网络对战,人机对战功能6:翻转棋盘,可以使红黑双方对调2.3界面设计图2.3象棋面板43详细设计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,85};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=Blackprivateint[]evalue;//int[2]TotalValueofRed(0)/Black(1)Piecesprivateint[]squares;//int[90]PieceIndexesofeachsquare,Squares[i]=0:Unoccupied,16-31:Red,32-47=Blackprivateint[]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纵线)上的棋子6privateint[]bitRanks;//[10]方便按列位横线查询privateBitBoard[]pieceBits;//[14]分兵种及红黑的棋子位棋盘privateBitBoardallPieces;//整个棋盘//ZobristKeyandLockprivatelongzobristKey,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;i90;i++){squares[i]=0;}pieces=newint[48];for(i=16;i48;i++){pieces[i]=-1;}bitFiles=newint[9];for(i=0;i9;i++){bitFiles[i]=0;}bitRanks=newint[10];for(i=0;i10;i++){bitRanks[i]=0;}pieceBits=newBitBoard[14];for(i=0;i14;i++){pieceBits[i]=newBitBoard(0);}7allPieces=newBitBoard(0);zobristKey=zobristLock=0;moveNum=1;moveList=newMoveNode[MAX_MOVE_NUM];for(i=0;iMAX_MOVE_NUM;i++){moveList[i]=newMoveNode();}loopHash=newchar[LOOP_HASH_MASK+1];for(i=0;iLOOP_HASH_MASK+1;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(){8MoveNodeThisMove=newMoveNode();changeSide();ThisMove.src=ThisMove.dst=ThisMove.cap=-1;ThisMove.chk=false;moveList[moveNum]=ThisMove;moveNum++;}publicvoidundoNull(){moveNum--;changeSide();}//MoveDetectionProcedurespublicbooleannarrowCap(MoveNodeMove){returnnarrowCap(Move,false);}publicbooleannarrowCap(MoveNodeMove,booleanAdvisorBishop){//是否吃子intCaptured;//Move.Dst=00010001or00010010:red仕相//Move.Dst=00100010or00100010:black士象//00010010or00100010:其他棋子Captu