中国象棋java大作业doc_《java语言程序设计》课程设计-中国象棋对弈系统(源码).doc...

253b171540df25e1b84436cbe50dfc72.gif《java语言程序设计》课程设计-中国象棋对弈系统(源码).doc

数学与应用数学专业 Java 课程设计报告 1 作者简介王、男、河北沧州人java 语言程序设计课程设计姓 名 王 学 号 指导教师 班 级 所在院系 中国象棋对弈系统2 作者简介王、男、河北沧州人 Java 语言程序设计实验报告实验项目名称中国象棋对弈系统作者姓名与单位王浩 数学与应用数学专业 数学 081 班摘要本文主要是运用 java 实现具有一定功能的中国象棋对弈系统软件,主要功能如下a、 象棋对弈红方先走,然后黑方再走,红黑交替,直到一方获胜。b、新游戏任何时候可以重新开始一盘新的对弈。c、 悔棋当走错棋的时候可以悔棋。d、信息提示提示当前信息状态。e、 简单的帮助文档象棋规则介绍、软件的简单介绍和编制说明关键词java、中国象棋对弈系统 数学与应用数学专业 Java 课程设计报告 3 作者简介王、男、河北沧州人正文一 程序设计说明1.1 程序的设计及实现本系统主要有以下 4 个模块,每个模块对应一个程序包1、engine搜索引擎包,系统的核心部分。2、message网络对战过程中各种消息及其传递机制的类实现包。3、main主界面实现包。4、pieces 棋子及其相关类实现包。现就各个包中的要点给与说明。1.1.1 搜索引擎的实现(engine 包)1 BitBoard.java位棋盘的实现,见 2.4 节。2 CCue.java评价函数知识类。本程序使用开源软件“梦入神蛋”的快速评价函数。该函数包含子力价值和棋子所在位置的奖励值。子力价值分别是帅-0, 仕- 40, 象-40, 马-88, 车-200, 炮-96, 兵-9。帅是无价的,用 0 表示。以马为例,位置的奖励值如下0, -3, 5, 4, 2, 2, 5, 4, 2, 2,-3, 2, 4, 6,10,12,20,10, 8, 2,2, 4, 6,10,13,11,12,11,15, 2,0, 5, 7, 7,14,15,19,15, 9, 8,2,-10 , 4,10,15,16,12,11, 6, 2,0, 5, 7, 7,14,15,19,15, 9, 8,2, 4, 6,10,13,11,12,11,15, 2,-3, 2, 4, 6,10,12,20,10, 8, 2,0, -3, 5, 4, 2, 2, 5, 4, 2, 2 上面的每行代表棋盘的一条纵线。其中,-10 所在的位置是“窝心马”,所以要罚 10 分。3 ChessPosition.java动态局面类包含对局过程中的动态信息,主要实现的是 2.4 节的各类位棋盘和移子函数。4 MoveStruct.java着法表示类。中国象棋对弈系统4 作者简介王、男、河北沧州人 5 PreMove.java伪合法着法生成模块,见 4.1。6 MoveSortStruct.java合法着法的生成及其排序算法,见 4.2。7 SearchMove.java搜索算法,实现如下功能1主置换表及开局库2Alpha-Beta 搜索算法3针对吃子着法的静态搜索算法4适应性空着裁剪算法见 5.5.2,根据不同情况来调整 R 值的做法,称为“适应性空着裁剪”Adaptive Null-Move Pruning,它首先由 Ernst Heinz 发表在 1999 年的 ICCA 杂志上。其内容可以概括为a. 深度小于或等于 6 时,用 R 2 的空着裁剪进行搜索b. 深度大于 8 时,用 R 3; c. 深度是 6 或 7 时,如果每方棋子都大于或等于 3 个,则用 R 3,否则用 R 2。5带时间控制的迭代加深搜索算法每次加深搜索都判断时间是否够用。6“将军 ”扩展(加深)搜索算法当搜索到己方被“将”时,增加搜索的深度。7主要变例搜索算法1.1.2 信息传输机制(message 包)在对弈过程中(主要是网络对弈)需要在对弈双方之间传输各类信息,抽象为各类消息。如时间规则的协定、各方的走子信息等。每方都有消息接收、消息处理和消息发送程序(OuterMsgReceiver、LocalMsgReceiver ,QzMessageHandler,MessageSender)。己方的 MessageSender 与对方的 OuterMsgReceiver 通过接口 SrConnection 连接。所有接收的消息放入消息队列 QzMsgQueue 中,等待消息处理进程QzMessageHandler 来处理。所有的消息都封装在 QzMessage 类对象中,消息的类型通过消息的 Header 类型(以静态常量存放在 MsgHeader 类中)来区分。1.1.3 棋子(pieces 包)Qizi.java 包含棋子的信息,如棋子的(在棋盘上的)位置、图片、名称、类型、状态等。PiecesFactory.java 以“工厂”模式提供根据棋子类型或其他信息生成相关 Qizi 对象的方法。1.2 主控模块(main 包)实现了程序界面与消息传递、搜索引擎的集成。数学与应用数学专业 Java 课程设计报告 5 作者简介王、男、河北沧州人1 NewBoard.java棋盘坐标系统及其界面的实现。2 CChessApp.java主界面类,以内部类实现了 QzMessageHandler 接口、计时规则 TimeRule 接口以及事件的处理程序,根据需要生成其他的并发线程如消息接收、处理和发送,机器思考(启动搜索引擎),计时显示等。3 SetRuleDialog.java设置规则的对话框。4 SetSysInfoDialog.java设置系统的一些属性如对战模式、连接端口等。5 Translation.java提供了一系列实用方法主要有1FEN 串与局面 ChessPosition 对象之间的转换2不同着法表示(见第一章)之间的转换。如“炮二平五”与“Ch2-e2”及“62.5 或 C2.5“C 和 6 代表炮这几种表示法之间的转换3棋谱文件的读入和存储。4开局库的生成将近年实战的棋谱文件(可能有几种格式)整理生成开局库。中国象棋对弈系统6 作者简介王、男、河北沧州人 2、运行结果数学与应用数学专业 Java 课程设计报告 7 作者简介王、男、河北沧州人3、设计体会本 次 课 程 设 计 主 要 是 运 用 本 学 期 所 学 到 的 Java 基 础 知 识 来 设 计 一 个 符合 要 求 的 中 国 象 棋 对 弈 系 统 , 这 期 间 我 遇 到 了 很 多 的 困 难 , 发 现 了 很 多 的 问题 , 正 是 在 解 决 问 题 的 期 间 我 才 慢 慢 地 熟 悉 了 Java 的 基 础 知 识 , 才 慢 慢 学会 了 如 何 去 按 照 给 定 的 要 求 设 计 出 合 适 的 java 系 统 。通过本次课程设计,我明白了一个道理无论做什么事情 ,都必需养成严谨,认真,善思的工作作风遇 到 问 题 最 好 的 办 法 就 是 请 教 别 人 , 因 为 每 个 人 掌 握 的 情况 都 不 一 样 , 一 个 人 不 可 能 做 到 处 处 都 懂 , 必 须 发 挥 群 众 的 力 量 , 复 杂 的 事情 才 能 够 简 单 化 。 这 一 点 我 深 有 体 会 , 在 很 多 时 候 , 我 遇 到 的 困 难 或 许 别 人之 前 就 遇 到 过 , 向 他 们 请 教 远 比 自 己 在 那 边 摸 索 来 得 简 单 , 来 得 快 。中国象棋对弈系统8 作者简介王、男、河北沧州人 附件程序代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Chesspublic static void mainString argsnew ChessMainFrame“中国象棋观棋不语真君子,棋死无悔大丈夫“;class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable玩家JLabel play new JLabel32;棋盘JLabel image;窗格Container con;工具栏JToolBar jmain;重新开始JButton anew;悔棋JButton repent;退出JButton exit;当前信息JLabel text;保存当前操作Vector Var;规则类对象使于调用方法ChessRule rule;/ 单击棋子 chessManClick true 闪烁棋子 并给线程响应 chessManClick false 吃棋子 停止闪烁 并给线程响应数学与应用数学专业 Java 课程设计报告 9 作者简介王、男、河北沧州人*/boolean chessManClick;/ 控制玩家走棋 chessPlayClick1 黑棋走棋 chessPlayClick2 红棋走棋 默认红棋 chessPlayClick3 双方都不能走棋*/int chessPlayClick2;控制棋子闪烁的线程Thread tmain;把第一次的单击棋子给线程响应static int Man,i;ChessMainFramenew ChessMainFrame“中国象棋“;/ 构造函数 初始化图形用户界面*/ChessMainFrameString Title获行客格引用con this.getContentPane;con.setLayoutnull;实例化规则类rule new ChessRule;Var new Vector;创建工具栏jmain new JToolBar;text new JLabel“欢迎使用象棋对弈系统“;当鼠标放上显示信息text.setToolTipText“信息提示“;anew new JButton“ 新 游 戏 “;anew.setToolTipText“重新开始新的一局“;exit new JButton“ 退 出 “;exit.setToolTipText“退出象棋程序程序“;repent new JButton“ 悔 棋 “;repent.setToolTipText“返回到上次走棋的位置“;把组件添加到工具栏jmain.setLayoutnew GridLayout0,4;jmain.addanew;jmain.addrepent;jmain.addexit;jmain.addtext;中国象棋对弈系统10 作者简介王、男、河北沧州人 jmain.setBounds0,0,558,30;con.addjmain;添加棋子标签drawChessMan;注册按扭监听anew.addActionListenerthis;repent.addActionListenerthis;exit.addActionListenerthis;注册棋子移动监听for int i0;i screenSize.heightframeSize.height screenSize.height;if frameSize.width screenSize.widthframeSize.width screenSize.width;this.setLocationscreenSize.width - frameSize.width / 2 - 280 ,screenSize.height - frameSize.height / 2 - 350;设置this.setIconImagenew ImageIcon“image红将.GIF“.getImage;this.setResizablefalse;this.setTitleTitle;this.setSize558,670;this.show;/数学与应用数学专业 Java 课程设计报告 11 作者简介王、男、河北沧州人 添加棋子方法*/public void drawChessMan流程控制int i,k;图标Icon in;黑色棋子车in new ImageIcon“image黑车.GIF“;for i0,k24;i 15 Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;play.setBoundsplay.getX,play.getY57,55,55;向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if play.getY 284 把对方的位置给自己play1.setBoundsplay2.getX,play2.getY,55,55;红棋要过河才左能吃棋else if play1.getName.charAt1 2 把对方的位置给自己play1.setBoundsplay2.getX,play2.getY,55,55;红棋要过河才能右吃棋else if play1.getName.charAt1 2 把对方的位置给自己play1.setBoundsplay2.getX,play2.getY,55,55; 当前记录添加到集合用于悔棋Var.addString.valueOfplay1.isVisible;Var.addString.valueOfplay1.getX;Var.addString.valueOfplay1.getY;Var.addString.valueOfMan;当前记录添加到集合用于悔棋Var.addString.valueOfplay2.isVisible;Var.addString.valueOfplay2.getX;Var.addString.valueOfplay2.getY;Var.addString.valueOfi;卒吃结束/炮、车移动规则*/public void cannonRuleJLabel play,JLabel playQ,MouseEvent me起点和终点之间是否有棋子 int Count 0;上、下移动if play.getX - me.getX -55指定所有模糊 Y 坐标for int i56;i -27 break;for从起点到终点从右到左for int ki57;k iCount;break;foriffor数学与应用数学专业 Java 课程设计报告 23 作者简介王、男、河北沧州人起点和终点没有棋子就可以移动了if Count 0当前记录添加到集合用于悔棋Var.addString.valueOfplay.isVisible;Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;play.setBoundsplay.getX,i,55,55;break;ifforif左、右移动else if play.getY - me.getY -27 break;for从起点到终点从下到上 for int ki57;k iCount;break;foriffor起点和终点没有棋子if Count 0当前记录添加到集合用于悔棋Var.addString.valueOfplay.isVisible;Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;play.setBoundsi,play.getY,55,55;break;ifforelse炮、车移动方法结束/炮、车吃棋规则*/public void cannonRuleint Chess,JLabel play,JLabel playTake,JLabel playQ,MouseEvent me起点和终点之间是否有棋子int Count 0;所有的棋子for int j0;j -27 break;for自己是起点被吃的是终点从下到上for int kplayTake.getY;k playTake.getYCount;break;forif找出在同一条竖线的所有棋子、并不包括自己else if playQj.getY - play.getY -10 break; for自己是起点被吃的是终点从右到左for int kplayTake.getX;k playTake.getXCount;break;foriffor起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if Count 1 Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;当前记录添加到集合用于悔棋Var.addString.valueOfplayTake.isVisible;Var.addString.valueOfplayTake.getX;Var.addString.valueOfplayTake.getY;Var.addString.valueOfi;playTake.setVisiblefalse;play.setBoundsplayTake.getX,playTake.getY,55,55;起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if Count 0 Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;数学与应用数学专业 Java 课程设计报告 25 作者简介王、男、河北沧州人当前记录添加到集合用于悔棋Var.addString.valueOfplayTake.isVisible;Var.addString.valueOfplayTake.getX;Var.addString.valueOfplayTake.getY;Var.addString.valueOfi;playTake.setVisiblefalse;play.setBoundsplayTake.getX,playTake.getY,55,55;炮、车吃棋方法结束/马移动规则*/public void horseRuleJLabel play,JLabel playQ,MouseEvent me保存坐标和障碍int Ex0,Ey0,Move0; 上移、左边if play.getX - me.getX 2 i -27 i -27 i -27 i -27 i -27 i -27 i -27 Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;Var.addString.valueOfMan;System.out.println“Ex“Ex;System.out.println“Ey“Ey;play.setBoundsEx,Ey,55,55;黑旗不能过汉界else if Move 0 Var.addString.valueOfplay.getX;Var.addString.valueOfplay.getY;

你可能感兴趣的:(中国象棋java大作业doc)