基于java五子棋游戏开发(含源文件)


获取项目源文件,联系Q:1225467431,指导其它毕设,课设


摘要:五子棋作为中国古代的传统黑白棋种之一,有着广泛的群众基础,是一种老少皆宜的棋类休闲游戏。开发一款五子棋游戏可以使广大棋牌游戏爱好者在闲暇时间切磋棋艺,对互联网技术的推广和个人棋艺的提高都有好处。的提高都有好处。
本文是采用JAVA语言写的五子棋游戏,JAVA语言无论体现在跨平台还是在面向对象,可移植性,安全性,并发机制和可视化图形界面的支持都是很好的。选用它作为开发语言,对程序开发来说,很具有高效性。
关 键 词: JAVA语言 棋牌游戏 跨平台性
Abstract:Backgammon in ancient China, one of the traditional Othello species has a broad mass base, is a casual chess games for all ages. Development of a backgammon board games game can make the general demonstrate their chess enthusiasts in their spare time on Internet technology to promote and improve individual chess is good.
This article is written by JAVA language Gobang games, JAVA language or both reflected in the cross-platform object-oriented, portability, security, concurrency mechanisms and visualization support for graphical interfaces are good. Use it as a development language for the program development, it is very efficient.
Key words:JAVA language Card Games Cross-platform
1. 第一章 系统概述
1.1五子棋简介
1.1.1五子棋
五子棋是起源于中国古代的传统黑白棋种之一。亦连五子”、五子连”、串珠”、五目”、五目碰”、五格”等多种称谓。
玩家根据自身等级和习惯,可以自由选择不同的游戏房间。其游戏规则也有所不同。详细分为三种棋室:普通棋室、国标棋室、职业棋室。其中普通棋室不受任何规则限制;国标棋室有禁手规则限制;而职业棋室则在国标棋室的基础上增加三手交换”和五手两打”两项规则。(三手交换:是指黑棋下盘面第3着棋后,白方在应白④之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。五手两打:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中任选一步,然后再继续对弈。)
国际比赛规则规定:对局中如黑方出现禁手,白方应立即指出禁手点,黑方即负。如白方在黑方出现禁手后,又落一步白子,黑棋禁手则不成立了。所以 在有禁手的房间里,如果黑方出现禁手,白方应立即按下禁手按钮。程序会判黑方负。如果这时白方又在棋盘上落一子,黑棋禁手则不成立了。为了简化用户对禁手按钮的使用,也有走禁手就输和禁手不能落子规则的房间,顾名思义不多介绍。虽然采取了禁手的限制,黑棋先行仍有优势,黑棋仍可以必胜。所以如果用户是高段位的棋手,或者想成为高手一定要选择国际上比赛选用的比赛标准,即三手交换,五手两打”。
1.1.2五子棋棋盘
棋盘正中一点为天元”。棋盘两端的横线称端线。棋盘左右最外边的两条纵线称边线。从两条端线和两条边线向正中发展而纵横交叉在第四条线形成的四个点称为星”。天元和星应在棋盘上用直径约为0.5厘米的实心小圆点标出。
以持黑方为准,棋盘上的纵轴线从左到右用英文字母A~O标记。横行线从近到远用阿拉伯数字1~15标记。纵横轴上的横纵线交叉点分别用横纵线标记的名称合写成。如天元”H8,四个星”分别为D4、D12、L12、L4等。
图 1.1.2 五子棋棋盘
1.1.3五子棋棋盘
 行棋顺序
黑先、白后,从天元开始相互顺序落子。
 判断胜负
1、最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。
2、黑棋禁手判负(Lose),白棋无禁手。黑棋禁手包括三、三”(Double Three)(包括四、三、三”)、四、四”(Double Four)(包括四、四、三”)、长连”(Overline)。黑棋只能以四、三”取胜。
3、如分不出胜负,则定为平局(Draw)。
4、对局中中途退场判为负。
5、五连与禁手同时形成,先五为胜。
6、黑方禁手形成时,白方应立即指出。若白方未发现或发现后未指明而继续应子,则不能判黑方负。
1.2课题背景及意义
1.2.1开发背景
随着社会经济的发展,青少年的生活环境日益改善,再加上他们基本上都是独生子女,父母家庭对他们的关爱也就特别强烈。由于家庭给了孩子们太多的关爱,致使许多孩子养成了以自我为中心”的陋习。围绕自我”片面地分析问题,解决问题是很难把事情办好的。而五子棋是双人对弈的项目,行棋过程中就必须同时考虑双方的意图和利益,只顾自己的利益,得到的往往是速败”。再次,五子棋棋手必须从全局入手,正确分析全盘形势,尽最大限度调用自己的有利因素才能达到取胜的目的。由此看来,五子棋可以改善青少年的思维方式,让他们培学会知己知彼” 大局入手”的思考方法,这对他们今后走上竞争日益激烈的社会是大有好处的。
一个没有经历过失败的人,一定是个什么也不懂的人。许多青少年碰到一点挫折就退缩,不敢面对,这是他们脆弱的心理所造成的。五子棋有助于修身养性,对下棋的孩子来说,胜败是常事,关键是要学会善于自我反思,善于吸取教训, 善于积累经验,使他们有面对失败的勇气,有自我调整心态的能力,这也是他们今后走向社会所必须具备的。
1.2.2开发的意义
毕业设计是大学学习的总结,同时也是自己综合运用所学知识解决实际问题的一次锻炼。鉴于以上这些,我感觉有必要普及五子棋,发扬这种思维方式与方法。而互联网作为现今最大的青少年平台。能很好的推广青少年去学习五子棋,发展智力。开发五子棋程序,并放置在互联网平台上,这样会很好的让青少年去关注,以至于爱好它,学习五子棋,培养青少年的智力发育,提高国民整体素质。
1.3 JAVA简介
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。它不只是一门编程语言,也是一个平台,它基于Java虚拟机技术,借助这个东西建立了跨平台的优势。Java技术的重要性就不讲了,从最近流行的一个统计数据上来说,目前世界上编程语言Java 、C 、VB、C++依次排名前4位,这排名本身不说明什么,至少也是工业界对编程语言使用上一个侧面的反映吧。
Java平台:
平台是程序运行的硬件或软件环境。Java平台与大多数其它平台不同之处在于它是运行于其它基于硬件平台的纯软件平台。大多数其它平台是硬件和操作系统的结合。Java平台由两部分组成:
* Java虚拟机(Java VM)
* Java应用程序界面(Java API)
Java平台是一种纯软件平台,它有三个版本JavaSE(Java2 Platform Standard Edition,java平台标准版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企业版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。
Java SE(Java Platform,Standard Edition)这个版本以前叫做J2SE,后来版本号从1.4直接跳到5.0,其实也就是1.5,所以就叫成Java SE 5.0。目前Java开发人员使用较多的版本是5.0,当然还有Java SE 6.0这个更新的版本。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java 应用程序。Java SE还包含了支持Java Web服务开发的类,并为Java EE这个版本提供基础。
虽说桌面应用程序,Java一直不被看好,但也稍微提一下,负责桌面GUI开发的类库我知道的有:JDK自带的主要是AWT/SWING这个Java原生类库;也可以使用IBM的SWT/JFace这个第三方类库。开发工具我了解的有:NetBeans(最近已经是6.0final版了,做GUI有使用VB的感觉),Eclipse(SWT/JFace这个项目其实就是做Eclipse项目时扩展出来的,所以对SWT/JFace支持的也不错)。Java EE(Java Platform,Enterprise Edition)这个版本以前叫做J2EE,也就是大家可能听得比较多的,也是Java比较流行的领域,Java的企业级版本。Java EE下有很多流行的开发框架,像Struts、Spring、Hibernate这种流行的所谓SSH组合等。
Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。目前常用的Java平台基于Java1.4,最近版本为Java1.7。
2. 第二章 系统分析
2.1系统需求
我们在设计游戏的时候有以下一些要求:
一 软件的界面简洁明了,操作简单容易。我们设计的软件界面必须是简洁的,游戏需要设计得易操作。
二 软件具有人工智能算法原理要简单,并且运行快速。游戏是需要快速反应的。我们需要使用简单实用的智能算法。
三 游戏要设置几个难度,便于不同玩家选择.玩家的游戏水平不一样,我们设置不同难度供各个水平的玩家选择。
游戏玩法及规则
现代五子棋专用棋盘为十五路(15X15),共225个交叉点。棋盘正中一点为天元。对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋一方在黑棋周围的交叉点上落子。但是,为了尊重对方和礼貌起见,持白棋的一方通常将盘面的第二着棋布在自己河界的一侧,即直止或斜止。此后黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子或五子以上〔仅对白棋而言〕,则该方就算获胜 。连珠五子棋的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。五子棋的比赛规则如下:
1、黑先、白后,从天元开始相互顺序落子;
2、最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;
3、 黑棋禁手判负、白棋无禁手。黑棋禁手有三、三”、四、四”和长连”, 包括四、三、三”和四、四、三”。黑棋只能以四、三”取胜;
4、如分不出胜负,则到为平局;
5、五连与禁手同时形成,判胜;
6、黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。
2.2系统的功能简介
人机对弈的程序,至少应具备如下几个部分:
1、某种在机器中表示棋局的方法,能够让程序知道博弈的状态。
2、产生合法走法的规则,以使博弈公正地进行,并可以判断人类对手是否乱走。
3、从所有合法走法中选择最佳走法的技术。
4、一种评估局面优劣的方法,用以同上面的技术配合做出智能的选择。
5、一个界面,有了它,这个程序才能用。
2.2.1 棋盘表示
棋盘表示就是使用一种数据结构来描述棋盘及棋盘上的棋子,通常使用一个二维数组。棋盘的数据表示直接影响到程序的时间及空间复杂度。为了追求更高的效率,研究人员针对不同棋类提出了多种不同的表示方法。有些方法具有更高的效率如比特棋盘表示法。
2.2.2 走法产生
博弈的规则决定了哪些走法是合法的。对有的游戏来说,这很简单,比如五子棋,任何空白的位置都是合法的落子点。但是对于象棋来说,就有马走日,象走田等一系列复杂的规则。走法产生是博弈程序中一个相当复杂而且耗费运算时间的过程。不过,通过良好的数据结构可以显著的提高走法生成的速度。
2.2.3搜索技术
对于计算机来说,直接通过棋盘信息判断走法的好坏并不精确。除了输赢这样的局面可以准确判断外,其它的判断都只能做到大致估计。判断两种走法孰优孰劣的一个好方法就是观看棋局走下去的结果。也就是向下搜索若干步,然后比较发展下去的结果。为了避免差错,我们假定对手的思考也和我们一样,也就是,我们想到的内容,对手也想到了。这就是极大极小搜索算法的基本原则。极大极小搜索算法的时间复杂度是O(bn)。这里b是分枝因子,指棋局在各种情况下的合法走步的平均值;n是搜索的最大深度,也就是向下搜索的博弈双方的走步之和。例如向下搜索甲乙双方各走一步的情形,n就是2。显然对于五子棋这种分枝因子在200左右的棋类游戏,时间开销随着n的增大会急剧的增长,不出几层就会超出计算机的处理能力,这将导致在有限时间内得不到令人满意的结果。
人们在开发高效的搜索算法上投入了大量的研究。在过去的几十年中,一些相当成功的改进大大提高了极大极小搜索的效率。Alpha-Beta剪枝、迭代深化、置换表、历史启发等手段的综合运用将搜索效率提高了几个数量级。
2.2.4用户功能
用户可以直接使用的游戏功能,通过按键进行操作。每个用例的简要说明如下:
1、新游戏:初始化相关变量,清空棋盘。
2、步数计算:计算当前是第几步
4、棋子坐标:显示当前所下棋子坐标。
6、下棋提示:提示该哪方下棋子。
7、重新开局:初始化相关变量,清空棋盘。
2.3系统的可行性分析
2.3.1经济可行性
本游戏使用模块化设计方案,易于编写和维护,核心代码易于移植,总体开发成本低。游戏短小精悍,对目标设备要求低,产品面向受众广,可以带来可观的经济效益。
2.3.2技术可行性
JAVA提供了丰富的接口和类服务,本游戏的开发只需要用到基本的绘图接口和系统的文件服务,实现起来非常简单。使用JAVA封装好的数据类可以简化编码实现,避免不必要的错误。对于以处理数据为主的棋类游戏,编码实现没有困难。
2.3.3系统安全性分析
本游戏的开发只使用很少的系统接口和系统服务,数据处理都是在程序内部解决,不涉及与其它程序的数据交互。使用JAVA定义好的构造法分配内存空间,这样不会在构造出现异常时产生内存泄露。系统会根据已经入栈的对象指针,通过析构函数收回内存。所以即使程序因为内存不足无法运行,也不会因此而影响系统本身的稳定性和安全性。另外,使用模块化方法进行设计编码,可以很方便的调整算法的搜索深度,减小内存的使用量,提高程序的兼容性
3. 第三章 系统设计
3.1系统关键类介绍
1、Chess类是游戏的主类,负责初始化游戏棋盘,其实Chess类就是游戏的入口,只有启动了此类,才有游戏菜单,才可以进行选择游戏。代码如下
setVisible(true);
setLayout(null);
Label label = new Label(Gobang v1.0, Label.CENTER);
add(label);
label.setBounds(10, 50, 440, 26);
label.setBackground(Color.orange);
add(chesspad);
chesspad.setBounds(10, 90, 440, 440);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pack();
setSize(460, 540);
2、Evaluate类是用来估算估值点的坐标,返回的是这个点的价值。代码如下:
int max_x, max_y, max; //定义坐标 x,y及最大值
public void evaluate(int shape[][][]) {
int i = 0, j = 0;
for (i = 0; i < 19; i++)
for (j = 0; j < 19; j++) {
switch (shape[i][j][0]) {
case 5:
shape[i][j][4] = 200;
break;
case 4:
switch (shape[i][j][1]) {
case 4:
shape[i][j][4] = 150 + shape[i][j][2] + shape[i][j][3];
break;
case 3:
shape[i][j][4] = 100 + shape[i][j][2] + shape[i][j][3];
break;
default:
shape[i][j][4] = 50 + shape[i][j][2] + shape[i][j][3];
}
break;
case 3:
switch (shape[i][j][1]) {
case 3:
shape[i][j][4] = 75 + shape[i][j][2] + shape[i][j][3];
break;
default:
shape[i][j][4] = 20 + shape[i][j][2] + shape[i][j][3];
}
break;
case 2:
shape[i][j][4] = 10 + shape[i][j][1] + shape[i][j][2]
+ shape[i][j][3];
break;
case 1:
shape[i][j][4] = shape[i][j][0] + shape[i][j][1]
+ shape[i][j][2] + shape[i][j][3];
default:
shape[i][j][4] = 0;
}
}
int x = 0, y = 0;
max = 0;
for (x = 0; x < 19; x++)
for (y = 0; y < 19; y++)
if (max < shape[x][y][4]) {
max = shape[x][y][4];
max_x = x;
max_y = y;
}
}
3.2胜负判断
Judge类中的judge方法是通过扫描当前点周围的同色棋子数进行判断,如果胜利则返回True,否则返回False。这个方法需要配合使用,电脑会在下子之后调用这个方法。这个方法实现的伪代码如下:
static boolean judge(int a[][], int color) {
int i, j, flag;
for (i = 0; i < 19; i++) {
flag = 0;
for (j = 0; j < 19; j++)
if (a[i][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
for (j = 0; j < 19; j++) {
flag = 0;
for (i = 0; i < 19; i++)
if (a[i][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
for (j = 4; j < 19; j++) {
flag = 0;
int m = j;
for (i = 0; i <= j; i++) {
if (a[i][m--] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (j = 14; j >= 0; j--) {
flag = 0;
int m = j;
for (i = 0; i <= 18 - j; i++) {
if (a[i][m++] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (i = 14; i >= 0; i--) {
flag = 0;
int n = i;
for (j = 0; j < 19 - i; j++) {
if (a[n++][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (j = 14; j >= 0; j--) {
flag = 0;
int m = j;
for (i = 18; i >= j; i--) {
if (a[i][m++] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
return false;
}
PAGE
12
获取项目源文件,联系Q:1225467431,指导其它毕设,课设

猜你喜欢

转载自blog.csdn.net/u010783228/article/details/85805860