最近在搞一个弹球游戏,其中,用到了Java多线程的应用,首先,先说一下,什么叫做线程。或许大家都知道进程是什么,打开电脑的任务管理器,可以看到,里面有进程这个选项,非常明显,进程就是一个程序,而每个程序,有由多个线程组成。好了,这样说的不清不楚的,那么好,我用一个弹球小游戏来解释一下,那样可能大家会更容易理解些。
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 游戏界面类
*
* @author Administrator
*
*/
public class GameUI extends javax.swing.JFrame {
private static GameUI UI;
private java.awt.Graphics g;
private MyListener ml;
public javax.swing.JLabel text_field;
public javax.swing.JProgressBar pBar;
private String command;
public java.util.ArrayList<MyThread> list = new java.util.ArrayList<MyThread>();
private javax.swing.JToggleButton button;
public static void main(String args[]) {
UI = new GameUI();
UI.initUI();
}
/**
* 初始化窗体的方法
*/
public void initUI() {
// 设置标题
this.setTitle("是高手就坚持100s");
// 设置大小
this.setSize(610, 635);
// 设置关闭是退出程序
this.setDefaultCloseOperation(3);
// 设置打开窗体时在屏幕中间显示
this.setLocationRelativeTo(null);
// 设置窗体的流式布局管理器
this.setLayout(new java.awt.FlowLayout());
// 设置窗体背景颜色
this.getContentPane().setBackground(java.awt.Color.black);
// 创建文本标签对象
text_field = new javax.swing.JLabel();
javax.swing.JLabel lable = new javax.swing.JLabel("时 间 :");
// 设置文本标签前景颜色
lable.setForeground(java.awt.Color.red);
text_field.setForeground(java.awt.Color.red);
// 创建进度条对象
pBar = new javax.swing.JProgressBar(0, 330);
// 创建按钮对象
button = new javax.swing.JToggleButton();
button.setMargin(new Insets(0, 0, 0, 0));
button.setIcon(new javax.swing.ImageIcon("images/Pause.gif"));
button.setActionCommand("暂停");
// 通过匿名内部类来创建动作监听器
java.awt.event.ActionListener button_listener = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
String com = e.getActionCommand();
if (com.equals("暂停")) {
button.setMargin(new Insets(0, 0, 0, 0));
button
.setIcon(new javax.swing.ImageIcon(
"images/start.gif"));
button.setActionCommand("继续");
for (int i = 0; i < list.size(); i++) {
list.get(i).PauseThread();
}
}
if (com.equals("继续")) {
button.setMargin(new Insets(0, 0, 0, 0));
button
.setIcon(new javax.swing.ImageIcon(
"images/Pause.gif"));
button.setActionCommand("暂停");
for (int i = 0; i < list.size(); i++) {
list.get(i).ContinueThread();
}
}
}
};
button.addActionListener(button_listener);
this.add(button);
this.add(lable);
this.add(pBar);
this.add(text_field);
// 的到菜单条
javax.swing.JMenuBar bar = creatMenuBar();
// 为窗体设置菜单条
this.setJMenuBar(bar);
// 设置窗体的可见性
this.setVisible(true);
}
/**
* 创建菜单条的方法
*
* @return
*/
public javax.swing.JMenuBar creatMenuBar() {
// 创建菜单条对象
javax.swing.JMenuBar bar = new javax.swing.JMenuBar();
// 创建菜单对象
javax.swing.JMenu menu_menu = new javax.swing.JMenu("菜单");
javax.swing.JMenu difficulty_menu = new javax.swing.JMenu("难度");
javax.swing.JMenu help_menu = new javax.swing.JMenu("帮助");
// 创建菜单选项对象
javax.swing.JMenuItem star_item = new javax.swing.JMenuItem("开始");
javax.swing.JMenuItem exit_item = new javax.swing.JMenuItem("退出");
javax.swing.JMenuItem help_item = new javax.swing.JMenuItem("游戏说明");
javax.swing.JMenuItem about_item = new javax.swing.JMenuItem("关于");
// 创建单选选项
javax.swing.JRadioButtonMenuItem easy_item = new javax.swing.JRadioButtonMenuItem(
"简单");
javax.swing.JRadioButtonMenuItem middle_item = new javax.swing.JRadioButtonMenuItem(
"中等");
javax.swing.JRadioButtonMenuItem hard_item = new javax.swing.JRadioButtonMenuItem(
"困难");
// 创建一个按钮组
javax.swing.ButtonGroup group = new javax.swing.ButtonGroup();
// 将单选按钮添加到按钮组中
group.add(easy_item);
group.add(middle_item);
group.add(hard_item);
// 将单选按钮添加到菜单中
difficulty_menu.add(easy_item);
difficulty_menu.add(middle_item);
difficulty_menu.add(hard_item);
// 通过匿名内部类来创建动作监听器
ActionListener listener = new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
command = e.getActionCommand();
// 如果选择开始,则创建线程对象
if (command.equals("开始") && list.size() == 0) {
creatBall(20, 1);
}
// 如果选择退出按钮,则退出程序
if (command.equals("退出")) {
System.exit(0);
}
// 如果选择简单按钮
if (command.equals("简单") && list.size() == 0) {
creatBall(20, 1);
}
// 如果选择中等按钮
if (command.equals("中等") && list.size() == 0) {
creatBall(50, 2);
}
if (command.equals("困难") && list.size() == 0) {
creatBall(40, 2);
}
if (command.equals("游戏说明")) {
javax.swing.JOptionPane.showMessageDialog(null,
"移动鼠标,用挡板接球,如果接不住,就算输了……\n游戏可以选择难度,包括简单、中等、困难");
}
if (command.equals("关于")) {
javax.swing.JOptionPane
.showMessageDialog(null,
"这是一个用Java编写的小游戏……\n制作人:沈冠军\n时间:2010年8月\n版权所有,翻版必究!");
}
}
};
// 添加动作监听器
star_item.addActionListener(listener);
exit_item.addActionListener(listener);
easy_item.addActionListener(listener);
middle_item.addActionListener(listener);
hard_item.addActionListener(listener);
help_item.addActionListener(listener);
about_item.addActionListener(listener);
// 将菜单选项对象添加到菜单对象上
menu_menu.add(star_item);
menu_menu.add(exit_item);
help_menu.add(help_item);
help_menu.add(about_item);
// 将菜单对象添加到菜单条上
bar.add(menu_menu);
bar.add(difficulty_menu);
bar.add(help_menu);
// 返回菜单条对象
return bar;
}
/**
* 创建线程对象的方法
*
* @param speed
* :速度
*
*/
public void creatBall(int speed, int num) {
java.util.Random ran = new java.util.Random();
if (ml == null) {
g = UI.getGraphics();
ml = new MyListener(g);
UI.addMouseListener(ml);
UI.addMouseMotionListener(ml);
}
for (int i = 0; i < num; i++) {
int x = ran.nextInt(600) + 10;
int y = ran.nextInt(300) + 100;
MyThread th = new MyThread(g, ml, UI, x, y, speed);
list.add(th);
th.start();
}
}
/**
* 得到命令的方法
*/
public String getCommand() {
return command;
}
}import java.awt.Color;
import javax.swing.JOptionPane;
/**
* 线程类
*
* @author Administrator
*
*/
public class MyThread extends Thread {
private int width = 20, height = 20;
private int x, y;
private java.awt.Graphics g;
private GameUI UI;
private boolean isexist = true;
private MyListener listener;
private int speed;
private int x1 = 12, y1 = 12;
private long start, end;
private long last_time;
private int response;
private boolean isFinish = true;
private boolean isPause = true;
private java.util.ArrayList<MyThread> list;
private float value = 320;
private java.awt.Color color = java.awt.Color.blue;
/*
* 重写构造器
*/
public MyThread(java.awt.Graphics g, MyListener listener, GameUI UI, int x,
int y, int speed) {
this.g = g;
this.UI = UI;
this.x = x;
this.y = y;
this.speed = speed;
this.listener = listener;
}
/*
* (non-Javadoc)重写run的方法
*
* @see java.lang.Thread#run()
*/
public void run() {
drawOval();
}
/**
* 创建线程的方法
*/
public void drawOval() {
start = System.currentTimeMillis();
while (isFinish) {
while (isPause) {
synchronized(this.g){
// 画一个圆
g.setColor(java.awt.Color.black);
g.fillOval(x, y, width, height);
x += x1;
y += y1;
getColors();
g.setColor(color);
g.fillOval(x, y, width, height);
}
int x2 = listener.getX();
if (x > 580) {
x1 = -12;
}
if (x < 10) {
x1 = 12;
}
if (y < 90) {
y1 = 12;
}
if (y > 595 && x > x2 && x < x2 + 100) {
y1 = -12;
}
if (y > 630) {
if (isexist) {
isAgain();
}
stopThread();
}
try {
Thread.sleep(speed);
value -= 0.1;
} catch (Exception ef) {
ef.printStackTrace();
}
// 将前一次画的清除掉
end = System.currentTimeMillis();
last_time = 100 - (end - start) / 1000;
UI.text_field.setText(last_time + "s");
UI.pBar.setValue((int) value);
if (last_time == 0) {
list = UI.list;
for (int j = 0; j < list.size(); j++) {
// 停在线程,并且去掉最后一个圆
list.get(j).stopThread();
list.get(j).fadeOval();
}
stopThread();
showDialog();
}
}
}
}
/**
* 线程结束时消去最后一个圆的方法
*/
public void fadeOval() {
g.setColor(java.awt.Color.black);
g.fillOval(x, y, width, height);
}
/**
* 重来对话框的处理方法
*/
public void isAgain() {
isexist = false;
list = UI.list;
System.out.println(list.size());
for (int j = 0; j < list.size(); j++) {
// 停在线程,并且去掉最后一个圆
list.get(j).stopThread();
list.get(j).fadeOval();
}
Object[] options = { "是", "否" };
String command = UI.getCommand();
response = JOptionPane.showOptionDialog(null,
"哈哈,你输了!不要灰心\n坚持就是胜利,是否再来一次?", null, JOptionPane.YES_OPTION,
JOptionPane.NO_OPTION, null, options, null);
System.out.println(response);
if (response == 0) {
if (command.equals("简单") || command.equals("开始")) {
AgainThread();
if (list.size() != 0) {
// 现将原来的对象从队列中移除
list.removeAll(list);
UI.creatBall(20, 1);
}
}
if (command.equals("中等")) {
AgainThread();
if (list.size() != 0) {
list.removeAll(list);
UI.creatBall(50, 2);
}
}
if (command.equals("困难")) {
AgainThread();
if (list.size() != 0) {
list.removeAll(list);
UI.creatBall(40, 2);
}
}
}
// 如果点击关闭,则将线程对象从队列中移除
if (response == -1 || response == 1) {
list.removeAll(list);
}
}
/**
* 停止线程的方法
*/
public void stopThread() {
isFinish = false;
isPause = false;
}
/**
* 暂停线程的方法
*/
public void PauseThread() {
isPause = false;
}
/**
* 继续线程的方法
*/
public void ContinueThread() {
isPause = true;
}
/**
* 是否重来的方法
*/
public void AgainThread() {
isFinish = true;
isPause = true;
}
public void getColors() {
if (x % 2 == 0 && y % 2 == 0) {
color = java.awt.Color.green;
}
if (x % 2 == 0 && y % 2 != 0) {
color = java.awt.Color.red;
}
if (x % 2 != 0 && y % 2 != 0) {
color = java.awt.Color.orange;
}
if (x % 2 != 0 && y % 2 != 0) {
color = java.awt.Color.yellow;
}
}
public void showDialog() {
javax.swing.JOptionPane
.showInputDialog("好样的,你是真的高手,\n恭喜你坚持了100s\n请输入您的大名");
}
}
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
/**
* 鼠标监听器的类
*
* @author Administrator
*
*/
public class MyListener extends java.awt.event.MouseAdapter {
private java.awt.Graphics g;
private int x = 5, y = 620;
private int width = 100, height = 10;
public MyListener(java.awt.Graphics g) {
this.g = g;
}
public void mouseMoved(MouseEvent e) {
// 设置画布对象颜色
synchronized (this.g) {
g.setColor(java.awt.Color.black);
g.fillRect(x, y, width, height);
x = e.getX();
g.setColor(java.awt.Color.green);
g.fillRect(x, y, width, height);
}
}
/**
* 得到x的方法
*
* @return:x
*/
public int getX() {
return x;
}
}
界面效果图:
好了,大家看到了,线程的作用就是在一个程序中可以同时做不、同的事,就像上面的 弹球游戏,它可以在画矩形的同时画圆,两个可以同时发生,当选择难度时可以看都,可以同时画多个球。
- 大小: 34.6 KB
分享到:
相关推荐
总的来说,"JAVA编写的多线程小弹球测试"项目涵盖了Java多线程、GUI编程、随机数生成和颜色处理等多个重要知识点,是学习和实践Java并发编程的好案例。通过这个项目,开发者不仅可以锻炼到编程技巧,还能深入理解...
下面将详细探讨Java多线程在弹球游戏中如何应用以及相关知识点。 首先,我们要理解Java中的线程。线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程...
Java做的弹球图形界面小游戏使用awt.*可以创建多个小球.
在游戏开发领域,虽然不如专门的游戏引擎那么流行,但Java同样可以创造出有趣且互动性强的小游戏。"弹球程序"就是一个很好的例子,它展示了Java在实现简单但引人入胜的休闲游戏方面的潜力。 "打砖块"是一款经典的...
【标题】:“弹球游戏(Java程序)”是一款基于Java编程语言开发的桌面游戏,它利用了Swing库和多线程技术来实现动态的弹球运动效果。 【描述】:该程序是在Eclipse集成开发环境中创建的,利用了SwingDesigner工具...
通过这个弹球小游戏的开发,你可以深入理解Java的面向对象编程、GUI设计、多线程、事件处理以及基本的物理模拟。这不仅是提升编程技能的好途径,也是对软件工程实践经验的积累。无论是作为课程设计的一部分,还是...
Java 程序设计实验报告之弹球游戏实现 本实验报告的目的是掌握 ...本实验报告实现了一个完整的弹球游戏,掌握了 Java 语言的图形用户界面编程、事件处理、多线程编程等技术,并培养了独立查找资料、解决问题的能力。
在本项目中,“Java 弹球小游戏”是一个利用Java编程语言开发的互动游戏,它具有多线程特性,使得每个弹球都能独立运动。通过点击“add”按钮,玩家可以增加新的弹球到游戏中,每个新加入的弹球都会拥有自己独立的...
多线程是Java并发编程的基础,可以显著提高程序的执行效率,特别是在处理图形界面和游戏逻辑时。实验中,多线程被用来独立控制每个小球的运动,实现动画效果。 - **Runnable接口**: 小球的运动逻辑可以通过实现...
用户能通过GUI组件指定生成小球的...鼠标在界面中显示为方块状,玩家需来回移动鼠标以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。 程序需提供计时功能,并最终显示玩家能坚持多少秒。
总的来说,"弹球小游戏源码"是一个集Java基础、GUI编程、面向对象设计、物理模拟、事件处理等多方面知识于一体的项目。无论是初学者还是有一定经验的开发者,都能从中获益,提高自己的编程能力和游戏开发技巧。通过...
【Android Studio小游戏:弹球小游戏】是基于Android开发平台,使用Android Studio集成开发环境创建的一款简单而有趣的休闲游戏。这个游戏通常包含一个弹球和多个障碍物,玩家通过控制挡板来反射弹球,避免弹球掉落...
总之,这个Java弹球游戏项目是学习Java GUI编程、多线程处理和基本物理模拟的一个很好的实践案例。通过分析源代码,我们可以深入理解这些核心概念,并将它们应用到其他更复杂的项目中。对于初学者来说,这是一个不错...
总结来说,开发JAVA手机弹球小游戏涉及到JAVA GUI编程、游戏逻辑实现、用户交互设计、资源管理等多个方面,需要开发者具备扎实的JAVA基础和良好的编程习惯,同时对移动平台特性有深入理解。这样的项目不仅是提升编程...
Java弹球小游戏是一款基于Java编程语言开发的简单娱乐软件,旨在帮助初学者了解游戏开发的基础知识,同时也为有经验的开发者提供一个回顾基础的平台。这个项目包含了一系列的Java源代码文件,允许用户直接运行体验...
本项目是一个基于Java编写的弹球小游戏,它为初学者提供了一个实际操作和学习Java语言的良好平台。下面将详细介绍这个弹球游戏涉及的Java知识点。 1. **Java基础语法**:游戏的核心代码会涉及到变量声明、条件语句...
【标题】"弹球小游戏 Java作业.zip"是一个包含Java编程语言实现的小游戏源代码,主要目的是作为学生们的毕业设计或课程设计项目,同时也适合初学者练习编程技能。这个项目的核心是一个弹球游戏,通常这样的游戏会...
该程序利用了Java AWT 和 Swing 的组件以及线程来实现动态效果。 ### 关键类介绍 #### 1. **`TanQiu` 类** 这是程序的主类,包含了`main`方法,用于启动应用程序。 - `EventQueue.invokeLater(Runnable)`:此...
Java 桌面弹球是一款基于Java编程语言开发的小型游戏,它利用Java的图形用户界面(GUI)库,如Swing或JavaFX,来创建一个互动的弹球游戏。这个游戏通常包括一个桌面背景,一个可移动的挡板,以及在屏幕上弹跳的弹球...