`
guanxianxiao
  • 浏览: 20181 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

小球碰撞“因为有你,所以不孤单”——多线程

阅读更多
线程:在接触之前一直觉得线程是很高端的,学了线程就会有质的飞跃,我们就可以从只能写出简单的界面什么滴,到可以做一些小游戏,坦克大战、弹球···。但当接触学习后,发现其实也就是几行代码的问题,并没有当初接触前想的那么神乎其神。
        线程可以理解为“程序内部一个独立的运行单位”。每个java程序至少都至少有一个线程-主程序。
        每个独立运行的对象都可以看做是一个线程,坦克大战中的各个坦克、弹球中的各个小球、雷电中的各个飞机····都可以理解是一个线程。
       
单线程:
public void ma(){
mb();
md();
}
public void mb(){
mc();
}
public void mc(){
}
public void md(){
}
这种模型的特点是:只有当mb执行完毕后,ma才会返回,只有当mc执行完毕后,mb才可能完
成;在ma()调用中,只有当mb()执行完毕后,才会执行到md(),这是顺序的调用模型,我们
称之为单线程模型。


多线程:
多线程模型就是将代码的调用放到一个独立的运行单元-线程中,让多个调用并执行。

多线程的实现:关键字 Thread  start()
每个线程对象都是继承java.unit.Thread类的对象或implements了java.unit.Runnable
接口类的对象,线程的启动是通过调用线程对象的start()方法启动,线程的运行是
从线程对象的run方法开始,的那个线程对象的run()方法结束后线程结束。

继承Thread类实现线程

public calss 类名 extends Thread{//继承Thread类
//线程执行入口,调用线程对象的start()方法后,线程就从它的run方法开始独立执行
public void run(){
//线程中具体要实现的功能 
code····
}
}

//在主函数中实例化对象并调用其start()方法
类名 对象名  = new 对象名();
对象名.start();//开启线程

实例:
小球碰撞

小球类:

public class Ball extends Thread{
	
	public Ball(JPanel jp,Ball[] ball,int count){
		this.jp = jp;
		this.ball_1=ball;
		this.count=count;
		System.out.println("加一个圆"+count);
	}

	public void run(){
	
		g = jp.getGraphics();
		Random ran = new Random();
		int x =ran.nextInt(300)+50;
		int y = ran.nextInt(300)+50;
		int width=ran.nextInt(20)+30;
		int height=width;

		
		System.out.println("初始位置为"+x+"\t"+y);
		
		xspeed = ran.nextInt(10)+1;
		yspeed = ran.nextInt(10)+1;
		xspeed =1;
		yspeed =1;	
		int i =ran.nextInt(7);
		Color []color ={Color.BLUE,Color.lightGray,Color.GREEN,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE};
		while(true){
			System.out.println("开始运行"+count);
			if(x<0||x>400-width){
				xspeed=-xspeed;
			}
			if(y<0||y>400-height){
				yspeed=-yspeed;
			}
			
			g.setColor(Color.BLACK);
			g.fillOval(x, y, width, height);
			
			x+=xspeed;
			y+=yspeed;
			g.setColor(color[i]);
			
			xpoint=x+width/2;//圆心坐标
			ypoint=y+height/2;
			r= (width*Math.sqrt(2));//直径
			
			this.hit();
			
			g.fillOval(x, y, width, height);
			
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
}
	public void hit(){
		if(count>=2){
		for(int i=0;i<count;i++){
			if(ball_1[i]==this){
				continue ;
			}
			double length = Math.sqrt(Math.pow((ball_1[i].getX()-this.xpoint),2)+Math.pow((ball_1[i].getY()-this.ypoint),2));
			double l =( ball_1[i].getr()+this.r)/2;
			if(length<=l){
				int xspeed_temp,yspeed_temp;
				xspeed_temp=this.xspeed;
				yspeed_temp=this.yspeed;
				this.xspeed=ball_1[i].getxspeed();
				this.yspeed=ball_1[i].getyspeed();
				ball_1[i].setxspeed(xspeed_temp);
				ball_1[i].setyspeed(yspeed_temp);
			}
		}
		}
		
	}

	public double getX(){
		return xpoint;
	}

	public double getY(){
		return ypoint;
	}
	
	public double getr(){
		return r;
	}
	public int getcount(){
		return count;
	}
	public void setxspeed(int x){
		xspeed=x;
	}
	public void setyspeed(int y){
		yspeed=y;
	}
	public int getxspeed(){
		return xspeed;
	}
	public int getyspeed(){
		return yspeed;
	}
	
	Graphics g;
	private JPanel jp;
	private double xpoint,ypoint;
	private double r;
	private int xspeed,yspeed;
	private int count;
	private Ball[] ball_1 = new Ball [10];
}


主函数:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BallBoard extends JPanel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 BallBoard  bb = new BallBoard ();
		bb.initUI();
		}

	private void initUI() {
		JFrame  jf = new JFrame();
		jf.setTitle("小球移动");
		jf.setResizable(false);
		jf.setDefaultCloseOperation(3);
		jf.setLocationRelativeTo(null);
		jf.setSize(400, 450);
		
		jp = new JPanel();
		
		jp.setPreferredSize(new Dimension(400,400));
		jp.setBackground(Color.BLACK);
		jf.add(jp,BorderLayout.CENTER);
		
		JPanel jp1 = new JPanel();
		jp1.setPreferredSize(new Dimension(400,40));
		
		JButton jb1 = new JButton("Add");
		jb1.setPreferredSize(new Dimension(80,30));
		
		ActionListener al = new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				String jb1 = e.getActionCommand();
				if(jb1.equals("Add")){
					count++;
					Ball ball = new Ball(jp,ball_1,count);
					ball_1[ball.getcount()-1]=ball;
					ball.start();
					
				}
			}
			
		};
		jb1.addActionListener(al);
		
		jp1.add(jb1);
		jf.add(jp1,BorderLayout.SOUTH);
		
		jf.setVisible(true);
	}
	
	 JPanel jp;
	 Ball[] ball_1 =new Ball[10];
	 private int count=0;

}
分享到:
评论

相关推荐

    多线程之小球碰撞

    标题“多线程之小球碰撞”涉及到的是计算机编程中的多线程技术,结合描述中的博文链接,我们可以推测这篇文章可能是通过一个模拟小球碰撞的示例来讲解多线程编程的概念和实践。在这个场景中,每个小球可以代表一个...

    C++小球碰撞C++ 小球碰撞

    根据提供的信息,我们可以总结出以下有关“C++小球碰撞”的相关知识点: ### C++小球碰撞概述 在计算机编程领域,“C++小球碰撞”通常指的是使用C++语言实现的小球之间的碰撞检测与响应机制。此类程序常用于游戏...

    JAVA多线程实验,字符移动、小球碰撞

    这个实验可能涉及到更复杂的同步问题,因为当多个小球在同一区域运动时,可能会发生碰撞。为解决这个问题,我们需要使用到Java的线程同步机制,如synchronized关键字、wait()和notify()方法。我们可以定义一个Ball类...

    VC++模拟小球碰撞

    在本文中,我们将深入探讨如何使用VC++6.0中的MFC(Microsoft Foundation Classes)库来模拟小球碰撞的过程。MFC是微软提供的一套C++类库,它简化了Windows应用程序的开发,特别是图形用户界面(GUI)的构建。 首先...

    小球碰撞课程设计小球碰撞

    小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 小球碰撞 课程设计 ...

    基于c++MFC实现的小球碰撞

    标题“基于C++ MFC实现的小球碰撞”指的是一个使用Microsoft Foundation Classes (MFC)库在C++编程环境中开发的程序,该程序模拟了小球之间的碰撞动态。MFC是微软提供的一套C++类库,它使得开发者可以更方便地创建...

    C语言实现的小球碰撞程序

    你可以在此基础上进行扩展,如添加多球碰撞处理、考虑不完全弹性碰撞、添加重力或摩擦力等因素,以使模拟更加真实。 总结,实现小球碰撞的C语言程序涉及对物理学的理解、结构体的使用、碰撞检测和碰撞后速度计算。...

    小球碰撞-炫彩版

    在这个项目中,多线程用于实现小球的独立运动,每个小球都有自己的线程,这样可以保证它们在屏幕上的运动不互相干涉,提高程序的响应性和实时性。 2. **小球摇摆**:小球的摇摆是通过数学模型来模拟的,可能涉及到...

    多个小球的碰撞

    这通常通过添加事件监听器来实现,每次触发事件时,计算小球的新位置并检查是否有碰撞发生。 5. **碰撞检测**:检测两个小球是否相撞是一个重要的算法。可以使用几何方法(如圆与圆的交点),或者使用更高级的碰撞...

    JAVA运用多线程实现碰撞的小球

    通过JAVA运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。

    matlab模拟各种情形下小球碰撞的动态图.zip

    这种情况下的编程会更为复杂,因为需要考虑多个小球之间的相互作用。每个小球都有其自身的速度和位置,碰撞时需要同时满足动量守恒和能量守恒。在MATLAB中,我们可能需要构建一个系统动力学模型,其中包含所有小球的...

    小球碰撞碰撞代码

    ### 小球碰撞中的动量与能量守恒 #### 概述 本文旨在探讨小球碰撞过程中能量交换的原理及其实现方式,并通过具体的代码示例来解释这一过程。小球碰撞是物理学中的一个基本问题,它涉及到动量守恒定律和能量守恒...

    小球碰撞小球移动

    在物理学中,小球碰撞是一个常见的力学问题,涉及到动量守恒、能量守恒以及碰撞的类型等基础知识。在这个特定的场景中,我们有两个小球,一个是从上方垂直下落,另一个则是静止在下方。当这两个小球发生碰撞时,它们...

    小球碰撞反弹经典算法

    - **多小球碰撞处理**:引入多小球之间的碰撞检测,增加游戏的复杂性和趣味性。 - **弹性系数调整**:模拟真实的物理特性,引入弹性系数调整小球碰撞后的速度变化。 - **边界形状多样化**:不限于矩形边界,支持曲线...

    计算机图形学小球碰撞程序

    计算机图形学小球碰撞程序 本文将对计算机图形学小球碰撞程序进行详细的解释和分析,从而生成相关的知识点。 计算机图形学基础 计算机图形学是计算机科学的一个分支,它结合了计算机科学、数学和艺术,旨在研究...

    小球碰撞vc演示程序

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来开发一个基于对话框的Windows应用程序,以实现小球碰撞的演示实验。MFC是微软为C++开发者提供的一个强大的框架,它简化了Windows API的使用...

    js html5 canvas制作多个小球碰撞的动画效果

    本教程将详细讲解如何利用JavaScript和HTML5的Canvas API来制作一个包含多个小球碰撞的动画效果。 首先,我们需要在HTML文件中创建一个`&lt;canvas&gt;`元素,它是画布的基础,用于渲染图形。例如: ```html &lt;!DOCTYPE ...

    小球碰撞反弹模拟

    2. **碰撞检测**:确定两个小球是否发生碰撞,常用的方法有距离检测、包围盒检测等。 3. **反弹角度**:根据碰撞角度和系数计算反弹后的速度向量,通常用入射角等于反射角的规则。 4. **坐标系统和运动模拟**:在二...

    Java实现小球碰撞检测

    在二维空间中,两个小球发生碰撞,可以简化为两个点的碰撞,因为小球在碰撞瞬间可以视为质心。当两个小球的中心距离小于它们半径之和时,我们认为发生了碰撞。 1. **向量基础**:在Java中,我们可以使用`java.awt....

    MATLAB建模仿真案例:30 多个小球碰撞模拟.zip

    在本MATLAB建模仿真案例“30多个小球碰撞模拟”中,我们将深入探讨如何利用MATLAB强大的计算和可视化功能来模拟复杂物理现象。这个案例涵盖了基础的物理学原理、编程技巧以及MATLAB的Simulink环境应用。下面将详细...

Global site tag (gtag.js) - Google Analytics