Java 小球碰撞

小球碰撞的關(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();
                }
                }
                }
        
                }
                
                }
        }
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛆挫,一起剝皮案震驚了整個(gè)濱河市琉朽,隨后出現(xiàn)的幾起案子淤袜,更是在濱河造成了極大的恐慌痒谴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铡羡,死亡現(xiàn)場(chǎng)離奇詭異积蔚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烦周,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門尽爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人读慎,你說我怎么就攤上這事漱贱。” “怎么了夭委?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵幅狮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我株灸,道長(zhǎng)崇摄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任慌烧,我火速辦了婚禮逐抑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屹蚊。我一直安慰自己厕氨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布淑翼。 她就那樣靜靜地躺著腐巢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄括。 梳的紋絲不亂的頭發(fā)上冯丙,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼胃惜。 笑死泞莉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的船殉。 我是一名探鬼主播鲫趁,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼利虫!你這毒婦竟也來了挨厚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤糠惫,失蹤者是張志新(化名)和其女友劉穎疫剃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼讽,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巢价,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了固阁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤躲。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖备燃,靈堂內(nèi)的尸體忽然破棺而出碉克,到底是詐尸還是另有隱情,我是刑警寧澤赚爵,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布棉胀,位于F島的核電站法瑟,受9級(jí)特大地震影響冀膝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霎挟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一窝剖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酥夭,春花似錦赐纱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讶隐,卻和暖如春起胰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巫延。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工效五, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留地消,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓畏妖,卻偏偏與公主長(zhǎng)得像脉执,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒劫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容