华东交通大学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、开始比赛之后以动画显示赛跑过程。
用户进入游戏界面后,先选择游戏模式,然后单击开始按钮,乌龟和兔子将会以随机的速度开始朝终点线爬行,通过java中重复刷新技术达到动画效果,给用户更逼真的感官。
第 3 页 共 23 页 East China Jiaotong University
华东交通大学08级信息计算科学 第三章、主体内容
一、设计分析
第一步:设计良好游戏界面
功能:实现基本的开始、退出游戏功能、选择游戏模式等。 基本步骤:
backgroundPanel 添 加 JPanel JtextArea JcomboBox Jbutton 添 加 乌龟标签兔子标签胜利信息的呈现选择按钮提示模式信息呈现模用式于选择不同的比赛开始按钮结束按钮 在实现过程中会遇到的问题及解决方案:
1、 2、
背景面板上加载图片时需要重写paintComponent方法
布局必须合理设置(GridLayout不能改变组件的具体位置但可以缩放时相对位置不变。FlowLayout默认是占满第一行转向第二行,并且放大时相对位置改变。Null布局可以自由布置组件位置和大小,但不易实现窗口放大时相对大小随之变化。)若设置不合理,就可能出现多种错误。列如:无法插入背景图片,组建不能显现,组件位置与设计不符等等。
第 4 页 共 23 页 East China Jiaotong University
华东交通大学08级信息计算科学 3、 添加背景面板监听重置各面板位置才能实现窗口放大时的相对位置不变
第二步:线程类的设计
功能:实现多只乌龟,兔子的多线程运行 具体步骤:
class Run类(是主类,继承Jframe主要用于线程事件的SwingResourceManager类,对图片加载方法的重写集合 Time类 RabbitThread类 RabbitOneThread类 TortoiseThread类 逻辑控制) ItemSelect类 第二步会遇到的问题及解决方案:
1、 建立兔子线程,继承接口Runnable并正确的实现run()方法。同时要特别注意
兔子在比赛中还要模拟睡觉的动作。
2、 建立乌龟线程,继承接口Runnable并实现其run()方法,要与兔子多线程运行; 3、 为了实现可选择多只龟兔进行赛跑,要实现多个兔子,乌龟线程,并能并发
运行。
4、 游戏中提供了模式选择的功能,通过建立ItemSelect类来建立不同的游戏模
式。
第 5 页 共 23 页 East China Jiaotong University
华东交通大学08级信息计算科学 二、程序结构及流程图
三、各模块的功能及程序说明
龟兔赛跑程序主要由以下几个模块构成:
第 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) } catch (InterruptedException e) { e.printStackTrace();} rabbit.setText(\"\");}来随时获取兔子和乌龟的位置,当兔子跑到乌 龟前面时兔子线程就会模拟睡觉4到8秒。 模块二:乌龟线程模块 该模块主要是实现乌龟运行线程,类TortoiseThread继承了接口Runnable并实现其方法run(),主要功能的实现: SPEED = (int)(Math.random()*5); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace();} if (tortoise.getLocation().y > tortoise.getHeight()/2) { Point point = tortoise.getLocation(); 第 7 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 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(\"您选中的是一号模式,请单击开始按钮进行比赛\"); } if(faceCombo.getSelectedIndex()==0) { 第 8 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 } new ItemSelect1(); winLabel.setText(\"您选中的是二号模式,请单击开始按钮进行比赛\"); }}); 模块四:时间模块 该模块的主要功能是在用户选择不同的游戏模式下,建立不同的不同的并发线程; if(faceCombo.getSelectedIndex()==1) { new Thread(new RabbitThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseThread()).start();//创建线程并开始执行线程 } if(faceCombo.getSelectedIndex()==0) { new Thread(new RabbitThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseThread()).start();//创建线程并开始执行线程 new Thread(new RabbitOneThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseOneThread()).start();//创建线程并开始执行线程 } 模块五:游戏模式模块 该模块的作用是在用户选择不同的游戏模式下,为游戏界面初始化不同的画面;主要是使用组件加载的语句来实现不同数量龟兔的赛跑模式; 模块六:图片加载类模块 该模块的作用是一个有关图片加载的重写方法的类集合;主要有以下方法: private static Image getImage(InputStream is) { } public static Image getImage(Class> clazz, String path) { } public static Image getImage(String path) { } public static Image getImage(String section, String path) { } public static void clearImages(String section) { } 第 9 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 public static ImageIcon getIcon(Class> clazz, String path) { } public static ImageIcon getIcon(String path) { } public static ImageIcon getIcon(String section, String path) { } public static ImageIcon getIcon(Image image) { } 四、源程序 package com.lzw; import java.awt.BorderLayout; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.JComboBox; import com.swtdesigner.SwingResourceManager; public class Run extends JFrame { private String win = \"\";// 胜利信息 private JTextArea textArea;// 文本域组件 JLabel tortoise;// 乌龟标签组件 JLabel tortoise1;// 乌龟标签组件 JLabel tortoise2;// 乌龟标签组件 第 10 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 JLabel rabbit;// 兔子标签组件 JLabel rabbit1;// 兔子标签组件 JLabel rabbit2;// 兔子标签组件 private JLabel winLabel;// 显示胜利信息的标签组件 private boolean isStart = false;// 游戏是否开始的状态变量 private boolean sleep = true;// 兔子是否睡过觉的状态变量 private JComboBox faceCombo; //页面的组合框,用于数量的选择 BackgroundPanel backgroundPanel= new BackgroundPanel() ;// 创建面板组件 public static void main(String args[]) { } /** * Create the frame */ public Run() { super(); setBounds(100, 100, 500, 700); backgroundPanel.setImage(SwingResourceManager.getImage(Run.class, EventQueue.invokeLater(new Runnable() { public void run() { try { Run frame = new Run();// 创建本类实例对象 frame.setVisible(true);// 显示窗体 } catch (Exception e) { //处理异常 e.printStackTrace(); }}}); \"background.jpg\")); getContentPane().add(backgroundPanel, BorderLayout.CENTER);// 添加面板到窗体 faceCombo=new JComboBox(); 第 11 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 faceCombo.setBackground(Color.GREEN); faceCombo.setEnabled(true); faceCombo.addItem(\"1\"); faceCombo.addItem(\"2\"); faceCombo.addItem(\"3\"); faceCombo.setBounds(366, 10, 122, 44); backgroundPanel.add(faceCombo);// 添加标签到面板 faceCombo.addActionListener(new { public void actionPerformed(ActionEvent event) { if(faceCombo.getSelectedIndex()==1) { } if(faceCombo.getSelectedIndex()==0) { new ItemSelect1(); winLabel.setText(\"您选中的是二号模式,请单击开始按钮进行比赛\"); new ItemSelect(); winLabel.setText(\"您选中的是一号模式,请单击开始按钮进行比赛\"); ActionListener() }}}); final JButton button = new JButton();// 创建开始按钮 button.setPressedIcon(SwingResourceManager.getIcon(Run.class, \"start2.png\")); button.setFocusPainted(false); button.setContentAreaFilled(false); button.setBorderPainted(false); button.setIcon(SwingResourceManager.getIcon(Run.class, \"start.png\")); 第 12 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 } /** button.addActionListener(new ActionListener() {// 为按钮添加事件 public void actionPerformed(final ActionEvent e) { new Thread(new Time()).start(); }}); button.setText(\"开始\"); button.setBounds(366, 537, 143, 170); backgroundPanel.add(button);// 添加按钮到面板组件 textArea = new JTextArea(); textArea.setForeground(Color.GREEN); textArea.setFocusable(false); textArea.setFont(new Font(\"楷体extArea.setOpaque(false); textArea.setEditable(false); textArea.setLineWrap(true); textArea.setText(\"请先选择比赛模式\"); textArea.setBounds(240, 10, 122, 44); backgroundPanel.add(textArea); winLabel = new JLabel(); winLabel.setForeground(Color.GREEN); winLabel.setText(\"比赛中.......\"); winLabel.setBounds(51, 10, 157, 27); backgroundPanel.add(winLabel); * Create the first model */ class ItemSelect { 第 13 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 /** public ItemSelect() { rabbit = new JLabel();// 创建显示兔子的标签 rabbit.setHorizontalTextPosition(SwingConstants.CENTER); rabbit.setIcon(SwingResourceManager.getIcon(Run.class, \"rabbit.png\")); rabbit.setBounds(135, 591, 73, 73); backgroundPanel.add(rabbit);// 添加标签到面板 tortoise = new JLabel();// 创建显示乌龟的标签组件 tortoise.setIcon(SwingResourceManager.getIcon(Run.class, \"tortoise.png\")); tortoise.setText(\"乌龟\"); tortoise.setBounds(267, 591, 82, 63); backgroundPanel.add(tortoise);// 添加标签到面板 }} * Create the second model */ class ItemSelect1 { public ItemSelect1() { rabbit = new JLabel();// 创建显示兔子的标签 rabbit.setHorizontalTextPosition(SwingConstants.CENTER); rabbit.setIcon(SwingResourceManager.getIcon(Run.class, \"rabbit.png\")); rabbit.setBounds(115, 591, 73, 73); backgroundPanel.add(rabbit);// 添加标签到面板 rabbit1 = new JLabel();// 创建显示兔子的标签 rabbit1.setHorizontalTextPosition(SwingConstants.CENTER); 第 14 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 rabbit1.setIcon(SwingResourceManager.getIcon(Run.class, \"rabbit.png\")); rabbit1.setBounds(185, 591, 70, 73); backgroundPanel.add(rabbit1);// 添加标签到面板 tortoise = new JLabel();// 创建显示乌龟的标签组件 tortoise.setIcon(SwingResourceManager.getIcon(Run.class, \"tortoise.png\")); tortoise.setText(\"乌龟\"); tortoise.setBounds(225, 591, 82, 63); backgroundPanel.add(tortoise);// 添加标签到面板 tortoise1 = new JLabel();// 创建显示乌龟的标签组件 tortoise1.setIcon(SwingResourceManager.getIcon(Run.class, \"tortoise.png\")); tortoise1.setText(\"乌龟\"); tortoise1.setBounds(225, 591, 82, 63); backgroundPanel.add(tortoise1);// 添加标签到面板 }} /** * 设置胜利者的方法,该方法是线程同步的 */ private synchronized void setWin(String str) { /** * 比赛开始 */ class Time implements Runnable { if (win.isEmpty()) {// 如果没有设置胜利者 }} win = str;// 设置胜利者为str参数指定角色 winLabel.setText(win); isStart = false; 第 15 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 private RabbitThread rabbitThread; private TortoiseThread tortoiseThread; public void run() { rabbit.setLocation(135, 591);// 设置兔子标签的位置 tortoise.setLocation(267, 591);// 设置乌龟标签的位置 win = \"\";// 清除胜利信息 winLabel.setText(\"比赛中.......\");// 设置比赛状况信息 isStart = true; sleep = true; if(faceCombo.getSelectedIndex()==1) { new Thread(new RabbitThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseThread()).start();//创建线程并开始执行线程 } if(faceCombo.getSelectedIndex()==0) { new Thread(new RabbitThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseThread()).start();//创建线程并开始执行线程 new Thread(new RabbitOneThread()).start();//创建线程并开始执行线程 new Thread(new TortoiseOneThread()).start();//创建线程并开始执行线程 }} } /** * 控制兔子1的线程 */ class RabbitThread implements Runnable { private int SPEED ;//兔子的移动速度 private boolean stop=true; private boolean awake=true; 第 16 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 public void run() { while(stop){ SPEED = (int)(Math.random()*10); try { Thread.sleep(50); } catch (InterruptedException e) { } if(rabbit.getLocation().y > rabbit.getHeight()/2) {//如果兔子1没到终点 } else { setWin(\"兔子1胜利\"); stop=false; } Point point = rabbit.getLocation(); Point point1 = tortoise.getLocation(); if(((point.y+100) Point point2 = rabbit.getLocation();//获取兔子1的位置 rabbit.setLocation(point2.x, point2.y - SPEED);//使兔子1移动 e.printStackTrace(); try { Thread.sleep((long)(Math.random() * 4000 + 4000));// 线程随机休眠8至12秒 } catch (InterruptedException e) { } rabbit.setText(\"\"); e.printStackTrace(); 第 17 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 } }}} /** * 控制兔子2的线程 */ class RabbitOneThread implements Runnable { private int SPEED ;//兔子1的移动速度 private boolean stop=true; private boolean awake=true; public void run() { while(stop){ SPEED = (int)(Math.random()*10); try { Thread.sleep(50); } catch (InterruptedException e) { } e.printStackTrace(); if(rabbit1.getLocation().y > rabbit1.getHeight()/2) {//如果兔子2没到终点 } else { setWin(\"兔子2胜利\"); stop=false; } Point point = rabbit1.getLocation(); Point point2 = rabbit1.getLocation();//获取兔子2的位置 rabbit1.setLocation(point2.x, point2.y - SPEED);//使兔子2移动 第 18 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 Point point3 = tortoise1.getLocation(); if(((point.y+100) try { Thread.sleep((long) (Math.random() * 4000 + 4000));// 线程随机休眠8至12秒 } catch (InterruptedException e) { } rabbit1.setText(\"\"); e.printStackTrace(); }}}} /** * 控制乌龟1的线程 */ class TortoiseThread implements Runnable { private int SPEED;//乌龟1的移动速度 private boolean stop=true; public void run() { while(stop){ SPEED = (int)(Math.random()*5); try { Thread.sleep(50); } catch (InterruptedException e) { } if (tortoise.getLocation().y > tortoise.getHeight()/2) {//如果乌龟没到终点 Point point = tortoise.getLocation();//获取乌龟的位置 tortoise.setLocation(point.x, point.y - SPEED);//使乌龟移动 e.printStackTrace(); 第 19 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 } else { setWin(\"乌龟1胜利\"); stop=false; }} }} /** * 控制乌龟2的线程 */ class TortoiseOneThread implements Runnable{ private int SPEED;//乌龟1的移动速度 private boolean stop=true; public void run() { if(faceCombo.getSelectedIndex()==0) { while(stop){ SPEED = (int)(Math.random()*5); try { Thread.sleep(50); } catch (InterruptedException e) { } e.printStackTrace(); if (tortoise1.getLocation().y > tortoise1.getHeight()/2) {//如果乌龟2没到终点 } else { Point point = tortoise1.getLocation();//获取乌龟2的位置 tortoise1.setLocation(point.x, point.y - SPEED);//使乌龟2移动 第 20 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 } setWin(\"乌龟2胜利\"); stop=false; } }}}} 五、操作方法及试验结果: (开始游戏,选择一号模式然后单击开始) (一号模式有龟兔各两只) 第 21 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 (一号模式下到达终点,乌龟一号先到达) (选择二号模式下有龟兔各一只) (一号模式下龟兔到达终点) 第 22 页 共 23 页 East China Jiaotong University 华东交通大学08级信息计算科学 第四章、设计体会 本系统是一个基于多线程模式的龟兔赛跑小游戏,系统的规模很有限,功能实现也相 对简单,但作为一个完整的系统,在整个过程中我还是学到了不少的知识,也对java语言有了较深的体会。 通过本次课设试验,我对java的熟练程度得到了很大的提升,对包括多线程在内的java语言高级技术掌握的也更加熟练了,更对面向对象的分析思想,面向对象的设计方法有了直观的体会。同时,在游戏的制作过程中要用到很多课本上并未介绍到的知识,例如多线程队列事件等等,通过网络学习和与组员的交流使得自己对该部分的知识有了更广泛更深刻的体会。当然,在课设中不能忽视的是我们组员之间的相互合作,相互帮助。通过课设也让我们明白了如何在团队中成长,如何更好的团结团队成员共同完成任务。 本次系统的功能相对还比较单一,只能选择两种游戏模式,并且游戏也相对单调,缺乏趣味性,离一个真正的游戏软件还相差很远,以后如有时间,可以考虑去做一个真正的游戏软件。 第五章、参考文献: 1 [美]Rogers Cadenhead. Java编程入门经典.梅兴文译.第4版.北京:人民邮电出版社,2007 2 [美]Bruce Eckel. Thinking In Java.英文第4版.北京:机械工业出版社,2007 3 陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006 4 杨昭编著.二级Java语言程序设计教程.北京:中国水利水电出版社,2006 5 赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006 6 赵毅主编.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006 第 23 页 共 23 页 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务