1、JAVA中国象棋游戏设计 佛山科学技术学院可视化编程技术课程设计报告中国象棋游戏设计* * * 学 号: *年级专业:12级教育技术学2* *学 院: 教育科学学院广东佛山提交日期:2014年6月1. 前言22概要设计2 2.1 开发环境 2 2.2 象棋功能 2 2.3 界面设计 33. 详细设计 4 3.1 象棋面板的java类的说明 44. 运行结果86. 源程序24设计总结321 前言随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单有趣的中国象棋游戏,可以
2、实现简单的中国象棋游戏功能,满足日常益智娱乐需要。Java是由Sun公司开发的新一代纯面向对象的网络编程语言。其目标是建立一种在任意种机器、任一种操作系统的网络环境中运行的软件,实行所谓的“程序写一次,到处运行”的目标。正因为如此,Java已成为当今Internet上最流行、最受欢迎的一种程序开发语言。Java开发小组把Java按特性分为基本版、移动版、企业版,每个版本有一个软件开发包。Java基本版本叫Java 2标准版(Java 2 Standard Edition,J2SE),它包含建立Java应用程序或者是Applet所需的应用程序编程接口(API)。Java 2移动版(The Jav
3、a 2 Mobile Edition,J2ME)包含创建无线Java应用程序的API。还有Java 2企业版(The Java 2 Enterprise,J2EE)是J2SE的增强版本,包含建立多层架构应用程序API。Java语言是由C+语言发展起而来的,是一种彻底的面向对象的程序设计语言。作为一种纯面向对象的程序设计语言,它非常适合大型软件的开发。Java语言去掉了C+语言的一些容易引起错误的特性。Java语言的特点有:面向对象、跨平台、安全性、多线程和图形功能强。关键字:Java象棋游戏,游戏类,中国象棋游戏2 概要设计2.1开发环境 开发平台:Microsoft Windows XP P
4、rofessional Service Pack 2 开发工具:JBuilder 2007 + JDK 1.6.0_022.2象棋功能功能 1:下棋,游戏开始后通过鼠标点击对棋子进行移动。 功能 2:悔棋,通过back键可以后退一次最近的操作 功能 3:存档,对当前的棋局进行保存 功能 4:读档,可以继承之前保存的记录,继续进行游戏 功能 5:可以设置进行不同模式的对战,可进行双人单机,网络对战,人机对战功能 6:翻转棋盘,可以使红黑双方对调2.3界面设计图2.3 象棋面板3详细设计3.1象棋面板使用的Java类的说明package org.acerge.engine;import java.
5、io.Serializable;import java.util.ArrayList;public class ActiveBoard implements Serializable /Rankx,Filex,Bottomx 比 x % 10,x / 10,x * 10运算快 public static final int RANK = / File19=1,Rank19=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
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 ; public static final int FILE = / File12=1,Rank12=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,
7、 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 ; public static final int BOTTOM = 0, 10, 20, 30, 40, 50, 60, 70, 80 ; public static final int HORSE_LEG_TABLE = /int
8、 -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 /HorseLegDst-Src+21=-10,-10,-1,1,-1,1,10,10:蹩马腿的增量 /Legal Move: return SquaresMove.Src + HorseLegTabMove.Dst - Move.S
9、rc + 21=0 ; public static final int 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 ; public final static int MAX_MOVE_NUM = 256; public final static int LOOP_HASH_
10、MASK = 0x3ff; public final static int MAX_CONSECUTIVE_MOVES = 200; private int player; / 0 = Red(White) and 1 = Black private int evalue;/int2Total Value of Red(0)/Black(1) Pieces private int squares;/int90Piece Indexes of each square, Squaresi = 0:Unoccupied, 16-31:Red, 32-47 = Black private int pi
11、eces;/int48Square Indexes of each piece, -1 = Captured/被吃了 / Squarex=y(y: index of PieceTypes in Squarex), / Piecesy=x(y is the pieceType, x represent pieceType Y in Square 5), / x:index of location in board(089) private int bitFiles;/9方便按行位纵线查询BitFiles1表示第1列(b纵线)上的棋子 private int bitRanks;/10方便按列位横线
12、查询 private BitBoard pieceBits;/14分兵种及红黑的棋子位棋盘 private BitBoard allPieces;/整个棋盘 / Zobrist Key and Lock private long zobristKey, zobristLock; / History MoveNodes,用来作为循环重复检测 private int moveNum; MoveNode moveList;/ChessStruct.MaxMoveNum; char loopHash;/LoopHashMask + 1; public ActiveBoard() int i; play
13、er = 0; evalue = new int2; evalue0 = evalue1 = 0; squares = new int90; for (i = 0; i 90; i +) squaresi = 0; pieces = new int48; for (i = 16; i 48; i +) piecesi = -1; bitFiles = new int9; for (i = 0; i 9; i +) bitFilesi = 0; bitRanks = new int10; for (i = 0; i 10; i +) bitRanksi = 0; pieceBits = new
14、BitBoard14; for (i = 0; i 14; i +) pieceBitsi = new BitBoard(0); allPieces = new BitBoard(0); zobristKey = zobristLock = 0; moveNum = 1; moveList = new MoveNodeMAX_MOVE_NUM; for (i = 0;i MAX_MOVE_NUM;i+) moveListi=new MoveNode(); loopHash=new charLOOP_HASH_MASK+1; for (i = 0; i 00010010 or 00100010:
15、其他棋子 Captured = squaresMove.dst & 0xf; if (Captured 10) Captured = RANKMove.dst; return (player!=0) ? (Captured = 5) : (Captured 4; public MoveNode lastMove() return moveListmoveNum - 1; public int evaluation() return evalueplayer - evalue1 - player; private void changePiece(int Square, int Piece) c
16、hangePiece(Square,Piece,false); private void changePiece(int Square, int Piece, boolean IsAdd) int x, y, PieceType, Side, Value; allPieces.assignXor(PreMoveNodesGen.BitMaskSquare); x = FILESquare; y = RANKSquare; bitFilesx = 1 y; bitRanksy = 1 x; PieceType = PIECE_TYPESPiece; pieceBitsPieceType.assi
17、gnXor(PreMoveNodesGen.BitMaskSquare); zobristKey = PreMoveNodesGen.ZobristKeyTablePieceTypeSquare; zobristLock = PreMoveNodesGen.ZobristLockTablePieceTypeSquare; if (PieceType 7) Side = 0; Value = CCEvalue.BasicValuesPieceType + CCEvalue.PosValuesPieceTypeSquare; else Side = 1; Value = CCEvalue.Basi
18、cValuesPieceType - 7 + CCEvalue.PosValuesPieceType - 789 - Square; if (IsAdd) evalueSide += Value; else evalueSide -= Value; public boolean movePiece(MoveNode Move) int Moved, Captured; MoveNode ThisMove; long OldZobristKey; if (Move.src0 | Move.dst0) return false;/add for search function OldZobrist
19、Key = zobristKey; Moved = squaresMove.src; Captured = squaresMove.dst; if (Captured!=0) clearSquare(Move.dst); clearSquare(Move.src); setPiece(Move.dst, Moved); if (checked(player) Moved = squaresMove.dst; clearSquare(Move.dst); setPiece(Move.src, Moved); if (Captured!=0) setPiece(Move.dst, Captured
20、); return false; 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); moveListmoveNum = ThisMove; moveNum +; return true; public void undoMov
21、e() int Moved; MoveNode ThisMove; moveNum -; ThisMove = moveListmoveNum; Moved = squaresThisMove.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
22、(int) (zobristKey & LOOP_HASH_MASK) = 0; / Leagal Move Detection Procedures public boolean leagalMove(MoveNode Move) int Piece, Attack, x, y, BitWord; Piece = squaresMove.src; if (Piece & (player!=0 ? 32 : 16)=0) return false;/所选的棋子是否是当前Player的 Attack = squaresMove.dst; if (Attack & (player!=0 ? 32
23、: 16)!=0) return false;/所吃的棋子是否是对方的 switch (PIECE_TYPESPiece - (player!=0 ? 7 : 0) case 5:/炮,吃子时中间要有炮架 x = FILEMove.src; y = RANKMove.src; if (x = FILEMove.dst) /进退 BitWord = bitFilesx; if (Move.src Move.dst) /进 if (Attack & (player!=0 ? 16 : 32)!=0) /吃子 return Move.dst = PreMoveNodesGen.FileCannonCapMaxyBitWord + BOTTOMx; else /不吃子 return Move.dst Move.Dst,退 if (Attack & (player!=0 ? 16 : 32)!=0) return Move.dst = PreMoveNodesGen.FileCannonCapMinyBitWord + BOTTOMx; else return Move.dst = PreM
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1