小球碰撞的關(guān)鍵是 判斷小球是否碰撞過:
1.當(dāng)兩小球間距小于小球直徑時(shí)發(fā)生碰撞炭臭。
2.當(dāng)小球碰到邊緣時(shí)發(fā)生碰撞掂榔。
import static org.junit.Assert.*;
import javax.swing.*
import org.junit.Test;
import java.awt.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Draw {
static int length; //小球數(shù)量
static int[][] BallList; //小球?qū)傩詳?shù)組 0,1為x箩帚,y 3嫌套,4為X,Y的標(biāo)識(shí)符
public static void main(String[] args){
Draw draw=new Draw();
System.out.println("輸入小球個(gè)數(shù)");
Scanner sc=new Scanner(System.in);
length=sc.nextInt();
BallList=new int[length][5];
draw.addBall(length);
JFrame frame=new JFrame();
frame.setSize(1024, 768);
frame.getContentPane().setBackground(Color.white);
Draw.Ball w=new Draw.Ball();
frame.add(w);
Thread t=new Thread(w);
t.start();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void addBall(int length1){ //隨機(jī)位置生成小球
for(int i=0;i<length1;i++){
BallList[i][0]=(int)(Math.random()*800+100);
BallList[i][1]=(int)(Math.random()*500+200);
BallList[i][3]=1;
BallList[i][4]=1;
}
}
public static class Ball extends Panel implements Runnable{
int a,b,c; //管理顏色的變量
ArrayList<Color> colo=new ArrayList<Color>(length); //管理顏色的數(shù)組
int[][] juge=new int[length][2]; //判斷每個(gè)小球是否碰撞
public Ball(){ //給判斷變量和顏色變量賦初值
for(int i=0;i<length;i++){
juge[i][0]=1;
juge[i][1]=1;
a=(int)(Math.random()*100);
b=(int)(Math.random()*100);
c=(int)(Math.random()*100);
colo.add(i, new Color(a,b,c)); //給每個(gè)小球上初色
}
}
public void paint(Graphics g){
for(int i=0;i<length;i++){
if(BallList[i][3]!=juge[i][0]||BallList[i][4]!=juge[i][1]) //當(dāng)小球碰撞后改變顏色
{
a=(int)(Math.random()*100);
b=(int)(Math.random()*100);
c=(int)(Math.random()*100);
colo.set(i, new Color(a,b,c));
}
juge[i][0]=BallList[i][3]; //改變顏色后將判斷變量的值設(shè)為小球的標(biāo)識(shí)符
juge[i][1]=BallList[i][4];
g.setColor(colo.get(i));
//g.setFont(new Font("",0,30));
g.fillOval(BallList[i][0], BallList[i][1], 20, 20);
}
}
public void run()
{
while(true)
{
for(int i=0;i<length;i++){ //判斷小球行駛軌跡 標(biāo)識(shí)符為1時(shí)向右(向上)行駛
if(BallList[i][3]==1&&BallList[i][4]==1){
BallList[i][0]++;BallList[i][1]++;
if(BallList[i][0]>1000) BallList[i][3]=0; //當(dāng)小球撞墻時(shí)標(biāo)識(shí)符變化
if(BallList[i][1]>720) BallList[i][4]=0;
try{
Thread.sleep(1);
}catch(Exception ex){}
repaint();
}
else if(BallList[i][3]!=1&&BallList[i][4]==1)
{
BallList[i][0]--;BallList[i][1]++;
if(BallList[i][0]<10) BallList[i][3]=1;
if(BallList[i][1]>720) BallList[i][4]=0;
try{
Thread.sleep(1);
}catch(Exception ex){}
repaint();
}
else if(BallList[i][3]==1&&BallList[i][4]!=1){
BallList[i][0]++;
BallList[i][1]--;
if(BallList[i][0]>1000) BallList[i][3]=0;
if(BallList[i][1]<10) BallList[i][4]=1;
try{
Thread.sleep(1);
}catch(Exception ex){}
repaint();
}
else{
BallList[i][0]--;
BallList[i][1]--;
if(BallList[i][0]<10) BallList[i][3]=1;
if(BallList[i][1]<10) BallList[i][4]=1;
try{
Thread.sleep(1);
}catch(Exception ex){}
repaint();
}
for(int p=0;p<length;p++){ //小球兩兩判斷是否相撞
for(int q=p+1;q<length;q++){
if(Math.abs(BallList[p][0]-BallList[q][0])<=20&&Math.abs(BallList[p][1]-BallList[q][1])<=20){ //當(dāng)兩小球球心間距小于等于20時(shí)判定相撞
//相撞后改變標(biāo)識(shí)符
if(BallList[p][3]==1) BallList[p][3]=0;
else BallList[p][3]=1;
if(BallList[p][4]==1) BallList[p][4]=0;
else BallList[p][4]=1;
if(BallList[q][3]==1) BallList[q][3]=0;
else BallList[q][3]=1;
if(BallList[q][4]==1) BallList[q][4]=0;
else BallList[q][4]=1;
try{
Thread.sleep(1);
}catch(Exception ex){}
repaint();
}
}
}
}
}
}
}
}