`
沈冠军
  • 浏览: 111257 次
  • 性别: Icon_minigender_1
  • 来自: 玉林
社区版块
存档分类
最新评论

Java 多线程的利用(弹球小游戏)

阅读更多



      最近在搞一个弹球游戏,其中,用到了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编写的多线程小弹球测试"项目涵盖了Java多线程、GUI编程、随机数生成和颜色处理等多个重要知识点,是学习和实践Java并发编程的好案例。通过这个项目,开发者不仅可以锻炼到编程技巧,还能深入理解...

    java弹球小游戏,多线程

    下面将详细探讨Java多线程在弹球游戏中如何应用以及相关知识点。 首先,我们要理解Java中的线程。线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程...

    Java多线程弹球

    Java做的弹球图形界面小游戏使用awt.*可以创建多个小球.

    java经典小游戏弹球程序

    在游戏开发领域,虽然不如专门的游戏引擎那么流行,但Java同样可以创造出有趣且互动性强的小游戏。"弹球程序"就是一个很好的例子,它展示了Java在实现简单但引人入胜的休闲游戏方面的潜力。 "打砖块"是一款经典的...

    弹球游戏(java程序)

    【标题】:“弹球游戏(Java程序)”是一款基于Java编程语言开发的桌面游戏,它利用了Swing库和多线程技术来实现动态的弹球运动效果。 【描述】:该程序是在Eclipse集成开发环境中创建的,利用了SwingDesigner工具...

    弹球小游戏java实现.zip

    通过这个弹球小游戏的开发,你可以深入理解Java的面向对象编程、GUI设计、多线程、事件处理以及基本的物理模拟。这不仅是提升编程技能的好途径,也是对软件工程实践经验的积累。无论是作为课程设计的一部分,还是...

    Java程序设计实验报告2(弹球游戏)[1]1.pdf

    Java 程序设计实验报告之弹球游戏实现 本实验报告的目的是掌握 ...本实验报告实现了一个完整的弹球游戏,掌握了 Java 语言的图形用户界面编程、事件处理、多线程编程等技术,并培养了独立查找资料、解决问题的能力。

    Java 弹球小游戏

    在本项目中,“Java 弹球小游戏”是一个利用Java编程语言开发的互动游戏,它具有多线程特性,使得每个弹球都能独立运动。通过点击“add”按钮,玩家可以增加新的弹球到游戏中,每个新加入的弹球都会拥有自己独立的...

    Java程序设计实验报告2(弹球游戏)

    多线程是Java并发编程的基础,可以显著提高程序的执行效率,特别是在处理图形界面和游戏逻辑时。实验中,多线程被用来独立控制每个小球的运动,实现动画效果。 - **Runnable接口**: 小球的运动逻辑可以通过实现...

    JAVA Swing图形用户界面编程 多线程编程 弹球游戏

    用户能通过GUI组件指定生成小球的...鼠标在界面中显示为方块状,玩家需来回移动鼠标以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。 程序需提供计时功能,并最终显示玩家能坚持多少秒。

    弹球小游戏源码

    总的来说,"弹球小游戏源码"是一个集Java基础、GUI编程、面向对象设计、物理模拟、事件处理等多方面知识于一体的项目。无论是初学者还是有一定经验的开发者,都能从中获益,提高自己的编程能力和游戏开发技巧。通过...

    Android studio 小游戏,弹球小游戏

    【Android Studio小游戏:弹球小游戏】是基于Android开发平台,使用Android Studio集成开发环境创建的一款简单而有趣的休闲游戏。这个游戏通常包含一个弹球和多个障碍物,玩家通过控制挡板来反射弹球,避免弹球掉落...

    java弹球游戏源码已编译

    总之,这个Java弹球游戏项目是学习Java GUI编程、多线程处理和基本物理模拟的一个很好的实践案例。通过分析源代码,我们可以深入理解这些核心概念,并将它们应用到其他更复杂的项目中。对于初学者来说,这是一个不错...

    JAVA 手机弹球小游戏

    总结来说,开发JAVA手机弹球小游戏涉及到JAVA GUI编程、游戏逻辑实现、用户交互设计、资源管理等多个方面,需要开发者具备扎实的JAVA基础和良好的编程习惯,同时对移动平台特性有深入理解。这样的项目不仅是提升编程...

    Java弹球小游戏.zip

    Java弹球小游戏是一款基于Java编程语言开发的简单娱乐软件,旨在帮助初学者了解游戏开发的基础知识,同时也为有经验的开发者提供一个回顾基础的平台。这个项目包含了一系列的Java源代码文件,允许用户直接运行体验...

    java编写弹球小程序

    本项目是一个基于Java编写的弹球小游戏,它为初学者提供了一个实际操作和学习Java语言的良好平台。下面将详细介绍这个弹球游戏涉及的Java知识点。 1. **Java基础语法**:游戏的核心代码会涉及到变量声明、条件语句...

    弹球小游戏 Java作业.zip

    【标题】"弹球小游戏 Java作业.zip"是一个包含Java编程语言实现的小游戏源代码,主要目的是作为学生们的毕业设计或课程设计项目,同时也适合初学者练习编程技能。这个项目的核心是一个弹球游戏,通常这样的游戏会...

    java弹球程序弹球程序

    该程序利用了Java AWT 和 Swing 的组件以及线程来实现动态效果。 ### 关键类介绍 #### 1. **`TanQiu` 类** 这是程序的主类,包含了`main`方法,用于启动应用程序。 - `EventQueue.invokeLater(Runnable)`:此...

    java 桌面弹球

    Java 桌面弹球是一款基于Java编程语言开发的小型游戏,它利用Java的图形用户界面(GUI)库,如Swing或JavaFX,来创建一个互动的弹球游戏。这个游戏通常包括一个桌面背景,一个可移动的挡板,以及在屏幕上弹跳的弹球...

Global site tag (gtag.js) - Google Analytics