基于java语言的中国象棋设计与实现学士学位论文文档格式.docx

上传人:b****2 文档编号:5729296 上传时间:2023-05-05 格式:DOCX 页数:90 大小:132.13KB
下载 相关 举报
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第1页
第1页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第2页
第2页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第3页
第3页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第4页
第4页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第5页
第5页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第6页
第6页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第7页
第7页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第8页
第8页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第9页
第9页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第10页
第10页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第11页
第11页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第12页
第12页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第13页
第13页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第14页
第14页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第15页
第15页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第16页
第16页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第17页
第17页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第18页
第18页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第19页
第19页 / 共90页
基于java语言的中国象棋设计与实现学士学位论文文档格式.docx_第20页
第20页 / 共90页
亲,该文档总共90页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于java语言的中国象棋设计与实现学士学位论文文档格式.docx

《基于java语言的中国象棋设计与实现学士学位论文文档格式.docx》由会员分享,可在线阅读,更多相关《基于java语言的中国象棋设计与实现学士学位论文文档格式.docx(90页珍藏版)》请在冰点文库上搜索。

基于java语言的中国象棋设计与实现学士学位论文文档格式.docx

ThispaperstudiestheresearchstatusofChinesechess,analyzesthedemandofChinesechess,andlearnsthefeasibilityofChinesechessthatisdesignedbyJavalanguage.Atthesametime,thefunctionisdesignedwiththesuccessfulexperienceofchessprogram,suchastheplaceboard,Zobristkeys,etc.ChinesechessprogramissummarizedsomewaystodesignChinesechessprogramforsolvearangeofissues.Followthisways,itdesignsalltherulesandfuntionswhichadapttotherequirementofChinesechess,includingofmovement,judgement,undo,re-startandsoon.TheapplicationgivestheimplementationmethodinJAVAlanguageandbeautifulinterface.

Keywords:

ChineseChess,bitboard,zobristkeys

1绪论

1.1研究背景

计算机现在已经成为每天工作和生活必不可少的一部分,电子游戏在计算机产业的带动下也逐步深入我们每个人的娱乐活动中,棋牌游戏作为休闲类电子游戏,相对于角色扮演类游戏和即时战略类游戏等其它游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。

棋类运动的推广和发展是需要靠信息技术来推动的,时下盛行的国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利,也极大的促进了国际象棋的发展。

国际象棋软件有着成功的商业运作,已发展成一种产业。

在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。

1.2研究意义

我国现在正处于飞速发展的阶段,想要提高我国的国际地位、让世界更好的了解我国,不仅要依靠经济和政治的影响,更要注重文化传播的作用。

中国象棋是我国起源最早(最早出现于战国时期)、也是我国保存最为完整的棋类运动之一,他的行棋规则和棋子、棋盘的设计都蕴函着丰富的中国文化。

中国象棋的艺术和棋理折射着以儒家思想为正统的东方民族文化精神,深为我国各阶层人民喜爱。

但是中国象棋在国际上的普及率仍然很低,并因此未被入选2010年广州亚运会的竞赛项目。

想要提高中国象棋的知名度和普及率,就必须要有一个大众化的中国象棋游戏平台,电脑游戏无疑是最佳选择。

然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。

因此,我们迫切的需要一个更加基础、更加实用的中国象棋对战平台。

1.3预期目标

首先进行理论的研究,研究JAVA编程的基础,包括JAVA编成的主要步骤及所需要的工具和软件,熟悉编程软件后,开始着手进行研究,设计出论文的主要框架和具体实现的步骤、目标。

其次具体的实现。

设计出一个基于JAVA语言的中国象棋对战平台,由于中国象棋比较复杂,所以主要设计出一个人、人对战的平台,这个平台必须符合中国象棋规则(包括胜负、走棋、悔棋、吃子、判断胜负等主要功能,各棋子按象棋规则走动),如果时间允许,可进一步实现一些附加功能,包括美观的界面、对战双方交流、添加背景音乐等。

最后,依据框架和目标编写代码,实现主要功能并且进行测试,直至程序运行成功。

最终在深入研究理论的基础上,实现基于JAVA语言设计的中国象棋,做出预期的完整游戏。

2分析

2.1需求分析

现在全球超过十亿台计算机正在被使用,并且这个数目还在逐渐增加,计算机已经深入到我们生活的各个方面。

而我们使用计算机时,游戏所占的比重很大。

棋类游戏作为一种简单易学的休闲游戏,一直深受广大群众的喜爱。

JAVA作为一种程序编写的语言,在软件市场的影响力快速提高,潜力巨大。

因此用JAVA编写的中国象棋游戏有着很大的开发潜力。

与网络游戏相比,单机游戏有着不可匹敌的简约性。

人们可以随心所欲的选择任何时间进行游戏,而且人人对战还可以实现对战双方的直接交流,尤其随着笔记本电脑的普及,基本上可以随时随地都把它们带在身边,在人们离开家或者想玩的时候,可以不受任何时间地点限制地玩自己选择的游戏。

2.2可行性分析

随着计算机的普及和应用,电子游戏已经深入到我们生活的各个方面,利用电子游戏推广我国文化、增加我国传统游戏的市场占有率,是将我国文化推向世界的比较便捷的一种方式。

中国象棋作为我国保存最完整、最能代表我国古代文化的游戏之一,它的推广能够让世界更加了解中国。

JAVA与C++语言非常相近,但JAVA比C++简单,它抛弃了C++中的一些非必要的功能。

用JAVA编写的中国象棋程序实现了人与人的对弈,符合中国象棋的行棋规则,界面美观,能够激起玩家的兴趣,同时单机游戏对计算机的环境要求十分简单、易于实现。

2.3功能分析

打开游戏,鼠标所在的功能键会突出显示,点开新游戏后,原本的“欢迎使用象棋对弈系统”会变成提示“红棋走棋”或“黑棋走棋”。

单击选中的棋子时,该棋子会不停闪烁,如果符合规则,则可以移动到指定位置。

在进行人与人之间对战时,按照红先黑后的顺序进行,并把下棋的每一步过程记录下来,在对战时能进行悔棋功能,对悔棋次数没有限定,玩家可以再玩之前自己约定,增加了游戏的灵活性。

在行棋时依照“马走日,象走田,车、炮走直线、士在框内走斜线,卒未过河是上下走、过河可左右行走且不能回头,将、帅只能在框内行走”等行走规则,且按照“炮必须隔一个棋子才能吃棋子,其他棋子按棋子行走规则的位置实现吃子”的规则,完全符合象棋的行棋规则。

2.4硬件环境

2.4.1开发环境

1、硬件环境

CPU:

AMDTurion(tm)64*21.80GH

内存:

DDR1.5G

硬盘:

80G

2、软件环境

操作系统:

WINDOWSXP

开发语言:

JAVA

2.4.2运行环境

1、32M以上内存,4G以上硬盘。

2、MicrosoftWindows9X/NT/vista操作系统。

3、800*600或以上的屏幕分辨率。

3界面设计框架

3.1程序的框架

从程序的结构上讲,大体上可以将引擎部分划分为四大块:

棋局表示;

着法生成;

搜索算法;

局面评估。

程序的大概的思想是:

首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着法生成器生成当前下棋方所有合法的着法并依次存入着法队列。

然后通过搜索算法来逐一读取着法并调用局面评估函数对该着法所产生的后继局面进行评估打分,从中选出一个最有可能导致走棋方取胜的着法。

在搜索的过程中还可以采用一些辅助手段来提高搜索的效率。

其过程如下所示(图1):

图1着法生成

3.2.基本数据结构——位棋盘

3.2.1什么是位棋盘

在中国象棋中,棋盘有90个交叉点。

位棋盘其实就是一个长度为90位的变量,每个位对应一个交叉点,用来记录棋盘上的某些布尔值。

在Java中,用3个int类型数据(每个32位,共96位多余的6位不用)表示一个位棋盘。

3.2.2位棋盘的作用

记录所有棋子位置的位棋盘AllPieces。

AllPieces告诉我们棋盘上哪些格子有棋子,哪些没有。

当棋子处于最初位置的时候,“AllPieces”看上去是这个样子的(以下描述中,格子的下标从0开始):

(Hi,89,a9)111111111000000000101010101000000000000000000101010101000000000010000010000000000111111111(Low,0,i0)

其最高位对应第89格(a9格,左上角),最低位对应第0格(a8格,右下角)。

有子的位对应1,没有子的位对应0。

这样显示位棋盘可能更形象一点:

黑棋

111111111

000000000

010000010

101010101

红棋

3.2.3位棋盘的基本运算

1、与(&

0101

1001

————

0001

2、或(|)

1101

3、异或(^)

1100

4、取补(~)

a=0001,

~a=1110。

3.2.4Java中位棋盘的实现

3.2.4.1位棋盘类的实现

Java中,位棋盘用3个int型的数据表示,最高六位不用。

Java中“与、或、非、异或、左位移,右位移(注意,位棋盘的右位移是无符号位移)”分别是“&

、|、^、<

<

、>

>

”。

代码摘要(详细代码见附件)及相关说明如下:

publicclassBitBoard{

privateintLow,Mid,Hi//用3个int字段表示位棋盘,最高位Hi的高//6位不用

publicBitBoard(intArg1,intArg2,intArg3){//构造函数

Low=Arg1;

Mid=Arg2;

Hi=Arg3;

}

publicstaticBitBoardopAnd(BitBoardarg1,BitBoardarg2){

//位棋盘的“与”操作,保存结果。

intlow=arg1.Low&

arg2.Low;

intmid=arg1.Mid&

arg2.Mid;

inthi=arg1.Hi&

arg2.Hi;

returnnewBitBoard(low,mid,hi);

}

publicstaticBitBoardopOr(BitBoardarg1,BitBoardarg2)

//位棋盘的“或”操作,保存结果。

publicstaticBitBoardopXor(BitBoardarg1,BitBoardarg2)

//位棋盘的“异或”操作,保存结果。

publicstaticintcount(BitBoardarg)//计算位棋盘中非零位的个数

publicstaticBitBoardduplicate(intarg)//复制位棋盘

publicstaticbooleanequals(BitBoardarg1,BitBoardarg2)

//位棋盘是否相等(所有90位对应的位相同即//为相等)

publicstaticBitBoardleftShift(BitBoardarg,intnum)

//位棋盘arg左位移num位

publicstaticrightShift(BitBoard,intnum)//位棋盘右位移num位

publicstaticintLSB(BitBoardArg)//位棋盘最低非0位的位置(从0开始计数)

publicstaticintMSB(BitBoardArg)//位棋盘最高非0位的位置(从0开始计数)

publicstaticbooleannotZero(BitBoardArg)//是否非“0”。

当90位中有非0位时返回true。

3.2.4.2位棋盘的初始化

某些位棋盘从程序开始运行到结束都不会改变。

例如上面所述的那个位棋盘数组“knight[90]”。

(他实际上记录了当“马”在任意格子上时,它下一步可以走的格子。

)这个数组将在程序开始执行的时候被初始化并且不再改变。

其余的位棋盘将不断变化。

例如“AllPieces”位棋盘。

当中国象棋棋盘变化时,它也跟着变化。

然而,他们的初始化方式相同。

对于诸如knight[90]这样不变化的位棋盘的初始化,将在“伪着法生成”章节详述。

此处叙述走棋过程中随棋局变化的诸多位棋盘的初始化及相关操作。

首先,初始化“BitBoardbitMask[90]”数组:

BitBoardb=newBitBoard(0,0,1);

for(intc=0;

c<

90;

c++){

mask[c]=BitBoard.leftShift(b,c);

}

其次,用一个叫ChessPosition类记录棋盘上某一状态的所有有用信息。

它包含了一个整型数组intpiece_in_square[90],还包含了一些位棋盘。

publicclassChessPosition{

intpiece_in_square[90];

intplayer;

//轮到哪方走棋,2:

红方走,1:

黑方走

BitBoardallPieces;

BitBoardredKing;

//红帅

BitBoardblackKing;

//黑将

BitBoardredRooks;

//红车

BitBoardblackRooks;

//黑车

BitBoardredKnights;

//红马

BitBoardblackKnights;

//黑马

BitBoardredCannon;

//红炮

//黑炮

BitBoardredBishops;

//红相

BitBoardblackBishops;

//黑象

BitBoardredAdvisor;

//红仕

BitBoardblackAdvisor;

//黑士

BitBoardredPawns;

//红兵

BitBoardblackPawns;

//黑卒

BitBoardredPieces;

//所有红棋子

BitBoardblackPieces;

//所有黑棋子

};

初始化“piece_in_square[]”数组。

piece_in_square[0]=RED_ROOK;

piece_in_square[1]=RED_KNIGHT;

piece_in_square[2]=RED_BISHOP;

piece_in_square[89]=BLACK_ROOK;

 

现在初始化其他一些位棋盘:

for(c=0;

 switch(piece_in_square[c]){

 case:

RED_ROOK

  position.redPieces=BitBoard.opOr(position.redPieces,bitMask[c]);

  position.redRooks

BitBoard.opOr(position.redRooks,bitMask[c]);

  break;

  …

 }

3.2.4.3位棋盘的更新

当棋盘局面变动后,某些位棋盘就需要被更新。

例如记录白子所在位置的“WhitePieces”位棋盘。

假如我们把h2格的红炮移动到h9格(炮二进七),吃掉黑棋的一个马,需要更新如下位棋盘:

allPieces

redPieces

redCannons

blackpieces

blackKnights

首先,要把redPieces,redCannons位棋盘的“h2”位清零,然后把他们的“h9”位置1。

/*clearabitwiththe"

XOR"

operation*/

position.allPieces=BitBoard.opXor(position.allPieces,bitMask[h2];

position.redPieces=BitBoard.opXor(position.redPieces,bitMask[h2]);

position.redCannons=BitBoard.opXor(position.redCannons,bitMask[h2];

/*setabitwiththe"

OR"

position.redPieces=BitBoard.opOr(position.redPieces,bitMask[h9]);

position.redCannons=BitBoard.opOr(position.redCannons,bitMask[h9]);

现在我们要将blackPieces和blackKnights位棋盘的h9位清除,因为那里的黑马被吃掉了。

/*clearthecapturedpiece*/

position.blackPieces=BitBoard.opXor(position.blackPieces,bitMask[h9]);

position.blackKnight=BitBoard.opXor(position.blackPieces,bitMask[h9]

3.3.基本数据结构——Zobrist键值

3.3.1比较局面的方法

  在写中国象棋程序时,需要比较两个局面看它们是否相同。

如果比较每个棋子的位置,或许不需要花很多时间,但是实战中每秒种需要做成千上万次比较,因此这样会使比较操作变成瓶颈的。

另外,需要比较的局面数量多得惊人,要存储每个棋子的位置,需要占用非常大的空间。

一个解决方案是建立一个标签,通常是64位。

由于64位不足以区别每个局面,所以仍然存在冲突的标签,但实战中这种情况非常罕见。

3.3.2Zobrist键值的工作原理

3.3.2.1Zobrist键值的工作原理

用Zobrist技术产生的键值,表面上与局面没什么关系。

如果一个棋子动过了,就会得到完全不同的键值,所以这两个键值不会挤在一块儿或者冲突。

当把它们用作散列表键值的时候会非常有效。

  另一个优点在于,键值的产生是可以逐步进行的。

例如,红马在e5格,那么键值里一定异或过一个“zobrist[KNIGHT][RED][E5]”。

如果再次异或这个值,那么根据异或的工作原理,这个“马”就从键值里删除了。

  这就是说,如果有当前局面的键值,并且需要把红马从e5移到f7,你只要异或一个“红马在e5”的键值,把马从e5格移走,并且异或一个“红马在f7”的键值,把红马放在f7上。

比起从头开始一个个棋子去异或,这样做可以得到同样的键值。

  如果要改变着子的一方,只要异或一个“改变着子方”的键值就可以了。

用这种方法,可以在搜索根结点的时候构造一个Zobrist键值,在搜索时通过走子函数“MakeMove()”来更新键值,一直让它保持和当前局面同步。

3.3.3Zobrist键值的实现方法

  实现Zobrist必须从多维的64位数组开始,每个数组含有一个随机数。

在Java中,“rand.nextLong()”函数返回一个64位的随机数值。

这个函数用来填满一个long型(64位)的三维数组:

棋子的类型、棋子的颜色和棋子的位置:

longzobrist[pcMAX][coMAX][sqMAX];

  程序启动时就把这个数组用随机数填满。

要为一个局面产生Zobrist键值,首先把键值设成零,然后找棋盘上的每个子,并且让键值跟“zobrist[pc][co][sq]”做异或(通过“^”运算符)运算。

  如果局面由红方走,那么别去动它,如果是黑方走,你还要在键值上异或一个64位的随机常数。

3.3.4Java中实现Zobrist键值

本系统使用一个key和一个lock结合来区分每个局面,这样发生冲突(即两个局面对应的key和lock一样)的概率几乎为0。

示例代码及相关说明如下

3.3.4.1填充数组

上述的三维数组现在改变为二维(

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

当前位置:首页 > 工程科技 > 能源化工

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

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