《java语言程序设计》课程设计中国象棋对弈系统(源码)_第1页
《java语言程序设计》课程设计中国象棋对弈系统(源码)_第2页
《java语言程序设计》课程设计中国象棋对弈系统(源码)_第3页
《java语言程序设计》课程设计中国象棋对弈系统(源码)_第4页
《java语言程序设计》课程设计中国象棋对弈系统(源码)_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java语言程序设计课程设计姓 名: 王 * 学 号: 指导教师: 班 级: 所在院系: java语言程序设计实验报告实验项目名称:中国象棋对弈系统作者姓名与单位:王浩 数学与应用数学专业 数学081班摘要:本文主要是运用java实现具有一定功能的中国象棋对弈系统软件,主要功能如下:a、 象棋对弈:红方先走,然后黑方再走,红黑交替,直到一方获胜。b、 新游戏:任何时候可以重新开始一盘新的对弈。c、 悔棋:当走错棋的时候可以悔棋。d、 信息提示:提示当前信息状态。e、 简单的帮助文档:象棋规则介绍、软件的简单介绍和编制说明关键词:java、中国象棋对弈系统 正文:一 程序设计说明1.1程序的设计

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

3、兵-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 上面的每行

4、代表棋盘的一条纵线。其中,-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,根据不同情况来调

5、整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包)在对弈过程中(主要是网络对弈)需要在对

6、弈双方之间传输各类信息,抽象为各类消息。如时间规则的协定、各方的走子信息等。每方都有消息接收、消息处理和消息发送程序(outermsgreceiver、localmsgreceiver,qzmessagehandler,messagesender)。己方的messagesender与对方的outermsgreceiver通过接口srconnection连接。所有接收的消息放入消息队列qzmsgqueue中,等待消息处理进程qzmessagehandler来处理。所有的消息都封装在qzmessage类对象中,消息的类型通过消息的header类型(以静态常量存放在msgheader类中)来区分。1

7、.1.3 棋子(pieces包)qizi.java包含棋子的信息,如棋子的(在棋盘上的)位置、图片、名称、类型、状态等。piecesfactory.java以“工厂”模式提供根据棋子类型或其他信息生成相关qizi对象的方法。1.2主控模块(main包)实现了程序界面与消息传递、搜索引擎的集成。(1) newboard.java:棋盘坐标系统及其界面的实现。(2) cchessapp.java:主界面类,以内部类实现了qzmessagehandler接口、计时规则timerule接口以及事件的处理程序,根据需要生成其他的并发线程如消息接收、处理和发送,机器思考(启动搜索引擎),计时显示等。(3)

8、 setruledialog.java:设置规则的对话框。(4) setsysinfodialog.java:设置系统的一些属性如对战模式、连接端口等。(5) translation.java:提供了一系列实用方法主要有:1)fen串与局面chessposition对象之间的转换2)不同着法表示(见第一章)之间的转换。如“炮二平五”与“ch2-e2”及“62.5或c2.5“(c和6代表炮)这几种表示法之间的转换3)棋谱文件的读入和存储。4)开局库的生成:将近年实战的棋谱文件(可能有几种格式)整理生成开局库。2、 运行结果:3、 设计体会:本次课程设计主要是运用本学期所学到的java基础知识来设

9、计一个符合要求的中国象棋对弈系统,这期间我遇到了很多的困难,发现了很多的问题,正是在解决问题的期间我才慢慢地熟悉了java的基础知识,才慢慢学会了如何去按照给定的要求设计出合适的java系统。通过本次课程设计,我明白了一个道理:无论做什么事情,都必需养成严谨,认真,善思的工作作风遇到问题最好的办法就是请教别人,因为每个人掌握的情况都不一样,一个人不可能做到处处都懂,必须发挥群众的力量,复杂的事情才能够简单化。这一点我深有体会,在很多时候,我遇到的困难或许别人之前就遇到过,向他们请教远比自己在那边摸索来得简单,来得快。附件程序代码:import java.awt.*;import java.aw

10、t.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,runnable/玩家jlabel play = new jlabel32;/棋盘jlabel image;/窗格conta

11、iner con;/工具栏jtoolbar jmain;/重新开始jbutton anew;/悔棋jbutton repent;/退出jbutton exit;/当前信息jlabel text;/保存当前操作vector var;/规则类对象(使于调用方法)chessrule rule;/* 单击棋子* chessmanclick = true 闪烁棋子 并给线程响应* chessmanclick = false 吃棋子 停止闪烁 并给线程响应*/boolean chessmanclick;/* 控制玩家走棋* chessplayclick=1 黑棋走棋* chessplayclick=2 红

12、棋走棋 默认红棋* chessplayclick=3 双方都不能走棋*/int chessplayclick=2;/控制棋子闪烁的线程thread tmain;/把第一次的单击棋子给线程响应static int man,i;chessmainframe()new chessmainframe(中国象棋);/* 构造函数* 初始化图形用户界面*/chessmainframe(string title)/获行客格引用con = this.getcontentpane();con.setlayout(null);/实例化规则类rule = new chessrule();var = new vect

13、or();/创建工具栏jmain = new jtoolbar();text = new jlabel(欢迎使用象棋对弈系统);/当鼠标放上显示信息text.settooltiptext(信息提示);anew = new jbutton( 新 游 戏 );anew.settooltiptext(重新开始新的一局);exit = new jbutton( 退 出 );exit.settooltiptext(退出象棋程序程序);repent = new jbutton( 悔 棋 );repent.settooltiptext(返回到上次走棋的位置);/把组件添加到工具栏jmain.setlayou

14、t(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.addactionlistener(this);/注册棋子移动监听for (int i=0;i screensize.height)framesize

15、.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.seticonimage(new imageicon(image红将.gif).getimage();this.setresizable(false);

16、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;i2;i+,k+=456)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(车1);/马in = new imageicon(image黑马.gif);for (i=4,k=81;i

17、6;i+,k+=342)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(马1);/相in = new imageicon(image黑象.gif);for (i=8,k=138;i10;i+,k+=228)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(象1);/士in = new imageicon(image黑士.gif);for (i=12,k=195;i14;i+,k+=114)playi = new jlabel(in);

18、playi.setbounds(k,56,55,55);playi.setname(士1);/卒in = new imageicon(image黑卒.gif);for (i=16,k=24;i21;i+,k+=114)playi = new jlabel(in);playi.setbounds(k,227,55,55);playi.setname(卒1 + i);/炮in = new imageicon(image黑炮.gif);for (i=26,k=81;i28;i+,k+=342)playi = new jlabel(in);playi.setbounds(k,170,55,55);pl

19、ayi.setname(炮1 + i);/将in = new imageicon(image黑将.gif);play30 = new jlabel(in);play30.setbounds(252,56,55,55);play30.setname(将1);/红色棋子/车in = new imageicon(image红车.gif);for (i=2,k=24;i4;i+,k+=456)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(车2);/马in = new imageicon(image红马.gif);fo

20、r (i=6,k=81;i8;i+,k+=342)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(马2);/相in = new imageicon(image红象.gif);for (i=10,k=138;i12;i+,k+=228)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(象2);/士in = new imageicon(image红士.gif);for (i=14,k=195;i16;i+,k+=114)playi =

21、 new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(士2);/兵in = new imageicon(image红卒.gif);for (i=21,k=24;i26;i+,k+=114)playi = new jlabel(in);playi.setbounds(k,398,55,55);playi.setname(卒2 + i);/炮in = new imageicon(image红炮.gif);for (i=28,k=81;i 15 & man 25 & man =0 & man 3 & man 7 & man 11 & m

22、an 15 & man 25 & man =0 & man 3 & man 7 & man 11 & man 16)rule.chaprule(man,playman,play,me);/移动将、帅else if (man = 30 | man = 31)rule.willrule(man,playman,play,me);/是否走棋错误(是否在原地没有动)if (ex = playman.getx() & ey = playman.gety()text.settext( 黑棋走棋);chessplayclick=1;else text.settext( 红棋走棋);chessplayclic

23、k=2;/else if/当前没有操作(停止闪烁)chessmanclick=false;/if/单击棋子else/第一次单击棋子(闪烁棋子)if (!chessmanclick)for (int i=0;i32;i+)/被单击的棋子if (me.getsource().equals(playi)/告诉线程让该棋子闪烁man=i;/开始闪烁chessmanclick=true;break;/for/if/第二次单击棋子(吃棋子)else if (chessmanclick)/当前没有操作(停止闪烁)chessmanclick=false;for (i=0;i 15 & man 25 & man

24、 =0 & man 3 & man 7 & man 11 & man 15 & man 25 & man =0 & man 3 & man 7 & man 11 & man 16)rule.chaprule(man,playman,playi,play);/将、帅吃棋规则else if (man = 30 | man = 31)rule.willrule(man,playman,playi,play);playman.setvisible(true);/是否走棋错误(是否在原地没有动)if (ex = playman.getx() & ey = playman.gety()text.sette

25、xt( 黑棋走棋);chessplayclick=1;break;else text.settext( 红棋走棋);chessplayclick=2;break;/else if /if/for/是否胜利if (!play31.isvisible()joptionpane.showconfirmdialog(this,黑棋胜利,玩家一胜利,joptionpane.default_option,joptionpane.warning_message);/双方都不可以在走棋了chessplayclick=3;text.settext( 黑棋胜利);/if else if (!play30.isvi

26、sible()joptionpane.showconfirmdialog(this,红棋胜利,玩家二胜利,joptionpane.default_option,joptionpane.warning_message);chessplayclick=3;text.settext( 红棋胜利);/else if/else/elsepublic void mousepressed(mouseevent me)public void mousereleased(mouseevent me)public void mouseentered(mouseevent me)public void mousee

27、xited(mouseevent me)/* 定义按钮的事件响应*/public void actionperformed(actionevent ae) /重新开始按钮if (ae.getsource().equals(anew)int i,k;/重新排列每个棋子的位置/黑色棋子 /车for (i=0,k=24;i2;i+,k+=456)playi.setbounds(k,56,55,55);/马for (i=4,k=81;i6;i+,k+=342)playi.setbounds(k,56,55,55);/相for (i=8,k=138;i10;i+,k+=228)playi.setboun

28、ds(k,56,55,55);/士for (i=12,k=195;i14;i+,k+=114)playi.setbounds(k,56,55,55);/卒for (i=16,k=24;i21;i+,k+=114)playi.setbounds(k,227,55,55);/炮for (i=26,k=81;i28;i+,k+=342)playi.setbounds(k,170,55,55);/将play30.setbounds(252,56,55,55);/红色棋子/车for (i=2,k=24;i4;i+,k+=456)playi.setbounds(k,569,55,55);/马for (i=

29、6,k=81;i8;i+,k+=342)playi.setbounds(k,569,55,55);/相for (i=10,k=138;i12;i+,k+=228)playi.setbounds(k,569,55,55);/士for (i=14,k=195;i16;i+,k+=114)playi.setbounds(k,569,55,55);/兵for (i=21,k=24;i26;i+,k+=114)playi.setbounds(k,398,55,55);/炮for (i=28,k=81;i30;i+,k+=342)playi.setbounds(k,455,55,55);/帅play31.

30、setbounds(252,569,55,55);chessplayclick = 2;text.settext( 红棋走棋);for (i=0;i32;i+)playi.setvisible(true);/清除vector中的内容var.clear();/悔棋按钮else if (ae.getsource().equals(repent)try/获得setvisible属性值string s = (string)var.get(var.size()-4);/获得x坐标int x = integer.parseint(string)var.get(var.size()-3);/获得y坐标int

31、 y = integer.parseint(string)var.get(var.size()-2);/获得索引int m = integer.parseint(string)var.get(var.size()-1);/赋给棋子playm.setvisible(true);playm.setbounds(x,y,55,55);if (playm.getname().charat(1) = 1)text.settext( 黑棋走棋);chessplayclick = 1; elsetext.settext( 红棋走棋);chessplayclick = 2;/删除用过的坐标var.remove

32、(var.size()-4);var.remove(var.size()-3);var.remove(var.size()-2);var.remove(var.size()-1);/停止旗子闪烁chessmanclick=false;catch(exception e)/退出else if (ae.getsource().equals(exit)int j=joptionpane.showconfirmdialog(this,真的要退出吗?,退出,joptionpane.yes_option,joptionpane.question_message);if (j = joptionpane.y

33、es_option)system.exit(0);/*定义中国象棋规则的类*/class chessrule /*卒子的移动规则*/public void armsrule(int man,jlabel play,mouseevent me)/黑卒向下if (man 27 & (me.gety()-play.gety() 86 & (me.getx()-play.getx() 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(),play.gety()+57,55,55);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论