基于java语言的中国象棋设计与实现

基于java语言的中国象棋设计与实现
基于java语言的中国象棋设计与实现

题目:基于JA V A语言的中国象棋设计与实现

毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:

指导教师签名:日期:

使用授权说明

本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:

【摘要】

电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来,随着人工智能及计算机硬件的发展,计算机象棋程序的水平也不断地得到提高。

本文通过研究中国象棋的国内外研究现状、分析中国象棋的需求和用JA V A 语言设计中国象棋程序的可行性,同时根据国际象棋程序设计的一些成功经验,主要借鉴了位棋盘、Zobrist键值等,针对中国象棋程序设计的一系列问题,总结出一些中国象棋程序的设计方法。根据该方法设计出了符合中国象棋行棋和吃子规则,能够判断胜负,能够实现悔棋、重新开始等多种功能,而且界面十分美观的中国象棋程序,并给出了JA V A语言的实现方法。

关键词:中国象棋,位棋盘,Zobrist键值,着发生成

【Abstract】

The implement of playing Chinese Chess on computer has just started. Although large numbers of professional websites and professional chess software arised in domestic, the lack of necessary basic work causes the advantage of computer technology applications in Chinese chess can’t be reflected. With the development of artificial intelligence and computer hardware, the level of computer chess program continues to be improved.

This paper studies the research status of Chinese chess, analyzes the demand of Chinese chess, and learns the feasibility of Chinese chess that is designed by Java language. At the same time, the function is designed with the successful experience of chess program, such as the place board, Zobrist keys, etc. Chinese chess program is summarized some ways to design Chinese chess program for solve a range of issues. Follow this ways, it designs all the rules and funtions which adapt to the requirement of Chinese chess, including of movement, judgement, undo, re-start and so on.The application gives the implementation method in JA V A language and beautiful interface.

Keywords: Chinese Chess, bit board, zobrist keys

目录

1绪论 (1)

1.1研究背景 (1)

1.2研究意义 (1)

1.3预期目标 (1)

2分析 (3)

2.1需求分析 (3)

2.2可行性分析 (3)

2.3功能分析 (3)

2.4硬件环境 (4)

2.4.1开发环境 (4)

2.4.2运行环境 (4)

3界面设计框架 (5)

3.1程序的框架 (5)

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

3.2.1 什么是位棋盘 (5)

3.2.2 位棋盘的作用 (6)

3.2.3 位棋盘的基本运算 (6)

3.2.4 Java中位棋盘的实现 (6)

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

3.3.1 比较局面的方法 (9)

3.3.2 Zobrist键值的工作原理 (9)

3.3.3 Zobrist键值的实现方法 (10)

3.3.4 Java中实现Zobrist键值 (10)

4系统实现 (12)

4.1着法生成 (12)

4.1.1伪合法着法的生成 (12)

4.1.2 合法着法的生成 (17)

4.2算法实现 (20)

4.2.1 行棋规则算法实现 (20)

4.2.2界面功能算法实现 (23)

5结论 (26)

参考文献 (27)

附录 (28)

附录1算法主程序 (28)

附录2程序截图 (53)

外文文献与翻译 (54)

致谢 (63)

1绪论

1.1研究背景

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

棋类运动的推广和发展是需要靠信息技术来推动的,时下盛行的国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利,也极大的促进了国际象棋的发展。国际象棋软件有着成功的商业运作,已发展成一种产业。在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。

1.2研究意义

我国现在正处于飞速发展的阶段,想要提高我国的国际地位、让世界更好的了解我国,不仅要依靠经济和政治的影响,更要注重文化传播的作用。中国象棋是我国起源最早(最早出现于战国时期)、也是我国保存最为完整的棋类运动之一,他的行棋规则和棋子、棋盘的设计都蕴函着丰富的中国文化。中国象棋的艺术和棋理折射着以儒家思想为正统的东方民族文化精神,深为我国各阶层人民喜爱。但是中国象棋在国际上的普及率仍然很低,并因此未被入选2010年广州亚运会的竞赛项目。

想要提高中国象棋的知名度和普及率,就必须要有一个大众化的中国象棋游戏平台,电脑游戏无疑是最佳选择。然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。因此,我们迫切的需要一个更加基础、更加实用的中国象棋对战平台。

1.3预期目标

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

其次具体的实现。设计出一个基于JA V A语言的中国象棋对战平台,由于中国象棋比较复杂,所以主要设计出一个人、人对战的平台,这个平台必须符合中国象棋规则(包括胜负、

走棋、悔棋、吃子、判断胜负等主要功能,各棋子按象棋规则走动),如果时间允许,可进一步实现一些附加功能,包括美观的界面、对战双方交流、添加背景音乐等。

最后,依据框架和目标编写代码,实现主要功能并且进行测试,直至程序运行成功。最终在深入研究理论的基础上,实现基于JAVA语言设计的中国象棋,做出预期的完整游戏。

2分析

2.1需求分析

现在全球超过十亿台计算机正在被使用,并且这个数目还在逐渐增加,计算机已经深入到我们生活的各个方面。而我们使用计算机时,游戏所占的比重很大。棋类游戏作为一种简单易学的休闲游戏,一直深受广大群众的喜爱。JA V A作为一种程序编写的语言,在软件市场的影响力快速提高,潜力巨大。因此用JA V A编写的中国象棋游戏有着很大的开发潜力。

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

2.2可行性分析

随着计算机的普及和应用,电子游戏已经深入到我们生活的各个方面,利用电子游戏推广我国文化、增加我国传统游戏的市场占有率,是将我国文化推向世界的比较便捷的一种方式。中国象棋作为我国保存最完整、最能代表我国古代文化的游戏之一,它的推广能够让世界更加了解中国。

JA V A与C++语言非常相近,但JA V A比C++简单,它抛弃了C++中的一些非必要的功能。用JA V A编写的中国象棋程序实现了人与人的对弈,符合中国象棋的行棋规则,界面美观,能够激起玩家的兴趣,同时单机游戏对计算机的环境要求十分简单、易于实现。

2.3功能分析

打开游戏,鼠标所在的功能键会突出显示,点开新游戏后,原本的“欢迎使用象棋对弈系统”会变成提示“红棋走棋”或“黑棋走棋”。单击选中的棋子时,该棋子会不停闪烁,如果符合规则,则可以移动到指定位置。

在进行人与人之间对战时,按照红先黑后的顺序进行,并把下棋的每一步过程记录下来,在对战时能进行悔棋功能,对悔棋次数没有限定,玩家可以再玩之前自己约定,增加了游戏的灵活性。在行棋时依照“马走日,象走田,车、炮走直线、士在框内走斜线,卒未过河是上下走、过河可左右行走且不能回头,将、帅只能在框内行走”等行走规则,且按照“炮必须隔一个棋子才能吃棋子,其他棋子按棋子行走规则的位置实现吃子”的规则,完全符合象棋的行棋规则。

2.4硬件环境

2.4.1开发环境

1、硬件环境

CPU:AMD Turion(tm)64*2 1.80GH

内存:DDR 1.5G

硬盘:80G

2、软件环境

操作系统:WINDOWS XP

开发语言:JA V A

2.4.2运行环境

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

2、Microsoft Windows 9X/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)111111111 000000000 101010101 000000000 000000000 101010101 000000000 010000010 000000000 111111111(Low,0,i0)

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

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

黑棋

111111111

000000000

010000010

101010101

000000000

000000000

101010101

000000000

010000010

000000000

111111111

红棋

3.2.3 位棋盘的基本运算

1、与(&)

0 1 0 1

1 0 0 1 ————0 0 0 1 2、或(|)

0 1 0 1

1 0 0 1

————

1 1 0 1

3、异或(^)

0 1 0 1

1 0 0 1

————

1 1 0 0

4、取补(~)

a = 0001,

~a = 1110。

3.2.4 Java中位棋盘的实现

3.2.

4.1 位棋盘类的实现

Java中,位棋盘用3个int型的数据表示,最高六位不用。Java中“与、或、非、异或、左位移,右位移(注意,位棋盘的右位移是无符号位移)”分别是“&、|、^、<<、>>”。代码摘要(详细代码见附件)及相关说明如下:

public class BitBoard{

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

public BitBoard(int Arg1, int Arg2, int Arg3) {//构造函数

Low = Arg1;

Mid = Arg2;

Hi = Arg3;

}

public static BitBoard opAnd(BitBoard arg1,BitBoard arg2) {

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

int low=arg1.Low & arg2.Low;

int mid=arg1.Mid & arg2.Mid;

int hi=arg1.Hi & arg2.Hi;

return new BitBoard(low,mid,hi);

}

public static BitBoard opOr(BitBoard arg1,BitBoard arg2)

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

public static BitBoard opXor(BitBoard arg1,BitBoard arg2)

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

public static int count(BitBoard arg) //计算位棋盘中非零位的个数

public static BitBoard duplicate(int arg) //复制位棋盘

public static boolean equals(BitBoard arg1,BitBoard arg2)

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

public static BitBoard leftShift(BitBoard arg,int num)

//位棋盘arg左位移num位

public static rightShift(BitBoard,int num) //位棋盘右位移num位

public static int LSB(BitBoard Arg) //位棋盘最低非0位的位置(从0开始计数)

public static int MSB(BitBoard Arg) //位棋盘最高非0位的位置(从0开始计数)

public static boolean notZero(BitBoard Arg) //是否非“0”。当90位中有非0位时返回true。

}

3.2.

4.2 位棋盘的初始化

某些位棋盘从程序开始运行到结束都不会改变。例如上面所述的那个位棋盘数组“knight[90]”。(他实际上记录了当“马”在任意格子上时,它下一步可以走的格子。)这个数组将在程序开始执行的时候被初始化并且不再改变。其余的位棋盘将不断变化。例如“AllPieces”位棋盘。当中国象棋棋盘变化时,它也跟着变化。然而,他们的初始化方式相同。对于诸如knight[90]这样不变化的位棋盘的初始化,将在“伪着法生成”章节详述。此处叙述走棋过程中随棋局变化的诸多位棋盘的初始化及相关操作。

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

BitBoard b = new BitBoard(0,0,1);

for (int c = 0; c < 90; c ++) {

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

}

其次,用一个叫ChessPosition类记录棋盘上某一状态的所有有用信息。它包含了一个整型数组int piece_in_square[90],还包含了一些位棋盘。

public class ChessPosition {

int piece_in_square[90];

int player; //轮到哪方走棋,2:红方走,1:黑方走

BitBoard allPieces;

BitBoard redKing;//红帅

BitBoard blackKing;//黑将

BitBoard redRooks;//红车

BitBoard blackRooks;//黑车

BitBoard redKnights;//红马

BitBoard blackKnights;//黑马

BitBoard redCannon;//红炮

BitBoard redCannon;//黑炮

BitBoard redBishops;//红相

BitBoard blackBishops;//黑象

BitBoard redAdvisor;//红仕

BitBoard blackAdvisor;//黑士

BitBoard redPawns;//红兵

BitBoard blackPawns;//黑卒

BitBoard redPieces;//所有红棋子

BitBoard blackPieces;//所有黑棋子

};

初始化“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; c < 90; c ++) {

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。

/* clear a bit with the "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];

/* set a bit with the "OR" operation */

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

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

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

/* clear the captured piece */

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.2 Zobrist键值的工作原理

3.3.2.1 Zobrist键值的工作原理

用Zobrist技术产生的键值,表面上与局面没什么关系。如果一个棋子动过了,就会得到完全不同的键值,所以这两个键值不会挤在一块儿或者冲突。当把它们用作散列表键值的时候会非常有效。

另一个优点在于,键值的产生是可以逐步进行的。例如,红马在e5格,那么键值里一定异或过一个“zobrist[KNIGHT][RED][E5]”。如果再次异或这个值,那么根据异或的工作原理,这个“马”就从键值里删除了。

这就是说,如果有当前局面的键值,并且需要把红马从e5移到f7,你只要异或一个“红马在e5”的键值,把马从e5格移走,并且异或一个“红马在f7”的键值,把红马放在f7上。比起从头开始一个个棋子去异或,这样做可以得到同样的键值。

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

3.3.3 Zobrist键值的实现方法

实现Zobrist必须从多维的64位数组开始,每个数组含有一个随机数。在Java 中,“rand.nextLong()”函数返回一个64位的随机数值。

这个函数用来填满一个long型(64位)的三维数组:棋子的类型、棋子的颜色和棋子的位置:

long zobrist[pcMAX][coMAX][sqMAX];

程序启动时就把这个数组用随机数填满。要为一个局面产生Zobrist键值,首先把键值设成零,然后找棋盘上的每个子,并且让键值跟“zobrist[pc][co][sq]”做异或(通过“^”运算符)运算。

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

3.3.4 Java中实现Zobrist键值

本系统使用一个key和一个lock结合来区分每个局面,这样发生冲突(即两个局面对应的key和lock一样)的概率几乎为0。示例代码及相关说明如下

3.3.

4.1填充数组

上述的三维数组现在改变为二维(将颜色与棋子兵种类型合并)

……

public static long ZobristKeyPlayer;//改变走子方的key

public static long ZobristLockPlayer;//改变走子方的lock

public static long[][] ZobristKeyTable = new long[14][90];

public static long[][] ZobristLockTable = new long[14][90];

……

static{

……

zobristGen();

}

public static void zobristGen() {

int i, j;

Random rand = new Random();

long RandSeed;

RandSeed = 1;

rand.setSeed(RandSeed);

ZobristKeyPlayer = rand.nextLong();

for (i = 0; i < 14; i ++) {

//0:红帅1:红仕2:红相3:红马4:红车5:红炮6:红兵

//7:黑将8:黑士9:黑象10:黑马11:黑车12:黑炮13:黑卒for (j = 0; j < 90; j ++) {

ZobristKeyTable[i][j] = rand.nextLong();

}

}

ZobristLockPlayer = rand.nextLong();

for (i = 0; i < 14; i ++) {

for (j = 0; j < 90; j ++) {

ZobristLockTable[i][j] = rand.nextLong();

}

}

}

3.3.

4.2移子函数

当移动(添加、删除)一个棋子时,将当前局面的Zobrist键值与键值表中该棋子的键值进行异或操作,同时也与改变走子方的键值进行异或操作。

public class ChessPosition{

long ZobristKey, ZobristLock;

//当前局面的zobrist键值

public ChessPosition{

……

ZobristKey=0;//初始化为0

ZobristLock=0;

……

}

……

public void makeMove(int Square, int Piece, boolean IsAdd) {

……

ZobristKey^=ZobristKeyTable[PieceType][Square];

ZobristLock^=ZobristLockTable[PieceType][Square];

ZobristKey ^= ZobristKeyPlayer;//改变走子方

ZobristLock ^= ZobristLockPlayer;

……

}

}

4系统实现

4.1着法生成

着法生成在不同的象棋引擎中差异较大。我选择使用位棋盘生成着法的基本原理。之所以用这种方式生成着法,是因为生成着法耗费一定的时间。如果引擎在检查了一部分着法后发现了必须走的棋,那它就无需生成余下的棋步了。因此,可能先生成所有吃子的着法,如果没有满意的棋再生成余下的着法。

国际象棋引擎Crafty(其作者是Robert Hyatt博士)使用三个着法生成函数。一个用来生成所有伪合法吃子着法,一个生成所有伪合法不吃子着法,最后一个生成所有摆脱被将军状态的着法。注意前两个函数生成的是伪合法的着法。中国象棋的着法生成与此类似,先生成所有伪合法的着法,存入静态数组中。在对局中可以用“查表”的方式查找生成的伪着法,并对其合法性作出判断。这样可以节省大量的时间。

4.1.1伪合法着法的生成

4.1.1.1伪合法着法包含几类:

1、各兵种的不吃子着法;

2、各兵种的吃子着法;

3、“将”和摆脱“将”的着法。

其中,马、相(象)、兵、帅(将)、仕(士)的吃子着法与其对应的不吃子着法规则相同。(伪合法着法并不考虑被吃的棋子的颜色——该棋子是对方的棋子还是己方的棋子,也不考虑该子是否能动,例如动了该子,双方的帅将会面。)炮和车的不吃子着法规则相同,但分为纵向横向行走两类。炮的吃子着法分为纵向和横向两类,车的吃子着法也分为纵向和横向两类。马和象的着法要考虑蹩马腿和塞象眼。将军的着法单独作为一类。

本程序使用静态数组存储生成的伪合法着法,先对其作一些说明。

4.1.1.2数组及其下标的含义:

1、保存帅(将)、仕(士)、相(相)、马、兵的伪合法静态数组如下:

public static final int[][] KingMoves=new int[90][8];

public static final int[][] AdvisorMoves=new int[90][8];

public static final int[][] BishopMoves=new int[90][8];

public static final int[][] ElephantEyes=new int[90][4];

public static final int[][] KnightMoves=new int[90][12];

public static final int[][] HorseLegs=new int[90][8];

public static final int[][][] PawnMoves=new int[90][2][4];

第一个下标说明棋子所在的格,第二个下标含义不尽相同。帅(将)在某个位置最多有4种走法,例如KingMoves[13][0]=12表示帅在13格(e1格)时可以走到12格(当然,也可以走到14、4、22格,保存到其他几个数组元素中)。第5种(如果前面只有3种着法,则此处是第4种)保存的是非法着法即KingMoves[13][4]=-1,其作用作为查询算法的“哨兵”,提高查询算法的速度。为了速度(以位移运算取代除法运算),第2个坐标值用2的整次方幂。(在后面所讲的开局库和置换表的大小设置是2的整次方幂也是这个道理。)兵的走棋规则需要分颜色,红色的垂直走棋方向和黑色的垂直走棋方向是相反的。兵最多有三种走棋方法。AdvisorMoves[90][8]保存的是士的着法。BishopMoves[90][8]保存的是相(象)的着法,ElephanEyes[90][4]保存的是相(象)着法对应的塞象眼的位置。KnightMoves和HorseLegs是马的着法和蹩马腿的位置。

2、车、炮的伪合法着法静态数组如下:

public static final int[][][] FileNonCapMoves=new int[10][1024][12];

//共十条横线,FileNonCapMoves[y][bitWordY][index]=newY,进

public static final int[][][] FileRookCapMoves=new int[10][1024][4];

public static final int[][][] FileCannonCapMoves=new int[10][1024][4];

public static final int[][][] RankNonCapMoves=new int[9][512][12];

//RankNonCapMoves[x][bitWordX][index]=newX,平

public static final int[][][] RankRookCapMoves=new int[9][512][4];

public static final int[][][] RankCannonCapMoves=new int[9][512][4];

public static final int[][] FileNonCapMax=new int[10][1024];

//FileNonCapMax[y][bitwordY]=MaxY//进退

public static final int[][] FileNonCapMin=new int[10][1024];

//FileNonCapMax[y][bitwordY]=MinY

public static final int[][] FileRookCapMax=new int[10][1024];

public static final int[][] FileRookCapMin=new int[10][1024];

public static final int[][] FileCannonCapMax=new int[10][1024];

public static final int[][] FileCannonCapMin=new int[10][1024];

public static final int[][] RankNonCapMax=new int[9][512];//平

public static final int[][] RankNonCapMin=new int[9][512];

public static final int[][] RankRookCapMax=new int[9][512];

public static final int[][] RankRookCapMin=new int[9][512];

public static final int[][] RankCannonCapMax=new int[9][512];

public static final int[][] RankCannonCapMin=new int[9][512];

车、炮吃子着法与它们的不吃子着法规则不同,因此需要分开保存。再将着法分为水平和垂直两种(也就是进、退与平)。车炮的不吃子着法是相同的,因此,分别保存到FileNonCapMoves[10][1024][12]和RankNonCapMoves[9][512][12]中。棋盘的横线合纵线分别有10条和9条,这就是数组第一个下标10和9的含义,用来指示车炮在哪条横线或纵线上。第二个坐标的含义,以横线走法示例如下:例如,第二条横线上的棋子如下(有棋子的用1表示,炮或车的位置用x表示,实际上x也是1):

001100x01

那么,

RankNonCapMoves[2][101][0]=-1

RankNonCapMoves[2][101][1]=1

RankNonCapMoves[2][101][2]=2

RankNonCapMoves[2][101][3]=0

上面的下标101就是001100101对应的二进制值,数组元素的值-1、1、2表示可行走格子的增量。

RankRookCapMoves[2][101][0]=-2

RankRookCapMoves[2][101][1]=3

RankRookCapMoves[2][101][2]=0

以上是车吃子的走法。下面是炮吃子的着法:

RankCannonCapMoves[2][101][0]=-2

RankCannonCapMoves[2][101][1]=4

RankCannonCapMoves[2][101][2]=0;

下面是最大的位移量和最小的位移量,用来生成合法着法时初步判断着法的合法性:

RankNonCapMax[2][101]=2 //不吃子着法中最大的格子增量

RankNonCapMin[2][101]=-1 //不吃子着法中最小的格子增量

RankRookCapMax[2][101]=3//车吃子着法中最大的格子增量

RankRookCapMin[2][101]=-2//车吃子着法中最小的格子增量

RankCannonCapMax[2][101]=4//炮吃子着法中最大的格子增量

RankCannonCapMin[2][101]=-2//炮吃子着法中最小的格子增量

以上是横向(平)着法的静态数组,纵向着法的表示与此类似,在此不再赘述。

3、“照将”着法

public static final BitBoard[] CheckLegs=new BitBoard[18];

//帅将每个位置蹩马腿的位棋盘

public static final BitBoard[][] KnightPinCheck=new BitBoard[18][256];

04747java语言程序设计(一)20120年01月试卷

全国2012年1月高等教育自学考试 Java语言程序设计(一)试题 课程代码:04747 一、单项选择题(本大题共10小题,每小题1分,共l0分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.下面供选字符序列中,不属于 ...Java语言关键字的是( ) A.inner B.throw C.false D.throws 2.表达式“-1>>>1”的十进制值是( ) A.-2 B.231-1 C.-(231-1) D.232-1 3.Java语言中,在类定义时用final关键字修饰,是指这个类( ) A.子类必须实现父类未实现的方法 B.没有具体实现代码 C.必须要有实例 D.不能被继承 4.表达式"java程序设计".1ength()的值是( ) A. 0 B.12 C. 8 D.13 5.以下关于BorderLayout布局的叙述中,不正确 ...的是( ) A.把容器内的空间划分成5个区域 B.加入组件应该指明要放入的区域 C.是框架窗口的默认布局 D.一个位置可直接放多个组件 6.利用文件对话框打开或保存文件,在打开文件对话框之前,可用FileFilter类设置筛选条件,其所用的两个方法是( ) A.accept()和getSelectedFile() B.accept()和getDescription() C.accept()和setDescription() D.setDescription()和getDescription() 7.设已经有Graphics2D对象g2d,RoundRectangle2D对象rRect,绘制对象rRect的代码是( ) A.g2d.draw(rRect) B.g2d.drawRoundRect(rRect) C.rRect.draw() D.rRect.drawRoundRect() 8.以下关于线程互斥和同步的叙述中,正确的是( ) A.临界段是线程互斥使用资源的程序段 B.临界段能使线程使用其它线程的资源 浙04747# Java语言程序设计(一)试卷第1页(共12页)

Java语言程序设计课后习题答案

Java语言程序设计(郑莉) 第二章习题答案 1.什么是对象、类,它们之间的联系 答:1)对象是包含现实世界物体特征的抽象实体,它反映系统为之保存信息和与它交互的能力。对象是一些属性及服务的封装体,在程序设计领域,可以用“对象=数据+作用于这些数据上的操作”来表示。现实生活中对象是指客观世界的实体;在程序中对象是指一组变量和相关方法的集合。 2)类是既有相同操作功能和相同的数据格式的对象的集合与抽象!3)两者的关系:对象是类的具体实例.。 2.什么是面向对象的程序设计方法它有那些基本特征 答:面向对象程序设计从所处理的数据入手,以数据为中心而不是以服务为中心来描述系统。它把编程问题视为一个数据集合,数据相对于功能而言,具有更强的稳定性。 它的特征:抽象,封装,继承,多态。 3(无用) 4.请解释类属性、实例属性及其区别。 答:实例属性,由一个个的实例用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同。 5.请解释类方法、实例属性及其区别。 答:实例方法表示特定对象的行为,在声明时前面不加static修饰符,在使用时需要发送给一个类实例。 类方法也称为静态方法,在方法声明时前面需加static修饰符,类方法表示具体实例中类对象的共有行为。 区别:实例方法可以直接访问实例变量,调用实例方法,实例方法可以直接访问类变量,调用类方法;类方法可以直接调用类变量和类方法,类方法不能直接调用实例变量和实例方法; 6.类的访问控制符有哪几种具体含义及其区别。 答:类的访问控制符只有public(公共类)及无修饰符(默认类)两种。 区别:当使用public修饰符时表示所有其他的类都可以使用此类;当没有修饰符时,则只有与此类处于同一包中的其他类可以使用类。 7类成员的访问控制符有哪几种他们对类成员分别有哪些访问限制的作用 答:类成员的访问控制符有 public,private,protecte及无修饰符. public(公有的):用public修饰的成分表示公有的,也就是它可以被其他任何对象访问(前提是对累成员所在的类访问有访问权限). Private(保护的):类中限定为private的成员只能被这个类本身 访问,在类外不可见。 proteced(保护的)用该关键字修饰的成分是受保护的,只可以被同一类及其子类的实例对象访问。 无修饰符(默认的):public,private,protected这个三个限定符不是必须写的。如果不写,则表明是“friendly”,相应的成分可以被所在保重的各类访问。 8简述构造方法的特点答:构造方法主要有以下特点: (1)构造方法的方法名与类名相同; (2)构造方法没有返回类型(修饰符void也不能有);(3)构造方法通常被声明为公有的(public); (4)构造方法可以有任意多个参数; (5)构造方法的主要作用是完成对象的初始化工作; (6)构造方法不能在程序中显式的调用; (7)在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化。 9如果在类声明中声明了构造方法,系统是否还提供默认的构造方法 答: 用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不会再赋默认的构造方法。 10:声明Patient类表示在门诊室中的病人。此类对象应包括name(astring)\sex(achar)、age(an integer)、weight(a float0、allergies(a boolean). 声明存取及修改方法。在一个单独的累中,声明测试方法,并生成两个patient的例子: Atient april=new Patient(); (“zhangli”) (‘f’);; (330; ; (true); 那么:”+()); ”+()); ”+()); (“weught: ”+());\ ”+()); 声明并测试toString()方法显示一个病人的aga、sex、name及allergies属性。 答: public class Patient { private String name; private char sex; private int age; private float weight; private boolean allergies; public void setname(String a) { name=a; } public void setsex(char b) { sex=b; }

《Java语言程序设计基础教程》习题解答

《Java语言程序设计基础教程》练习思考题参考答案

第1章Java程序设计概述 1.9 练习思考题 1、?Java运行平台包括三个版本,请选择正确的三项:( ) A. J2EE ????? B. J2ME C. J2SE? D. J2E 解答:A,B,C 2、JavaJDK中反编译工具是:() A.javac??B. java ?C. jdb ???D. javap 解答:D 3、?public staticvoid main方法的参数描述是:( ) A.String args[]??? B.String[] args C. Strings args[] ?? D.Stringargs 解答:A,B 4、在Java中,关于CLASSPATH环境变量的说法不正确的是:() A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B.编译器用它来搜索各自的类文件。 C. CLASSPATH是一个目录列表。 D. 解释器用它来搜索各自的类文件。 解答:A 5、编译Java Application源文件将产生相应的字节码文件,扩展名为( )?A. .java??????B..class C. .html ??D..exe 解答:B 6、开发与运行Java程序需要经过的三个主要步骤为____________、____________和____________。 7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是______类的子类并且存储该源程序文件的文件名为______。 8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生______个文件名与类名相同而扩展名为______的字节码文件。 9、开发与运行Java程序需要经过哪些主要步骤和过程? 10、Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎么样的? 11、编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很

JAVA课程设计 五子棋

攀枝花学院课程业设计 五子棋 学生姓名: 学号: 所在院(系):数学院计算机学院专业:信息与计算科学指导教师:讲师 二〇一四年六月 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书 注:任务书由指导教师填写。

摘要 五子棋作为一类棋类竞技运动,现在很流行,很多人把它作为一类开发智力的一种游戏,锻炼人的思维。这次课题主要是完成人机对战,在对战中电脑根据人的思维做出相应的反应,电脑对战中通过深度的搜索,使得自身有更大的胜算,估值计算也是一种方法,可以提高电脑的智能度。分析模块中影响智能的因素也不少,通过节点比较与节点连接后的结果做出估计提高智能,了解递归算法、电脑学习等对此有很大帮助。算法是程序的灵魂,一旦算法正确那么程序将很好。不同的人工智能将会有不同的帮助,多去了解将更能提高智能程度。五子棋是我国的一门文化,这将使得它更受世界人们的欢迎。有助我国文化发展。 关键词五子棋,智能,算法,模块,人机对战

目录 1 需求分析 (1) 1.1需求来源 (1) 1.2设计目的 (1) 2 功能需求分析 (1) 2.1功能需求 (1) 3 设计与实现 (2) 3.1设计思想 (2) 3.2系统模块结构 (2) 3.3流程图 (2) 4 概要设计 (4) 4.1抽象数据类型定义 (4) 4.2程序包含模块 (4) 4.3模块间关系 (4) 4.4系统功能实现 (4) 5 模块设计 (5) 5.1主界面模块 (5) 5.2选择模块 (5) 5.3判断模块、 (5) 5.4显示模块 (5) 参考文献 (9)

1 需求分析 1.1需求来源 计算机在我们的生活中有越来越重要的角色,我们也越来越离不开计算机,计算机带给我们许多便利,学习好计算机知识已经是必不可少的一项技能了。特别是电子商务、电子邮件等,人工智能现在的热点方向,人们感叹计算机的高效是也感叹自己的聪明,人工智能现在是很好的以方面。 1.2设计目的 该软件为用户提供一个在Windows系统上运行的五子棋游戏小系统。应达到的目的是:建立人机对战的模块,可以机器思考如何应对。已达到提高智力的效果设计出五子棋的游戏界面,创建对象可以在地图中站位,在每一步后计算机会自己运算自己的下一步,任何一方不可以越界,当一方达到五子是判断谁是胜利者,在过程中尽量使得游戏智能程度更高。 2 功能需求分析 2.1功能需求 现在研究五子棋的算法已经很多了,比较经典的有递归、二叉树等,这也是很基础的,不同算法要求也不同,要求的能力也不同,每一种算法都是使得程序清晰明白,当五子相连就算胜利。故我们要理解中间过程。 每个代码实现功能也是不同的,有的是判断,有的是理解,有的是更好知道程序,程序在执行时我们可以知道哪里出错。哪里会有问题,修改便利。、在错误中学习,加强自己的基础知识与算法的能力。

java程序设计基础(含参考答案)

“Java程序设计基础”课程习题 一、填空 1.Java程序分两类___Applet___和application,Java Application 类型的程序,程序从 ___main方法___开始执行。 2.定义一个Java类时,通过关键字__extends____指明该类的父类。一个类可以有___1___ 个父类。 3.用public修饰的类称为_公有类或公用类__。用public修饰的类成员称为公有成员。被 说明为public的内容可以被__所有其他类___ 使用。如果public类文件与使用它的类文件不在同一目录中,需要通过__import____语句引入。 4.用___private___ 修饰的类成员称为私有成员。私有成员只能在__本类__ 中使用。 5.如果子类定义的成员变量与父类的成员变量同名,称为___方法覆盖___ ,要表明使用 子类的成员变量,可以在成员变量前加上关键字__super___ 。 6.____Object__ 类是Java类库中所有类的父类。 7.Java字符使用__16位的字符集,该字符集成为__Unicode____ 。 8.当子类中定义的方法与父类方法同名时,称子类方法___覆盖___ 父类方法,子类默认 使用自己的方法。使用父类的同名方法,必须用关键字__super__ 说明。 9.Java源程序文件名的后缀是___.java___,Java字节码文件名的后缀是_.class_____。 10.Java类名的第一个字母通常要求___大写___。 11.Java程序由____类__组成,每个程序有一个主类,Java程序文件名应与____主__类的 名称相同。 12.Java__Application_类型的程序需要main()方法,程序从__main____开始执行。 13.布尔型数据类型的关键字是_boolean__ ,占用位数是___1位___ ,有__true__ 和_false_ 两种值。整型数可以采用_十_ 、__八_ 和__十六_三种进制表示。 14.八进制整数以数字__0_开头。十六进制整数以_0x或0X_ 开头。 15.int整型数占用__32位内存。long整型数占用__64 位内存。 16.127L表示__长整型____ 常量。 17.根据占用内存长度将浮点常量分为_double_____ 和__float____ 两种。 18.单精度浮点常量占用__32_ 位内存,双精度浮点常量占用__64 位内存。 19.在Java语言中,字符串“ABC\tD\b\n”中包括__7个字符。 20.数学关系44&&x<9____ 。数学关系x>3且x<=10对应 的Java表达式是_x>3&&x<=10。数学关系x>3或x<-10对应的Java表达式是_x>3||x<-10_。 21.逻辑表达式true&&false&&true的结果是_false_ 。 22.__new__ 运算符的作用是根据对象的类型分配内存空间。当对象拥有内存空间时,会 自动调用类中的构造方法为对象_初始化_。 23.省略访问修饰符的类只能被同_一包_中的类使用,称之具有包访问特性。 24.用public修饰的类称为_公共类_。用public修饰的类成员称为公共成员。被说明为public 的内容可以被_所有类_ 使用。如果public类文件与使用它的类文件不在同一目录中,需要通过_import_语句引入。 25.用_private_ 修饰的类成员称为私有成员。私有成员只能在_本类使用。 26.在类中可以定义多个具有相同名称、但参数不同的方法,这种做法称为__方法重载_ 。 27.如果子类定义的成员变量与父类的成员变量同名,要表明使用子类的成员变量,可以在 成员变量前加上关键字__this__。

五子棋java设计文档

安阳工学院 JA V A课程综合项目报告 项目题目:五子棋 专业班级:12网工专升本 学生姓名:阮营营 学生学号:201203060042 指导教师姓名:许研 2012年12月 安阳工学院计算机学院制

目录 一、系统目标 (2) 二、系统设计思路 (2) 三、系统详细设计 (2) 四、系统实现 (9) 五、系统设计总结 (12) 六、参考文献 (12)

一、系统目标 1、主要是介绍开发五子棋的整个过程,体现流程设计与类设计的基本方法,示范了数组的使用,使用了分支结构与循环结构的流程控制 2、通过课程设计把课堂上讲的内容融会贯通,学会设计程序、开发应软件、开发系统软件等各项工作。 3、通过实习掌握语言的语法结构,理解类和对象的概念,准确的使用各种数据类型,对面向对象中的继承和多态的概念要理解、会使用,在程序中提高代码的重用性,使设计的程序结构清晰、易于维护。 二、系统设计思路 1、获取棋盘设计一个11╳11围棋棋盘,由两玩家交替进行对战,并可以实现以下功能。五子棋的规则为: 2、下棋方法两人分别执黑白两色棋子。轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点。 3、输赢判断每次下完一颗棋子,就通过程序从横、竖、斜各个方向扫描棋盘,如果在某个方向中,有同种颜色的棋子达到五连子,则此颜色的玩家为赢。如果没有相同颜色的棋子达到五连子,则继续游戏。 三、系统详细设计 3.1程序流程图

3.2创建棋盘类,绘制棋盘的样式 main方法创建了ChessFrame类的一个实例对象,并启动屏幕显示显示该实例对象。 public static void main(String argc[]) { myframe f = new myframe(); } 构造五子棋的主窗体: class myframe extends Frame implements WindowListener { mypanel panel; myframe() { setLayout(null); panel = new mypanel(); add(panel); panel.setBounds(0, 23, 360, 360);

Java程序设计习题附答案(一)

Java程序设计题库 第一部分绪论 1、下列关于Java语言的特点,描述错误的是(C) A.Java是跨平台的编程语言B.Java支持分布式计算 C.Java是面向过程的编程语言D.Java支持多线程 2、Java语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点?(B) A、安全性 B、多线性 C、跨平台 D、可移植 3、Java JDK中调试器的命令是(C)。 A、javac B、java C、jdb D、avah 4、运行jar文件中class文件需要在java命令后面加的参数为(A)。 A、-cp B-g C-d D-verbose 5、下面哪项在java中是不合法的标识符?(C) A、$user B、point C、You&me D、_endline 6、下面关于Java语言说法正确的是(ABCD)。 A、Java语言是面向对象的、解释执行的网络编程语言。 B、Java语言具有可移植性,是与平台无关的编程语言。 C、Java语言可对内存垃圾自动收集。 D、Java语言编写的程序虽然是“一次编译,到处运行”,但必须要有Java的运行环境。 7、在Java程序设计中,程序员创建()文件,然后编译器把它们转化为()文件。( B) A、源, HTML B、源, 字节代码 C、字节代码, 源 D、HTML, 字节代码 8、Java的JVM是指(B)。 A、由Java操作的家用设备(通常是一个漂亮的小烤箱) B、Java字节代码的解释程序 C、Java源代码的编译器 D、运行Java 所需的硬件设备 9、在Java中,关于CLASSPA TH环境变量的说法不正确的是(A)。 A、CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B、编译器用它来搜索各自的类文件。 C、CLASSPATH是一个目录列表。 D、解释器用它来搜索各自的类文件。 10、一个可以独立运行的Java应用程序(D)。

《Java语言程序设计基础教程》习题解答

《Java语言程序设计基础教程》练习思考题参考答案

第1章Java程序设计概述 1.9 练习思考题 1、Java运行平台包括三个版本,请选择正确的三项:() A. J2EE B. J2ME C. J2SE D. J2E 解答:A,B,C 2、Java JDK中反编译工具是:() A. javac B. java C. jdb D. javap 解答:D 3、public static void main方法的参数描述是:() A. String args[] B. String[] args C. Strings args[] D. String args 解答:A,B 4、在Java中,关于CLASSPATH环境变量的说法不正确的是:() A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B. 编译器用它来搜索各自的类文件。 C. CLASSPATH是一个目录列表。 D. 解释器用它来搜索各自的类文件。 解答:A 5、编译Java Application源文件将产生相应的字节码文件,扩展名为() A. .java B. .class C. .html D. .exe 解答:B 6、开发与运行Java程序需要经过的三个主要步骤为____________、____________和____________。 7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是______类的子类并且存储该源程序文件的文件名为______。 8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生______个文件名与类名相同而扩展名为______的字节码文件。 9、开发与运行Java程序需要经过哪些主要步骤和过程? 10、Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎么样的? 11、编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。

java编程题全集题及答案

J a v a程序设计总复习题 1、编写一个Java程序,用if-else语句判断某年份是否为闰年。(分支) // Programme Name LeapYear.java public class LeapYear{ public static void main(String args[]){ int year=2010; if(args.length!=0) year=Integer.parseInt(args[0]); if((year%4==0 && year%100!=0)||(year%400==0)) 年是闰年。"); else 年不是闰年。"); } }//if-else语句 2、编写一个Java程序在屏幕上输出1!+2!+3!+……+10!的和。(循 环) // programme name ForTest.java public class ForTest { public static void main( String args[] ) { int i,j,mul,sum=0; for(i=1;i<=10;i++) { mul=1; for(j=1,j<=i;j++) { mul=mul*j; } sum=sum+mul; } “1!+2!+3!+……+10!= ”+sum); } } 3、依次输入10个学生成绩,判断学生(优秀、良好、中等、及格、不及格) 并计算人数(switch) 4、使用冒泡排序(数组) public class BubbleSort { public static void main(String[] args) {

五子棋-Java课程设计

《面向对象程序设计》 课程设计报告 实验时间:2010年10月26日 实验班级:********************** 实验报告总份(片)数: 1 份(片) 实验指导老师:***** ******* 设计小组 湖南省吉首市吉首大学 课程设计报告 简单的游戏——五子棋 小组成员(姓名、学号): **(组长)** ** ** ** ** 一、实验分工

二、开发环境(实验编译以及测试环境) 硬件环境: CPU:Intel 奔腾双核E5200 主频2.5GHz 内存:2G 软件环境: 操作系统:Windows 7 编程环境JDK7.0 开发工具:Eclipse SDK 三、使用环境(用户运行环境) 硬件环境: CPU主频在500MHZ以上,内存在128M以上 软件环境: JAVA运行环境+ Windows XP或Windows 2000 以上操作系统 目录 第一章总体设计.............................................................................................................................. 1 1.1设计的目的.......................................................................................................................... 1 1.2本系统的主要功能.............................................................................................................. 1 1.3系统包含的类及类之间的关系。...................................................................................... 1 1.4 Java源文件及其功能......................................................................................................... 2 1.5 项目构建思路..................................................................................................................... 2第二章模块功能介绍.................................................................................................................. 12 2.1主类Chess...................................................................................................................... 12

Java程序设计基础习题答案

Java程序设计基础课后习题参考答案 第2章 1、关于Java Application得入口方法main()得检验: main()方法得参数名就是否可以改变? main()方法得参数个数就是否可以改变? 该方法名就是否可以改变? 参考答案:(1)main()方法得参数名可以改变.(2)main()方法得参数个数不可以改变。(3)该方法名不可以改变。 2、当一个程序没有main()方法时,能编译吗?如果能编译,能运行吗? 参考答案:当一个程序没有main()方法就是,就是可以编译通过得,但就是不能给运行,因为找不到一个主函数入口。 3、下列语句能否编译通过? bytei =127; bytej = 128; longl1 = 999999; long l2= 9999999999; 参考答案:byte i 与long l1可以编译通过。而byte j 与longl2 超出自身数据类型范围,所以编译失败。 4、下列语句能否编译通过? float f1 =3、5; float f2 = 3.5f; 参考答案:java中浮点型得数据在不声明得情况下都就是double型得,如果要表示一个数据就是float型得,必须在数据后面加上“F”或“f”;因此,floatf1 无法编译通过。 5、验证int 与char,int与double等类型就是否可以相互转换。 参考答案:(1)char类型可以转换为int 类型得,但就是int类型无法转换为char类型得;(2)int 可以转换为double类型得,但就是double类型无法转换为int 类型得。 6、计算下列表达式,注意观察运算符优先级规则。若有表达式就是非法表达式,则指出不合法之处且进行解释。 (1)4+5 == 6*2 ?(2) (4=5)/6?? (3)9%2*7/3>17(4)(4+5)<=6/3 ? (5) 4+5%3!=7-2????(6)4+5/6〉=10%2 参考答案:表达式(2)为不合法表达式,只能将值赋值给一个变量,因此其中(4=5)将5赋值给4就是不合法得. 7、下列()就是合法得Java标识符。 (1)Counter1 ??(2)$index, (3) name-7 ??(4)_byte

java语言程序设计课后习题答案

习题2 3.使用“= =”对相同内容的字符串进行比较,看会产生什么样的结果。 答:首先创建一个字符串变量有两种方式:String str = new String("abc"); String str = "abc"; 使用“= =”会因为创建的形式不同而产生不同的结果: String str1 = "abc"; String str2 = "abc"; =str2); ; public class Exercise51{ public static void main(String[] args) throws IOException{ "请输入一个整数:"); InputStreamReader isStream=new InputStreamReader; BufferedReader bfReader=new BufferedReader(isStream); String input=(); int length=()-1; int n=new Integer(input).intValue(); while(length>=0){ int divisor=(int) (10,length); length=length-1; int output=n/divisor; n=n%divisor; ","); } } } 法二:(建议使用) public class Exercise5{ public static void main(String[] args){ int n=1678; int unit; int decimal; int hundred; int thousand; thousand=n/1000%10; hundred=n/100%10; decimal=n/10%10; unit=n%10; "1678包含的数字分别是: "+thousand+','+hundred+','+decimal+', '+unit); } } ;

Java程序设计-习题参考答案

参考答案 第1章 3、计算机系统由哪两部分组成的?计算机硬件结构由哪几部分组成?它们各自有什么作用? 一台计算机由硬件和软件组成。一台典型的计算机由五大部分组成。这五大部分是:运算器,控制器,存储器,输入设备和输出设备。 运算器是执行算术运算和逻辑运算的部件。 控制器是向计算机其他部分发送命令的部件。 存储器是计算机用来存储数据、信息的部件。 输入设备就是外界向计算机输入信息设备。 输出设备恰好与输入设备的作用相反,它将处理过后的信息输出呈现给用户。 9、将以下十进制数转换为对应的二进制数 (1)32 (2)97 (3)256 (4)500 (1)100000 (2)1100001 (3)100000000 (4)111110100 第2章 1.Java语言有哪些主要特点。 平台独立性 安全性 多线程 网络化 面向对象 3.Java Application的开发步骤有哪些。 Java Application的开发步骤: (1)下载JDK软件并安装; (2)配置相应的环境变量(path和classpath); (3)编写Java源程序(文本编辑器或集成开发环境IDE); (4)编译Java源程序,得到字节码文件(javac *.java); (5)执行字节码文件(java 字节码文件名)。

4.什么是环境变量,设置环境变量的主要目的是什么。 环境变量的配置主要是为了进行“寻径”,也即让程序能找到它需要的文件,所以设置的内容就是一些路径。 第3章 1.Java语言对于合法标识符的规定是什么?指出以下哪些为合法标识符。 a a2 3a *a _a $a int a% 在Java语言中,标识符必须以字母、美元符号或者下划线打头,后接字母、数字、下划线或美元符号串。另外,Java语言对标识符的有效字符个数不做限定。 合法的标识符: a a2 _a $a 5.数据类型强制转换的原则是什么?如何转换? 对于变窄转换,如long到short、double到float,或者不兼容转换:float到short、char 到short等,则需要进行强制转换。 float f = 11.5; short b ; b = (short)f; (强制转换) 第4章 5.用穷举法求出3位数中百、十、个位数的立方和就是该数的数。 public class Test { public static void main(String[] args) { int a,b,c,x=100; while(x<1000){ a=x%10; b=(x%100-a)/10; c=(x-x%100)/100; if(a*a*a+b*b*b+c*c*c==x) System.out.println(x); x+=1;

《JAVA程序设计》(含答案)

《JA V A程序设计》练习题 一、单选择题 1、编译Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为( B )。 A. java B. .class C. html D. .exe 2、设x = 1 , y = 2 , z = 3,则表达式y+=z--/++x 的值是( A)。 A. 3 B. 3. 5 C. 4 D. 5 3、不允许作为类及类成员的访问控制符的是( C )。 A. public B. private C. static D. protected 4、为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为( A)。 A. static void method( ) B. public void method( ) C. final void method( ) D. abstract void method( ) 5、关于选择结构下列哪个说法正确?( B ) A.if语句和else语句必须成对出现 B.if语句可以没有else语句对应 C.switch结构中每个case语句中必须用break语句 D.switch结构中必须有default语句 6、while循环和do…while循环的区别是:( D) A.没有区别,这两个结构任何情况下效果一样 B.while循环比do…while循环执行效率高 C.while循环是先循环后判断,所以循环体至少被执行一次 D.do…while循环是先循环后判断,所以循环体至少被执行一次 7、关于for循环和while循环的说法哪个正确?( B) A.while循环先判断后执行,for循环先执行后判断。 B.while循环判断条件一般是程序结果,for循环的判断条件一般是非程序结果C.两种循环任何时候都不可以替换 D.两种循环结构中都必须有循环体,循环体不能为空

自考Java语言程序设计一试题及答案解析

2015年10月高等教育自学考试全国统一命题考试 Java语言程序设计(一) 试卷 (课程代码04747) 本试卷共13页,满分100分.考试时间150分钟。 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答。答在试卷上无效,试卷空白处和背面均可作草稿纸. 2.第一部分为选择题。必须对应试卷上的题号使用2B铅笔将“答题卡”的相应代码涂黑. 3.第二部分为非选择题。必须注明大、小题号.使用0.5毫米黑色字迹签字笔作答. 4.合理安排答题空间.超出答题区域无效。 第一部分选择题 一、单项选择题(本大题共10小题.每小题1分.共10分) 在每小题列出的四个备选项中只有一个是符合题目要求的。请将其选出并将“答题卡”的相应代码涂黑。未涂、错涂或多涂均无分. 1.以下字符组合中,不能作为Java整型常量的是 A.037 B.0x3ADG C.7000 D.0x3abcL 2.以下程序代码的输出结果是 3.设有数组定义,则x.length的值为 A.2 B.3 C.4 D.5 4. 设有字符串String s=〝ABCDEFGABC〞;,则表达式s.indexOf(〝A〞,7)的值是 A.7 B.6 C.3 D.0 5.以下关于Swing与AWT之间关系的叙述中,正确的是 A.Swing是AWT的提高和扩展 B.在写GUl程序时,AWT和Swing不能同时使用 C.AWT和Swing在不同的平台上都有相同的表示 D.AWT中有一些类是从Swing中的一些继承的 6.以下供选择的类中,其子类能用来创建框架窗口的是 A.JWindow B.JFrame C.JDialog D.JAudio 7.某程序定义了一个子类,并要让它实现多线程,以下正确的步骤是 A.继承Thread类,在类内定义run( )方法,声明和创建线程对象,并让该对象调用 start( )方法。 B.继承Thread类,在类内定义run( )方法,声明线程对象,并让该对象调用start( ) 方法。 c.声明实现Runnable接口,在类内实现run( )方法,声明线程对象,创建线程,并

《Java语言程序设计基础教程》

第1章 Java程序设计概述 1.9 练习思考题 1、Java运行平台包括三个版本,请选择正确的三项:() A. J2EE B. J2ME C. J2SE D. J2E 解答:A,B,C 2、Java JDK中反编译工具是:() A. javac B. java C. jdb D. javap 解答:D 3、public static void main方法的参数描述是:() A. String args[] B. String[] args C. Strings args[] D. String args 解答:A,B 4、在Java中,关于CLASSPATH环境变量的说法不正确的是:() A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B. 编译器用它来搜索各自的类文件。 C. CLASSPATH是一个目录列表。 D. 解释器用它来搜索各自的类文件。 解答:A 5、编译Java Application源文件将产生相应的字节码文件,扩展名为() A. .java B. .class C. .html D. .exe 解答:B 6、开发与运行Java程序需要经过的三个主要步骤为___编辑源程序____、______编译生成字节码______和_____解释运行字节码____。 7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是_Applet_类的子类并且存储该源程序文件的文件名为_MyApplet.java_。 8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生_3_个文件名与类名相同而扩展名为_.class_的字节码文件。 9、开发与运行Java程序需要经过哪些主要步骤和过程? 答:1编写Java源文件:使用文本编辑器(edit或记事本),拓展名为.java

JAVA五子棋程序设计课程设计

JAVA五子棋程序设计课程设计

计算机与信息工程系 《JAVA程序实训》设计 五子棋游戏 摘要: 计算机人机对弈作为人智能研究的一个重要分支,计算机博弈是检验人工水平的一个重要方面。它的研究为人工智能带来了很多重要的方法和理论,产生了广泛的社会影响和学术影响。 五子棋人机对弈是计算机博弈中的一种。研究其计算机算法,能够让我们看到人工智能的稚形,也有助于我们人脑的开发。五子棋是中国创造的,研究它能够让更多的外国人了解五子棋,这有助于中国优秀文化的推广。 关键词:人工智能,计算人机对弈,五子棋,算法 , java 1.课程设计介绍 1.1课程设计目的 经过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、NetBeans等开发工具的运用,拓宽常见类库的应用。使我们经过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。本次课程设计每人一组,自行设计并实现共功能模块。

1.2课程设计任务 实现五子棋游戏,要求:使用图形用户界面,实现人人对战,人机对战。能够判断输赢,有“开始”按钮,当出现棋盘后,按此按钮进入对战状态。当有胜利者(垂直、水平、对角线连续5子),显示对话框,提示谁(黑还是白)胜利了。若当棋盘满了还无胜利者,显示平局对话框。有“悔棋”按钮,玩家能够点击悔棋,回到上一步。 1.3课程设计论文编写要求 (1)要按照书稿的规格打印与写课程设计论文; (2)论文包括目录、设计思路、具体实现、运行调试与分析讨论、设计体会与小结、参考文献、附录(源代码)等; (3)课程设计论文装订按学校的统一要求完成。 2.系统设计 2.1需求分析 2.1.1性能需求 一款小游戏的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求,其中玩家的实际需求最为重要.面对游戏拥有不同知识和理解层面的玩家,游戏制作人对玩家需求的理解程度,在很大程度上决定了此类游戏开发的成败.因此如何更好地的了解,分析,明确玩家需求,而且能够准确,清晰以文档的形式表示给游戏制作人,保证开发过程按照满足玩家需求为目的正确开发方向进行,是每游戏游戏制作人需要面正确问题。 作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应

非常经典的JAVA编程题全集(50题及答案)

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count); } } 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 public class lianxi03 { public static void main(String[] args) { int b1, b2, b3; for(int m=101; m<1000; m++) {

相关文档
最新文档