课 程 设 计 任 务 书
专 业 计算机科学与技术 班 级 08T 计算机 1 班 姓 名
吴兴文
设 计 起 止 日 期
2011.6.27——2011.7.8
设计题目:基于 JAVA GUI 编程实现五子棋游戏
设计任务(主要技术参数):
利用 JAVA GUI 编程实现五子棋游戏,该游戏能够实现五子棋基本功能,并且扩充
自定义游戏时间、自动显示游戏提示和说明、可以中途认输等功能。程序的设计充分体
现优良的界面和简单操作。
硬件环境:CPU:2.10GHz;
内存:2GB;
硬盘:500GB;
软件环境:操作系统:windows 7 旗舰版;
开发软件:JDK 1.6,MyEclipse 8.5
指导教师评语:
成绩:
签字:
年 月 日
课程设计说明书
NO.1
基于 JAVA GUI 编程实现五子棋游戏
1.课程设计目的
为了进一步巩固课堂上所学到的知识,深刻把握 Java 语言的重要概念及其面向对
象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设
了一周的 Java 程序设计课程设计。
本课程设计根据要求设计了一个基于 JAVA GUI 编程实现五子棋游戏,该游戏不仅
仅把简单的五子棋的各种算法实现了,还添加了对各种问题设置选择方式,使该程序更
具有人性化,可以方便的保存,保存上一期没有完成的游戏对弈。程序的设计充分体现
优良的界面和简单操作。
2.设计方案论证
2.1 设计思路
2.1.1 棋盘和棋子布局
现代五子棋棋盘,经过国际棋联的多次修改,最终定为 15 X 15 路,即棋盘由横竖
各 15 条平行线交叉组成,共有 225 个交叉点;棋盘上共有五个星位,中间的星位称为
天元,周围四点为小星。五子棋的棋子和围棋相同,分黑白 2 种颜色,通常为散圆形,
有一面凸起或二面凸起等形状,一副棋子总数为 225 枚,其中黑子 113 枚,白子 112 枚。
由于正规五子棋比赛按不同级别设置了不同的时间限制,所以本次设计特添加计时功
能。但一般的玩家都没有这个限制。
2.1.2 规则和解释
(1)黑棋先行,白棋随后。从天元开始相互顺序落子。
(2)最先在棋盘的横向、竖向、斜向形成连续的相同色五个棋子的一方为胜利。
(3)黑棋主动判负、白棋也是这样。
(4)如分不出胜负,则定位平局。
(5)对局中拔子、中途退场均判为负
(6)五连与禁手同时形成,先五为胜。
(7)黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指正,反
而继续落子,则不能判黑方负。
沈 阳 大 学
课程设计说明书
NO.2
五子棋是由两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由执黑棋的
一方将一枚棋子的落在“天元”上,然后由执白棋的一方在黑棋周围的交叉点上落子。
如此轮流落子直到某一方首先在棋盘的直线 横线或斜线上形成连续的五子或五子以
上,则该方就算获胜。
2.1.3 程序结构说明
开始
游戏初始化
退
出
否
则
主循环控制模块
继续
玩家双方相互下子
胜负判断
胜利
退出
图 1 五子棋程序流程图
2.2 设计方法
本程序是 Java Application,要实现五子棋双人对弈,程序包含 2 个独立的类文
件分别是 FiveChessFrame.java、Test.java。
其中 FiveChessFrame.java 主要负责棋盘的初始化,定义了面板上的其他元素,以
及判断胜负条件等主题框架结构。Test.java 则负责调用各个类,保存玩家的信息,完
成整体的实现。
沈 阳 大 学
课程设计说明书
NO.3
2.2.1 Test.java 主类
Test 类是主程序类有 main 函数,该类主要是设计提示窗口,完成在运行时的
操作,主要有游戏开始、游戏结束、重新选择等信息,很好的友好界面设计。它们的主
要实现是通过 Swing 的 JOptionPane.showMessageDialog()函数简单实现。或者调用
主函数 FiveChessFrame。
2.2.2 FiveChessFrame
整个架构的核心部分,类名为 FiveChessFrame。封装了棋盘的各种可能用到的功
能,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与 FiveChessFrame
进行交互来完成对游戏的操作。
2.2.3 棋盘及棋盘类
调用 Swing 中的 JFrame 类的 paint()函数,用 paint()实现窗体的设计尤
其是棋盘的绘制。这里主要是 19 行 19 列,每行和列添加 20 个像素,并且为棋盘添加
了五个驻点,使棋盘看起来清楚明了。
public void paint(Graphics g) {// 双缓冲技术防止屏幕闪烁
BufferedImage bi = new BufferedImage(500, 500,
BufferedImage.TYPE_INT_RGB);
Graphics g2 = bi.createGraphics();
g2.setColor(Color.BLACK);
g2.drawImage(bgImage, 1, 20, this); // 绘制背景
g2.setFont(new Font("黑体", Font.BOLD, 20)); // 输出标题信息
g2.drawString("游戏信息:" + message, 130, 60);
// 输出时间信息
g2.setFont(new Font("宋体", 0, 14));
g2.drawString("黑方时间:" + blackMessage, 30, 470);
g2.drawString("白方时间:" + whiteMessage, 260, 470);
// 绘制棋盘
for (int i = 0; i < 19; i++) {
g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
}
// 标注点位
g2.fillOval(68, 128, 4, 4);
g2.fillOval(308, 128, 4, 4);
g2.fillOval(308, 368, 4, 4);
g2.fillOval(68, 368, 4, 4);
g2.fillOval(308, 248, 4, 4);
沈 阳 大 学
课程设计说明书
NO.4
g2.fillOval(188, 128, 4, 4);
g2.fillOval(68, 248, 4, 4);
g2.fillOval(188, 368, 4, 4);
g2.fillOval(188, 248, 4, 4)
}
}
2.2.4 棋子及棋子类
确定下子的坐标(xp,yp)画特定大小的椭圆,这里的坐标指棋子相对棋盘的绝对
坐标。该棋子的判定的界限不能超过棋盘的界限。
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (allChess[i][j] == 1) {
// 黑子
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
}
if (allChess[i][j] == 2) {
// 白子
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g2.setColor(Color.WHITE);
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
g2.setColor(Color.BLACK);
g2.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}。
2.2.5 时间限定设置
调用公有成员 run()函数来进行对弈双方的下棋的时间限定,当一方把时间用完
后就会有时间超时的提示,这时就会判超时的一方是输。
public void run() {
// TODO Auto-generated method stub
// 判断是否有时间限制
if (maxTime > 0) {
while (true) {
if (isBlack) {
blackTime--;
if (blackTime == 0) {
JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
沈 阳 大 学
课程设计说明书
NO.5
}
} else {
whiteTime--;
if (whiteTime == 0) {
JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
}
}
blackMessage = blackTime / 3600 + ":"
+ (blackTime / 60 - blackTime / 3600 * 60) + ":"
+ (blackTime - blackTime / 60 * 60);
whiteMessage = whiteTime / 3600 + ":"
+ (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
+ (whiteTime - whiteTime / 60 * 60);
this.repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(blackTime + " -- " + whiteTime);
}
2.2.6 胜负判断条件
要判断四个方向,横向、竖向、以及 2 个斜向。思想还是比较简单,相同颜色连成
五子即胜利,完整的判断胜负条件包括连五和活四,活四还要检查两边的棋子,虽然运
算量不大,但五子棋的标准就是连五即胜,一步之差,我们既要遵守规则,也要简化代
码实现尽完整的功能。
判定胜负的是用私有成员函数 boolean checkWin(),其设定一个判定的旗帜 Flag
而且初始化时设定 False,事先要建立一个盘面数组 allChess[x][y],即棋型表。在对
八个方向的棋子进行总结,得出看谁胜利。
判定的几个方向的方法是:
count = this.checkCount(1, 0, color);
if (count >= 5) {//判断横向
flag = true;}
else {// 判断纵向
count = this.checkCount(0, 1, color);
if (count >= 5) {flag = true;
} else {// 判断右上、左下
count = this.checkCount(1, -1, color);
沈 阳 大 学
课程设计说明书
NO.6
if (count >= 5) {flag = true;
} else {// 判断右下、左上
count = this.checkCount(1, 1, color);
if (count >= 5) {
flag = true;
}}}}
判断胜负的玩家相互游戏,判断胜负是是要有提示。如果有一方获胜,弹出提示框,
如果确认则清空棋盘继续新游戏。实现的函数是
JOptionPane.showMessageDialog(null,
"You Win The Game",
"Congratulations",
JOptionPane.INFORMATION_MESSAGE);
需要注意的一点是落下的棋子如果离任何一方的边界小于 4,则以边界为限制判断
是否有一方获胜,这样的话也要考虑多种方向,但原理还是和基本情况是一样的。
3.设计结果与分析
本程序是图形界面的设计,所以需要有一个添加在对话框上的图形,该图的大小事
500x500 的而且图形界面初始化时是居中实现的。用 Eclipse 图形设计如图 2 所示:
图 2 界面修剪图
游戏运行后变自动开始,默认无时间限制。这时可以单击“说明”按钮查看相
关的操作方法,点击“开始”按钮可以重新开始游戏,点击“设置”按钮可以设置游
戏时间。如果中途需要退出,点击“认输”按钮就可以退出游戏。点击“关于”按钮
可以查看该游戏的作者信息,点击“退出”按钮退出游戏。为了防止误点,各按钮点
击后都会弹出窗口确定进行该操作。其中设置时间界面如图 3 所示。
沈 阳 大 学
课程设计说明书
NO.7
图 3 设置游戏时间界面
设置好游戏时间后点击确定程序自动提示是否重新开始,如果点击“是”本次游
戏就会结束,时间限制就会生效;如果选择“否”修改从下次游戏开始生效。通过这
个确定游戏双方的使用时间,这样就会增加对弈双方的紧迫感。使游戏更具紧张气氛。
游戏开始后每下一个棋子程序就会自动判断当前位置是否有棋子,有的话会弹出
窗口提示用户更改位置,没有的话再判断四个方向,即横向、竖向、以及 2 个斜向方
向上颜色相同的棋子是否达到五个。达到五个则弹出窗口提示当前操作用户获胜并结
束本次游戏。如果中途有人想退出可以随时点击“认输”按钮结束当前游戏。否则直
到达到限制时间或者棋子充满整个棋盘时弹出相应提示结束游戏。游戏运行过程中的
界面如图 4 所示:
沈 阳 大 学