完整版java毕业课程设计中国象棋java源码.docx

上传人:b****3 文档编号:11191276 上传时间:2023-05-29 格式:DOCX 页数:61 大小:424.64KB
下载 相关 举报
完整版java毕业课程设计中国象棋java源码.docx_第1页
第1页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第2页
第2页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第3页
第3页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第4页
第4页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第5页
第5页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第6页
第6页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第7页
第7页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第8页
第8页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第9页
第9页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第10页
第10页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第11页
第11页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第12页
第12页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第13页
第13页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第14页
第14页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第15页
第15页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第16页
第16页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第17页
第17页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第18页
第18页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第19页
第19页 / 共61页
完整版java毕业课程设计中国象棋java源码.docx_第20页
第20页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

完整版java毕业课程设计中国象棋java源码.docx

《完整版java毕业课程设计中国象棋java源码.docx》由会员分享,可在线阅读,更多相关《完整版java毕业课程设计中国象棋java源码.docx(61页珍藏版)》请在冰点文库上搜索。

完整版java毕业课程设计中国象棋java源码.docx

完整版java毕业课程设计中国象棋java源码

Java语言程序设计实验报告

实验项目名称:

中国象棋对弈系统

作者姓名与单位:

李明数学与应用数学专业数学081班

摘要:

本文主要是运用java实现具有一定功能的中国象棋对弈系统软件,主要功能如下:

a、象棋对弈:

红方先走,然后黑方再走,红黑交替,直到一方获胜。

b、新游戏:

任何时候可以重新开始一盘新的对弈。

c、悔棋:

当走错棋的时候可以悔棋。

d、信息提示:

提示当前信息状态。

e、简单的帮助文档:

象棋规则介绍、软件的简单介绍和编制说明

关键词:

java、中国象棋对弈系统

 

正文:

一程序设计说明

1.1程序的设计及实现

本系统主要有以下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,兵-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)主要变例搜索算法

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包)

实现了程序界面与消息传递、搜索引擎的集成。

(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)开局库的生成:

将近年实战的棋谱文件(可能有几种格式)整理生成开局库。

2、运行结果:

3、设计体会:

本次课程设计主要是运用本学期所学到的Java基础知识来设计一个符合要求的中国象棋对弈系统,这期间我遇到了很多的困难,发现了很多的问题,正是在解决问题的期间我才慢慢地熟悉了Java的基础知识,才慢慢学会了如何去按照给定的要求设计出合适的java系统。

通过本次课程设计,我明白了一个道理:

无论做什么事情,都必需养成严谨,认真,善思的工作作风遇到问题最好的办法就是请教别人,因为每个人掌握的情况都不一样,一个人不可能做到处处都懂,必须发挥群众的力量,复杂的事情才能够简单化。

这一点我深有体会,在很多时候,我遇到的困难或许别人之前就遇到过,向他们请教远比自己在那边摸索来得简单,来得快。

附件

程序代码:

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();

con.add(jmain);

添加棋子标签

drawChessMan();

注册按扭监听

anew.addActionListener(this);

repent.addActionListener(this);

exit.addActionListener(this);

注册棋子移动监听

for(inti=0;i<32;i++){

con.add(play[i]);

play[i].addMouseListener(this);

}

添加棋盘标签

con.add(image=newJLabel(newImageIcon("image\\Main.GIF")));

image.setBounds();

image.addMouseListener(this);

注册窗体关闭监听

this.addWindowListener(

newWindowAdapter(){

publicvoidwindowClosing(WindowEventwe){

System.exit(0);

}

}

);

窗体居中

DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();

DimensionframeSize=this.getSize();

if(frameSize.((screenSize.width-frameSize.width)2-280,(screenSize.("image\\红将.GIF").getImage());

this.setResizable(false);

this.setTitle(Title);

this.setSize();

this.show();

}

**

**添加棋子方法

*

publicvoiddrawChessMan(){

流程控制

inti,k;

图标

Iconin;

黑色棋子

in=newImageIcon("image\\黑车.GIF");

for(i=0,k=24;i<2;i++,k+=456){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("车1");

}

in=newImageIcon("image\\黑马.GIF");

for(i=4,k=81;i<6;i++,k+=342){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("马1");

}

in=newImageIcon("image\\黑象.GIF");

for(i=8,k=138;i<10;i++,k+=228){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("象1");

}

in=newImageIcon("image\\黑士.GIF");

for(i=12,k=195;i<14;i++,k+=114){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("士1");

}

in=newImageIcon("image\\黑卒.GIF");

for(i=16,k=24;i<21;i++,k+=114){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("卒1"+i);

}

in=newImageIcon("image\\黑炮.GIF");

for(i=26,k=81;i<28;i++,k+=342){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("炮1"+i);

}

in=newImageIcon("image\\黑将.GIF");

play[30]=newJLabel(in);

play[30].setBounds();

play[30].setName("将1");

红色棋子

in=newImageIcon("image\\红车.GIF");

for(i=2,k=24;i<4;i++,k+=456){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("车2");

}

in=newImageIcon("image\\红马.GIF");

for(i=6,k=81;i<8;i++,k+=342){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("马2");

}

in=newImageIcon("image\\红象.GIF");

for(i=10,k=138;i<12;i++,k+=228){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("象2");

}

in=newImageIcon("image\\红士.GIF");

for(i=14,k=195;i<16;i++,k+=114){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("士2");

}

in=newImageIcon("image\\红卒.GIF");

for(i=21,k=24;i<26;i++,k+=114){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("卒2"+i);

}

in=newImageIcon("image\\红炮.GIF");

for(i=28,k=81;i<30;i++,k+=342){

play[i]=newJLabel(in);

play[i].setBounds(k);

play[i].setName("炮2"+i);

}

in=newImageIcon("image\\红将.GIF");

play[31]=newJLabel(in);

play[31].setBounds(5);

play[31].setName("帅2");

}

**

**线程方法控制棋子闪烁

*

publicvoidrun(){

while(true){

单击棋子第一下开始闪烁

if(chessManClick){

play[Man].setVisible(false);

时间控制

try{

tmain.sleep(200);

}

catch(Exceptione){

}

play[Man].setVisible(true);

}

闪烁当前提示信息以免用户看不见

else{text.setVisible(false);时间控制

try{tmain.sleep(250);

}

catch(Exceptione){

}

text.setVisible(true);

}

try{tmain.sleep(350);

}

catch(Exceptione){

}

}

}

**

**单击棋子方法*

publicvoidmouseClicked(MouseEventme){

System.out.println("Mouse");当前坐标

intEx=0,Ey=0;启动线程

if(tmain==null){

tmain=newThread(this);

tmain.start();

}单击棋盘(移动棋子)

if(me.getSource().equals(image)){该红棋走棋的时候

if(chessPlayClick==2&&play[Man].getName().charAt

(1)=='2'){

Ex=play[Man].getX();

Ey=play[Man].getY();移动卒、兵

if(Man>15&&Man<26){

rule.armsRule(Man,play[Man],me);

}移动炮

elseif(Man>25&&Man<30){

rule.cannonRule(play[Man],play,me);

}移动车

elseif(Man>=0&&Man<4){

rule.cannonRule(play[Man],play,me);

}移动马

elseif(Man>3&&Man<8){

rule.],play,me);

}移动相、象

elseif(Man>7&&Man<12){

rule.elephantRule(Man,play[Man],play,me);

}移动仕、士

elseif(Man>11&&Man<16){

rule.chapRule(Man,play[Man],play,me);

}移动将、帅

elseif(Man==30||Man==31){

rule.willRule(Man,play[Man],play,me);

}是否走棋错误(是否在原地没有动)

if(Ex==play[Man].getX()&&Ey==play[Man].getY()){

text.setText("红棋走棋");

chessPlayClick=2;

}

else{text.setText("黑棋走棋");

chessPlayClick=1;

}

}if该黑棋走棋的时候

elseif(chessPlayClick==1&&play[Man].getName().charAt

(1)=='1'){

Ex=play[Man].getX();

Ey=play[Man].getY();移动卒、兵

if(Man>15&&Man<26){

rule.armsRule(Man,play[Man],me);

}移动炮

elseif(Man>25&&Man<30){

rule.cannonRule(play[Man],play,me);

}移动车

elseif(Man>=0&&Man<4){

rule.cannonRule(play[Man],play,me);

}移动马

elseif(Man>3&&Man<8){

rule.],play,me);

}移动相、象

elseif(Man>7&&Man<12){

rule.elephantRule(Man,play[Man],play,me);

}移动仕、士

elseif(Ma

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2