East China Jiaotong University
华东交通大学 08 级信息计算科学
基础科学学院
Java 面向对象课程设计
——龟兔赛跑游戏的设计与实现
班
学
姓
级 信息与计算科学
号
名
2011 年 7 月 1 日
第 1 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
目录
第一章 设计前言………………………………………………………….3
第二章 程序功能简介……………………………………………………..3
第三章 设计主体内容……………………………………………………..4
3、1 程序分析………………………………………………………..4
3、2 流程图…………………………………………………………..6
3、3 模块说明………………………………………………………..7
3、4 源程序…………………………………………………………..10
3、5 操作及结果…………………………………………………......20
第四章 设计体会…………………………………………………………..21
第五章 参考文献…………………………………………………………..21
第 2 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
Java 程序设计
第一章.设计前言
本次课设我们组选择的是龟兔赛跑游戏的制作。这个游戏实际上主要是对我们 JAVA
学习中的线程部分的考察,尤其是多线程的定义,运行等。同时还要保证游戏有一个真实的
操作界面和人性化操作设计,所以我们组在分配任务中重点强调了对线程部分内容的复习和
实践。在本次课设中我作为小组组长,主要负责线程类的构建,操作界面的设计以及对全组
工作的整体协调。
在设计龟兔赛跑这个游戏中我们也遇到了技术上的一些困难,但通过组员们一致的努力,
最终问题得以解决。正如龟兔赛跑这个故事一样,虽然我们在技术上不是很优秀,但我们的
组员有乌龟一样坚持不懈的精神,最终胜利到达终点。
第二章、程序功能简介
龟兔赛跑游戏的功能如下:
1、 用图形用户界面实现游戏界面;
通过使用 java 中 Jlabel,Jbutton,JtextArea,JcomboBox 等 swing 组件来实现图形用户界
面,同时通过设置布局,背景,字体等来丰富界面,最大程度的模拟龟兔赛跑的场景。
2、 能设置比赛时间,龟兔的数量等等。
通过组合框组件的使用以及事件的订阅来实现用户对不同游戏模式的选择,在本程序中
只是简单的设计了两种游戏模式供用户选择,也一定程度上实现了对比赛中龟兔的数量,比
赛时间等参数的设置。
3、 在任意时间段内龟兔的速度是随机的。
为了模拟龟兔赛跑结果的不确定性,在游戏开始后乌龟和兔子的速度都是通过随机函数
产生的,当然,我们会在保证兔子比乌龟速度要快,兔子在赛跑途中看到乌龟落后下会偷懒
睡觉的前提下给予乌龟,兔子以随机的速度,从而使得游戏的结果不确定,给用户更多的游
戏的真实感。
4、开始比赛之后以动画显示赛跑过程。
用户进入游戏界面后,先选择游戏模式,然后单击开始按钮,乌龟和兔子将会以随机的
第 3 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
速度开始朝终点线爬行,通过 java 中重复刷新技术达到动画效果,给用户更逼真的感官。
第三章、主体内容
一、设计分析
第一步:设计良好游戏界面
功能:实现基本的开始、退出游戏功能、选择游戏模式等。
基本步骤:
backgroundPanel
添
加
JPanel
JtextArea
JcomboBox
Jbutton
乌
龟
标
签
兔
子
标
签
添
胜
利
信
息
的
呈
现
选
择
按
钮
提
示
模
式
信
息
呈
现
加
开
始
按
钮
结
束
按
钮
赛
模
式
用
于
选
择
不
同
的
比
在实现过程中会遇到的问题及解决方案:
1、 背景面板上加载图片时需要重写 paintComponent 方法
2、 布局必须合理设置(GridLayout 不能改变组件的具体位置但可以缩放时相对位置
不变。FlowLayout 默认是占满第一行转向第二行,并且放大时相对位置改变。
Null 布局可以自由布置组件位置和大小,但不易实现窗口放大时相对大小随之变
第 4 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
化。)若设置不合理,就可能出现多种错误。列如:无法插入背景图片,组建不
能显现,组件位置与设计不符等等。
3、 添加背景面板监听重置各面板位置才能实现窗口放大时的相对位置不变
第二步:线程类的设计
功能:实现多只乌龟,兔子的多线程运行
具体步骤:
SwingResourceManager 类 ,
对图片加载方法的重写集合
Time 类
class Run 类
(是主类,继承
Jframe 主 要 用
于 线 程 事 件 的
逻辑控制)
RabbitThread 类
RabbitOneThread 类
TortoiseThread 类
ItemSelect 类
第二步会遇到的问题及解决方案:
1、 建立兔子线程,继承接口 Runnable 并正确的实现 run()方法。同时要特别注意
兔子在比赛中还要模拟睡觉的动作。
2、 建立乌龟线程,继承接口 Runnable 并实现其 run()方法,要与兔子多线程运行;
3、 为了实现可选择多只龟兔进行赛跑,要实现多个兔子,乌龟线程,并能并发
运行。
第 5 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
4、
游戏中提供了模式选择的功能,通过建立 ItemSelect 类来建立不同的游戏模
式。
二、程序结构及流程图
第 6 页 共 23 页
East China Jiaotong University
华东交通大学 08 级信息计算科学
三、各模块的功能及程序说明
龟兔赛跑程序主要由以下几个模块构成:
模块一:兔子线程模块
该模块主要是实现兔子运行线程,类 RabbitThread 继承了接口 Runnable 并实现其方
法 run(),主要有两个功能的实现:
1 、 实 现 兔 子 的 随 机 速 度 和 与 乌 龟 的 并 发 性 运 动 ; 在 代 码 中 通 过 SPEED =
(int)(Math.random()*10);来为兔子定义随机速度;并通过代码
if(rabbit.getLocation().y > rabbit.getHeight()/2) {//如果兔子没到终点
Point point2 = rabbit.getLocation();//获取兔子的位置
rabbit.setLocation(point2.x, point2.y - SPEED);//使兔子移动
}来模拟兔子的爬行。
2、模拟兔子的偷懒动作;通过代码:
if(((point.y+100)
East China Jiaotong University
华东交通大学 08 级信息计算科学
e.printStackTrace();}
if (tortoise.getLocation().y > tortoise.getHeight()/2) {
Point point = tortoise.getLocation();
tortoise.setLocation(point.x, point.y - SPEED);}通过try{}catch{}
语句来实现兔子,乌龟两个线程并发运行,并通过随机函数实现随机速度以及模拟乌龟爬行;
模块三:运行模块
该模块主要是用来模拟龟兔赛跑的逻辑动作。类 Run 继承了 Jframe 类并在类体中实现
对面板的设计,同时控制乌龟和兔子的并发运行;其主要功能实现为:
1 、 实 现 龟 兔 线 程 的 并 发 运 行 : 在 main 函 数 中 用 到 了
java.awt.EventQueue.invokeLater(new Runnable() {public void run() { new 计 算 器
().setVisible(true);通过把这个事件(new Runnable(设置计算器可见))添加到 awt 的事件
处理线程当中去可以使得 awt 的事件处理线程会按照队列的顺序依次调用每个待处理的事件
来运行 使用该方式的原因是:awt 是单线程模式的,所有 awt 的组件只能在(推荐方式)事件
处理线程中访问,从而保证组件状态的可确定性。
2 、 实现开始按钮事件和游戏模式选择事件;
button.addActionListener(new ActionListener() {// 为按钮添加事件监听器
public void actionPerformed(final ActionEvent e) {
new Thread(new Time()).start();
}
});
faceCombo.addActionListener(new
ActionListener()//为组合框添加事件监听器
{
public void actionPerformed(ActionEvent event)
{
if(faceCombo.getSelectedIndex()==1)
{
new ItemSelect();
winLabel.setText("您选中的是一号模式,请单击开始按钮进行比赛");
第 8 页 共 23 页