收藏 分享(赏)

中国象棋java源码.doc

上传人:yjrm16270 文档编号:6410155 上传时间:2019-04-11 格式:DOC 页数:59 大小:740KB
下载 相关 举报
中国象棋java源码.doc_第1页
第1页 / 共59页
中国象棋java源码.doc_第2页
第2页 / 共59页
中国象棋java源码.doc_第3页
第3页 / 共59页
中国象棋java源码.doc_第4页
第4页 / 共59页
中国象棋java源码.doc_第5页
第5页 / 共59页
点击查看更多>>
资源描述

1、东北大学秦皇岛分校信息与计算科学系Java 程序设计实验报告专业名称 信 息 与 计 算 科 学班级学号 7080206学生姓名 彭 军指导教师 王 薇完成时间 2011.04.15一、设计题目中国象棋。2、设计说明2.1 引言象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台WinBoard 平台,另一个是商业的国际象棋数据库和对弈软件ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。国际象棋软件有着成功的商业运作,已发展成一种产业。然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,

2、但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。例如 B. Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎 Ferret 的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。本文针对中国象棋程序设计的一系列问题,总结出一些搜索引擎的设计方法,并给出 java语言的实现2.2 程序的设计及实现本系统主要有以下 4 个模块,

3、每个模块对应一个程序包:1、engine:搜索引擎包,系统的核心部分。2、message:网络对战过程中各种消息及其传递机制的类实现包。3、main:主界面实现包。4、pieces :棋子及其相关类实现包。现就各个包中的要点给与说明。2.2.1 搜索引擎的实现(engine 包)(1) BitBoard.java:位棋盘的实现,见 2.4 节。(2) CCEvalue.java:评价函数知识类。本程序使用开源软件“梦入神蛋”的快速评价函数。该函数包含子力价值和棋子所在位置的奖励值。子力价值分别是:帅-0, 仕- 40, 象-40, 马-88, 车-200, 炮-96, 兵-9。帅是无价的,用

4、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 上面的每行代表棋盘的一条纵线

5、。其中,-10 所在的位置是“窝心马”,所以要罚 10 分。(3) ChessPosition.java:动态局面类包含对局过程中的动态信息,主要实现的是 2.4 节的各类位棋盘和移子函数。(4) MoveStruct.java:着法表示类。(5) PreMove.java:伪合法着法生成模块,见 4.1。(6) MoveSortStruct.java:合法着法的生成及其排序算法,见 4.2。(7) SearchMove.java:搜索算法,实现如下功能:1)主置换表及开局库2)Alpha-Beta 搜索算法3)针对吃子着法的静态搜索算法4)适应性空着裁剪算法:见 5.5.2,根据不同情况来调

6、整 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)主要变例搜索算法2.2.2 信息传输机制(messag

7、e 包)在对弈过程中(主要是网络对弈)需要在对弈双方之间传输各类信息,抽象为各类消息。如时间规则的协定、各方的走子信息等。每方都有消息接收、消息处理和消息发送程序(OuterMsgReceiver、LocalMsgReceiver ,QzMessageHandler,MessageSender)。己方的 MessageSender 与对方的 OuterMsgReceiver 通过接口 SrConnection 连接。所有接收的消息放入消息队列 QzMsgQueue 中,等待消息处理进程QzMessageHandler 来处理。所有的消息都封装在 QzMessage 类对象中,消息的类型通过消息

8、的 Header 类型(以静态常量存放在 MsgHeader 类中)来区分。2.2.3 棋子(pieces 包)Qizi.java 包含棋子的信息,如棋子的(在棋盘上的)位置、图片、名称、类型、状态等。PiecesFactory.java 以“工厂”模式提供根据棋子类型或其他信息生成相关 Qizi 对象的方法。2.2.4 主控模块(main 包)实现了程序界面与消息传递、搜索引擎的集成。(1) NewBoard.java:棋盘坐标系统及其界面的实现。(2) CChessApp.java:主界面类,以内部类实现了 QzMessageHandler 接口、计时规则 TimeRule 接口以及事件的

9、处理程序,根据需要生成其他的并发线程如消息接收、处理和发送,机器思考(启动搜索引擎),计时显示等。(3) SetRuleDialog.java:设置规则的对话框。(4) SetSysInfoDialog.java:设置系统的一些属性如对战模式、连接端口等。(5) Translation.java:提供了一系列实用方法主要有:1)FEN 串与局面 ChessPosition 对象之间的转换2)不同着法表示(见第一章)之间的转换。如“炮二平五”与“Ch2-e2”及“62.5 或 C2.5“(C 和 6 代表炮)这几种表示法之间的转换3)棋谱文件的读入和存储。4)开局库的生成:将近年实战的棋谱文件(

10、可能有几种格式)整理生成开局库。3、程序代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Chesspublic static void main(String args)new ChessMainFrame(“中国象棋:观棋不语真君子,棋死无悔大丈夫“);class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runna

11、ble/玩家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 吃棋子 停止闪烁 并给线程响应*/boolean chessManC

12、lick;/* 控制玩家走棋* chessPlayClick=1 黑棋走棋* chessPlayClick=2 红棋走棋 默认红棋* chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;/控制棋子闪烁的线程Thread tmain;/把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame()new ChessMainFrame(“中国象棋“);/* 构造函数* 初始化图形用户界面*/ChessMainFrame(String Title)/获行客格引用con = this.getContentPane();con.s

13、etLayout(null);/实例化规则类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 JB

14、utton(“ 悔 棋 “);repent.setToolTipText(“返回到上次走棋的位置“);/把组件添加到工具栏jmain.setLayout(new GridLayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子标签drawChessMan();/注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.

15、addActionListener(this);/注册棋子移动监听for (int i=0;i screenSize.height)frameSize.height = screenSize.height;if (frameSize.width screenSize.width)frameSize.width = screenSize.width;this.setLocation(screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);/设置this.se

16、tIconImage(new ImageIcon(“image红将.GIF“).getImage();this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();/* 添加棋子方法*/public void drawChessMan()/流程控制int i,k;/图标Icon in;/黑色棋子/车in = new ImageIcon(“image黑车.GIF“);for (i=0,k=24;i 15 Var.add(String.valueOf(play.getX();Var.add(Strin

17、g.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),play.getY()+57,55,55);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() 284 /把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/红棋要过河才左能吃棋else if (play1.getName().charAt(1) = 2 /把对方的位置给自己play1.setBounds(play2.getX(),pl

18、ay2.getY(),55,55);/红棋要过河才能右吃棋else if (play1.getName().charAt(1) = 2 /把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible();Var.add(String.valueOf(play1.getX();Var.add(String.valueOf(play1.getY();Var.add(String.valueOf(Man);/当前记录添加到集合(用于悔棋)

19、Var.add(String.valueOf(play2.isVisible();Var.add(String.valueOf(play2.getX();Var.add(String.valueOf(play2.getY();Var.add(String.valueOf(i);/卒吃结束/*炮、车移动规则*/public void cannonRule(JLabel play,JLabel playQ,MouseEvent me)/起点和终点之间是否有棋子int Count = 0;/上、下移动if (play.getX() - me.getX() = -55)/指定所有模糊 Y 坐标for

20、(int i=56;i= -27 break;/for/从起点到终点(从右到左)for (int k=i+57;k i)Count+;break;/for/if/for/起点和终点没有棋子就可以移动了if (Count = 0)/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),i,55,

21、55);break;/if/for/if/左、右移动else if (play.getY() - me.getY() =-27 break;/for/从起点到终点(从下到上)for (int k=i+57;k i)Count+;break;/for/if/for/起点和终点没有棋子if (Count = 0)/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valu

22、eOf(Man);play.setBounds(i,play.getY(),55,55);break;/if/for/else/炮、车移动方法结束/*炮、车吃棋规则*/public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ,MouseEvent me)/起点和终点之间是否有棋子int Count = 0;/所有的棋子for (int j=0;j= -27 break;/for/自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k playTake.getY()Cou

23、nt+;break;/for/if/找出在同一条竖线的所有棋子、并不包括自己else if (playQj.getY() - play.getY() = -10 break;/for/自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k playTake.getX()Count+;break;/for/if/for/起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count = 1 Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(Str

24、ing.valueOf(Man);/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible();Var.add(String.valueOf(playTake.getX();Var.add(String.valueOf(playTake.getY();Var.add(String.valueOf(i);playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);/起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Co

25、unt =0 Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible();Var.add(String.valueOf(playTake.getX();Var.add(String.valueOf(playTake.getY();Var.add(String.valueOf(i);playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);/炮、车吃棋方法结束/*马移动规则*/public void horseRule(JLabel play,JLabel playQ,MouseEvent me)/保存坐标和障碍int Ex=0,Ey=0,Move=0;/上移、左边if (play.getX() - me.getX() = 2 break;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报