您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 中国象棋java源码
东北大学秦皇岛分校信息与计算科学系Java程序设计实验报告专业名称信息与计算科学班级学号7080206学生姓名彭军指导教师王薇完成时间2011.04.15一、设计题目中国象棋。二、设计说明2.1引言象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。国际象棋软件有着成功的商业运作,已发展成一种产业。然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。例如B.Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。本文针对中国象棋程序设计的一系列问题,总结出一些搜索引擎的设计方法,并给出java语言的实现2.2程序的设计及实现本系统主要有以下4个模块,每个模块对应一个程序包: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。帅是无价的,用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:着法表示类。(5)PreMove.java:伪合法着法生成模块,见4.1。(6)MoveSortStruct.java:合法着法的生成及其排序算法,见4.2。(7)SearchMove.java:搜索算法,实现如下功能:1)主置换表及开局库2)Alpha-Beta搜索算法3)针对吃子着法的静态搜索算法4)适应性空着裁剪算法:见5.5.2,根据不同情况来调整R值的做法,称为“适应性空着裁剪”(AdaptiveNull-MovePruning),它首先由ErnstHeinz发表在1999年的ICCA杂志上。其内容可以概括为:a.深度小于或等于6时,用R=2的空着裁剪进行搜索b.深度大于8时,用R=3;c.深度是6或7时,如果每方棋子都大于或等于3个,则用R=3,否则用R=2。5)带时间控制的迭代加深搜索算法:每次加深搜索都判断时间是否够用。6)“将军”扩展(加深)搜索算法:当搜索到己方被“将”时,增加搜索的深度。7)主要变例搜索算法2.2.2信息传输机制(message包)在对弈过程中(主要是网络对弈)需要在对弈双方之间传输各类信息,抽象为各类消息。如时间规则的协定、各方的走子信息等。每方都有消息接收、消息处理和消息发送程序(OuterMsgReceiver、LocalMsgReceiver,QzMessageHandler,MessageSender)。己方的MessageSender与对方的OuterMsgReceiver通过接口SrConnection连接。所有接收的消息放入消息队列QzMsgQueue中,等待消息处理进程QzMessageHandler来处理。所有的消息都封装在QzMessage类对象中,消息的类型通过消息的Header类型(以静态常量存放在MsgHeader类中)来区分。2.2.3棋子(pieces包)Qizi.java包含棋子的信息,如棋子的(在棋盘上的)位置、图片、名称、类型、状态等。PiecesFactory.java以“工厂”模式提供根据棋子类型或其他信息生成相关Qizi对象的方法。2.2.4主控模块(main包)实现了程序界面与消息传递、搜索引擎的集成。(1)NewBoard.java:棋盘坐标系统及其界面的实现。(2)CChessApp.java:主界面类,以内部类实现了QzMessageHandler接口、计时规则TimeRule接口以及事件的处理程序,根据需要生成其他的并发线程如消息接收、处理和发送,机器思考(启动搜索引擎),计时显示等。(3)SetRuleDialog.java:设置规则的对话框。(4)SetSysInfoDialog.java:设置系统的一些属性如对战模式、连接端口等。(5)Translation.java:提供了一系列实用方法主要有:1)FEN串与局面ChessPosition对象之间的转换2)不同着法表示(见第一章)之间的转换。如“炮二平五”与“Ch2-e2”及“62.5或C2.5“(C和6代表炮)这几种表示法之间的转换3)棋谱文件的读入和存储。4)开局库的生成:将近年实战的棋谱文件(可能有几种格式)整理生成开局库。三、程序代码:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;importjava.io.*;publicclassChess{publicstaticvoidmain(Stringargs[]){newChessMainFrame(中国象棋:观棋不语真君子,棋死无悔大丈夫);}}classChessMainFrameextendsJFrameimplementsActionListener,MouseListener,Runnable{//玩家JLabelplay[]=newJLabel[32];//棋盘JLabelimage;//窗格Containercon;//工具栏JToolBarjmain;//重新开始JButtonanew;//悔棋JButtonrepent;//退出JButtonexit;//当前信息JLabeltext;//保存当前操作VectorVar;//规则类对象(使于调用方法)ChessRulerule;/****单击棋子**chessManClick=true闪烁棋子并给线程响应**chessManClick=false吃棋子停止闪烁并给线程响应*/booleanchessManClick;/****控制玩家走棋**chessPlayClick=1黑棋走棋**chessPlayClick=2红棋走棋默认红棋**chessPlayClick=3双方都不能走棋*/intchessPlayClick=2;//控制棋子闪烁的线程Threadtmain;//把第一次的单击棋子给线程响应staticintMan,i;ChessMainFrame(){newChessMainFrame(中国象棋);}/****构造函数**初始化图形用户界面*/ChessMainFrame(StringTitle){//获行客格引用con=this.getContentPane();con.setLayout(null);//实例化规则类rule=newChessRule();Var=newVector();//创建工具栏jmain=newJToolBar();text=newJLabel(欢迎使用象棋对弈系统);//当鼠标放上显示信息text.setToolTipText(信息提示);anew=newJButton(新游戏);anew.setToolTipText(重新开始新的一局);exit=newJButton(退出);exit.setToolTipText(退出象棋程序程序);repent=newJButton(悔棋);repent.setToolTipText(返回到上次走棋的位置);//把组件添加到工具栏jmain.setLayout(newGridLayout(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.addActionListener(this);//注册棋子移动监听for(inti=0;i32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image=newJLabel(newImageIcon(image\\Main.GIF)));image.setBounds(0,30,558,620);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){System.exit(0);}});//窗体居中DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();DimensionframeSize=this.getSize();if(frameSize.heightscreenSize.height){frameSize.height=screenSize.height;}if(frameSize.widthscreenSize.width){frameSize.width=screenSize.width;}this.setLocation((screenSize.width-frameSize.width)/2-280,(screenSize.height-frameSize.height)/2-350);//设置this.setIconImage(newImageIcon(image\\红将.GIF).getImage());this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();}/****添加棋子方法*/publicvoiddrawChessMan(){//流程控制inti,k;//图标Iconin;//黑色棋子//车in=newImageIcon(image\\黑车.GIF);for(i=0,k=24;i2;i++,k+=456){play[i]=newJLabel(in);play[i].setBounds(k,56,55,55);play[i].setName(车1);}//马in=new
本文标题:中国象棋java源码
链接地址:https://www.777doc.com/doc-6382327 .html