2019-12-07 線程气堕,大球吃小球

線程

線程的概念

像以往我們做一個(gè)圖板或者做一個(gè)自動(dòng)運(yùn)行的程序時(shí)在一個(gè)方法進(jìn)行執(zhí)行時(shí)流纹,程序未執(zhí)行完成時(shí)是無法關(guān)閉以及進(jìn)行其他操作的薄霜,但是在繼承線程Thread后就可以實(shí)現(xiàn)在線程程序運(yùn)行時(shí)執(zhí)行其他操作。

線程的基本語法

首先將于要執(zhí)行線程的類繼承Thread

public class A extends Thread{
}

之后再重寫Thread中的run方法

public void run(){
      while(true){
          this.move();
      }
    }

最后在mian函數(shù)中創(chuàng)建A對(duì)象惰瓜,并調(diào)用A的start方法否副,注意這里不是通過調(diào)用run方法啟動(dòng),而是調(diào)用start方法啟動(dòng)崎坊。

    public static void main(String args[]){
    A a =new A();
    a.start();
    }

運(yùn)行程序后可以發(fā)現(xiàn)move方法在不斷被執(zhí)行但是與此同時(shí)我們可以進(jìn)行關(guān)閉等其他操作备禀。

大球吃小球

整體思路

這個(gè)游戲模仿大魚吃小魚的小游戲奈揍,通過創(chuàng)建不同大小的小球進(jìn)行吃與被吃的過程曲尸,玩家控制一個(gè)小球擁有可升級(jí)的選項(xiàng)男翰,其他小球擁有真?zhèn)蓽y(cè)其身邊小球的功能另患,當(dāng)其他小球比當(dāng)前小球級(jí)別高時(shí)反向逃離該小球,反之向該小球移動(dòng)蛾绎。

代碼實(shí)現(xiàn)

首先創(chuàng)建畫板對(duì)象昆箕,也是該游戲的主場(chǎng)景,設(shè)置背景為綠色租冠,創(chuàng)建鍵盤監(jiān)聽器控制玩家小球鹏倘,并監(jiān)聽畫布肺稀。

public class UI extends JFrame{
    public static void main(String args[]){
        UI ui = new UI();
        ui.startUI();
    }
    public void startUI(){
        this.setTitle("zoo");// 標(biāo)題
        this.setSize(1200,700);// 窗口大小
        this.setResizable(false);// 窗口是否可動(dòng)
        this.setDefaultCloseOperation(3);// 關(guān)閉時(shí)退出程序
        setLocationRelativeTo(null);//居中
        this.setVisible(true);
        Graphics g = this.getGraphics();
        Listener l =new Listener(g);
        this.addKeyListener(l);
    }
    public void paint(Graphics g){
        super.paint(g);
        g.setColor(Color.green);
        g.fillRect(0, 0, 1200, 750);
        System.out.println(1);
    }
}

創(chuàng)建小球類繼承Thread(但小球類不會(huì)用到,用于之后玩家類重寫run方法)话原,創(chuàng)建用于儲(chǔ)存小球?qū)ο蟮腁rrayList,并為小球設(shè)置等級(jí)0-4級(jí)繁仁,根據(jù)等級(jí)設(shè)定顏色大小以及速度,然后創(chuàng)建move方法設(shè)置小球的移動(dòng)規(guī)律黄虱,例如觸碰到邊界稚矿,遭遇其他小球進(jìn)行判斷能否被吃。再創(chuàng)建偵測(cè)的方法判斷偵測(cè)范圍內(nèi)小球的等級(jí)以及方位進(jìn)行移動(dòng)捻浦。

public class Animal extends Thread{
    int id,speed,x,y,sx,sy,size;
    ArrayList<Animal> list;
    Graphics g;
    Random m = new Random();
    public Animal(int x,int y,int id,Graphics g,ArrayList<Animal> list){
        this.x=x;
        this.y= y;
        if(id<5){
        this.id =id;
        }else{
            this.id=4;
        }
        this.g =g;
        this.speed = 10 - 2*id;
        this.size = 20+10*id;
        this.list =list;
        sx = m.nextInt(speed+1);
        sy = m.nextInt(speed+1);
    }
    public void move(){
        int l,x1,y1,s;
        if (x < 0) {
            sx = m.nextInt(speed+1);
            sy =speed-sx;
        } else if (x > 1200) {
            sx = -m.nextInt(speed+1);
            sy = speed+sx;
        } else if (y < 0) {
            sy = m.nextInt(speed+1);
            sx = speed -sy;
        } else if (y > 650) {
            sy = -m.nextInt(speed+1);   
            sx = speed +sy;
        }
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i)!=null){
                x1 = list.get(i).x ;
                y1 = list.get(i).y ;
                l = (x1 - x) * (x1 - x ) + (y1 - y) * (y1 - y);
                s =(list.get(i).size/2+size/2)*(list.get(i).size/2+size/2);
                if(l < s&&x!=list.get(i).x){
                    if(id>list.get(i).id){
                        g.setColor(Color.green);
                        g.fillOval(list.get(i).x-list.get(i).size/2, list.get(i).y-list.get(i).size/2, list.get(i).size,list.get(i).size);
                        list.set(i, null);        
                    }else if(id==list.get(i).id){
                        sx=-sx;
                        sy=-sy;
                    }       
                }   
            }
        }
                g.setColor(Color.green);
        g.fillOval(x-size/2, y-size/2, size, size);
        x += sx;
        y += sy;
        this.darw();
    }
    public void darw(){
        Color c = null;
        if(this.id==0){
            c=Color.white;
        }else if(this.id ==1){
            c=Color.ORANGE; 
        }else if(this.id == 2){
            c=Color.gray;
        }else if(this.id == 3){
            c=Color.yellow;
        }else if(this.id == 4){
            c=Color.black;
        }
        g.setColor(c);
        g.fillOval(x-size/2, y-size/2, size, size);
    }
    public void Existence(){
        int l,x1,y1;
        for(int i=0;i<list.size();i++){
            if(list.get(i)!=null){
                x1=list.get(i).x;
                y1= list.get(i).y;
                l=(y-y1)*(y-y1)+(x-x1)*(x-x1);
                if(l < 10000){
                    if(id > list.get(i).id){
                          this.a(list.get(i));
                    }else if(id < list.get(i).id){
                        this.b(list.get(i));
                    }   
                }
            }
        }
    }
public void run() {
        while (true) {
            try {
                Thread.sleep(80);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            for(int i=1;i<list.size();i++){
                if(list.get(i)!=null){
            list.get(i).Existence();
            list.get(i).move();
                }   
            }
        }
    }
public void a(Animal n){
    int x1=n.x;
    int y1= n.y;
    if(x-x1>=0&&y-y1>=0){
        if(x-x1>=y-y1){
            sx =-speed;
            sy = -((y-y1)/(x-x1))*speed;
        }else{
            sy =-speed;
            sx = -((x-x1)/(y-y1))*speed;
        }
    }else if(x-x1<=0&&y-y1>=0){
        if(x1-x>=y-y1){
            sx = speed;
            sy = -((y-y1)/(x-x1))*speed;
        }else{
            sy =speed;
            sx = -((x-x1)/(y-y1))*speed;
        }
    }else if(x-x1>=0&&y-y1<=0){
        if(x-x1>=y1-y){
            sx = -speed;
            sy = ((y-y1)/(x-x1))*speed;
        }else{
            sy =-speed;
            sx = ((x-x1)/(y-y1))*speed;
        }
    }else if(x-x1<=0&&y-y1<=0){
        if(x1-x>=y-y1){
            sx = speed;
            sy = ((y-y1)/(x-x1))*speed;
            
        }else{
            sy =speed;
            sx = ((x-x1)/(y-y1))*speed; 
        }
    }
}
public void b(Animal n){
    int x1=n.x;
    int y1= n.y;
    if(x-x1>=0&&y-y1>=0){
        if(x-x1>=y-y1){
            sx =speed;
            sy = ((y-y1)/(x-x1))*speed;
        }else{
            sy =speed;
            sx =((x-x1)/(y-y1))*speed;
        }
    }else if(x-x1<=0&&y-y1>=0){
        if(x1-x>=y-y1){
            sx = -speed;
            sy = ((y-y1)/(x-x1))*speed; 
        }else{
            sy =-speed;
            sx = ((x-x1)/(y-y1))*speed;
        }       
    }else if(x-x1>=0&&y-y1<=0){
        if(x-x1>=y1-y){
            sx = speed;
            sy = -((y-y1)/(x-x1))*speed;
        }else{
            sy =speed;
            sx = -((x-x1)/(y-y1))*speed;        
        }       
    }else if(x-x1<=0&&y-y1<=0){
        if(x1-x>=y-y1){
            sx = -speed;
            sy = -((y-y1)/(x-x1))*speed;
        }else{
            sy =-speed;
            sx = -((x-x1)/(y-y1))*speed;
        }   
    }
}
}

然后創(chuàng)建玩家小球繼承小球類朱灿,重寫屬性,重寫玩家自己的move方法盗扒,定義移動(dòng)方式缀去,以及升級(jí)的經(jīng)驗(yàn)條,以及玩家的等級(jí)(可大于小球的最高的等級(jí))缕碎,最后重寫run方法,讓小球數(shù)量等級(jí)根據(jù)玩家等級(jí)變化咏雌,且實(shí)現(xiàn)list中所有小球的移動(dòng)。

public class Player extends Animal {
    int exp = 0;
    public Player(int x, int y, int id, Graphics g, ArrayList<Animal> list) {
        super(x, y, id, g, list);
        // TODO Auto-generated constructor stub
        if(id<6){
            this.id = id;
        }else{
            this.id = 5;
        }
        sx = 0;
        sy = 0;
    }
    public void move(){
       int x1,y1,l,s;   
        if (x < 0&&sx<0) {
         sx =0;
        } else if (x > 1200&&sx>0) {
            sx=0;
        } else if (y < 0&&sy<0) {
            sy=0;
        } else if (y > 650&&sy>0) {
           sy=0;
        }
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i)!=null){
                x1 = list.get(i).x ;
                y1 = list.get(i).y ;
                l = (x1 - x) * (x1 - x ) + (y1 - y) * (y1 - y);
                s =(list.get(i).size/2+size/2)*(list.get(i).size/2+size/2);
                if(l < s&&x!=list.get(i).x){
                    if(id>list.get(i).id){
                        g.setColor(Color.green);
                        g.fillOval(list.get(i).x-list.get(i).size/2, list.get(i).y-list.get(i).size/2, list.get(i).size,list.get(i).size);
                        list.set(i, null);
                        size++;
                        this.up();
                    }
                }
                    }
                }
        g.setColor(Color.green);
        g.fillOval(x-size/2, y-size/2, size, size);
        x += sx;
        y += sy;
        this.darw();    
    }
    public void darw(){
        Color c = null;
        if(this.id==0){
            c=Color.white;
        }else if(this.id ==1){
            c=Color.ORANGE;
        }else if(this.id == 2){
            c=Color.gray;
        }else if(this.id == 3){
            c=Color.yellow;
        }else if(this.id == 4){
            c=Color.black;
        }else if(this.id ==5){
            c=Color.red;
        }
        g.setColor(Color.red);
        g.fillOval(x-size/2, y-size/2, size, size);
        g.setColor(c);
        g.fillOval(x-size/2+1, y-size/2+1, size-2, size-2);
    }
    public void up() {
        exp++;
        if (exp == 10) {
            id++;
            exp = 0;
        }
        g.setColor(Color.white);
        g.fillRect(0, 680, 1200, 20);
        g.setColor(Color.blue);
        g.fillRect(0, 680, 120*this.exp, 20);
    }
    public void run() {
        while (true) {
            System.out.println(exp);
            int m = 0;
            if(id>3){
                m=3;
            }
            int n = 0;
            try {
                Thread.sleep(80);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            for (int i = 0; i < list.size(); i++) {
                
                if (list.get(i) != null) {
                    if (list.get(i).id > id) {
                        m++;
                    } else if (list.get(i).id < id) {
                        n++;
                    }
                }
            }
            if (m < 3) {
                Animal a = new Animal(ran(1200), ran(700), id + 1, g, list);
                list.add(a);
            }
            if (n < 10) {
                Animal b = new Animal(ran(1200), ran(700), id - 1, g, list);
                list.add(b);
            }
            for (int i = 1; i < list.size(); i++) {
                if (list.get(i) != null) {
                    list.get(i).Existence();
                    list.get(i).move();
                }
            }
        }
    }
    public int ran(int o) {
        Random r = new Random();
        return r.nextInt(o + 1);
    }
}

最后創(chuàng)建鍵盤監(jiān)聽器的類,并加入移動(dòng)指令以及啟動(dòng)一次玩家對(duì)象的start方法

public class Listener implements KeyListener {
    Graphics g;
    ArrayList<Animal> list = new ArrayList<Animal>();
    int x=0;
    Player p;
    int time = 0;
    public Listener(Graphics g) {
        this.g = g;
         p= new Player(600,350,1,g,list);
          list.add(p);
    }
    public void keyTyped(KeyEvent e) {}
    public void keyPressed(KeyEvent e) {
       int key= e.getKeyCode();
       if(key == e.VK_UP){
           p.sy = -p.speed;
           p.sx = 0;
           p.move();
       }else if(key == e.VK_DOWN){
           p.sy = p.speed;
           p.sx = 0;
           p.move();
       }else if(key ==e.VK_LEFT){
           p.sx = -p.speed;
           p.sy = 0;
           p.move();
       }else if(key ==e.VK_RIGHT){
           p.sx = p.speed;
           p.sy = 0;
           p.move();
       }
       if(time==0){
           time++;
           p.start();
       }
    }
    @Override
    public void keyReleased(KeyEvent e) {   }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市檐薯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坛缕,老刑警劉巖墓猎,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異毙沾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)左胞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烤宙,“玉大人,你說我怎么就攤上這事俭嘁。” “怎么了供填?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)近她。 經(jīng)常有香客問我,道長(zhǎng)泄私,這世上最難降的妖魔是什么备闲? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任捅暴,我火速辦了婚禮恬砂,結(jié)果婚禮上蓬痒,老公的妹妹穿的比我還像新娘泻骤。我一直安慰自己梧奢,他們只是感情好狱掂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布亲轨。 她就那樣靜靜地躺著,像睡著了一般惦蚊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹦锋,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音莉掂,去河邊找鬼葛圃。 笑死憎妙,一個(gè)胖子當(dāng)著我的面吹牛库正,可吹牛的內(nèi)容都是我干的尚氛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阅嘶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了讯柔?” 一聲冷哼從身側(cè)響起抡蛙,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤魂迄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捣炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绽榛,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年灭美,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片届腐。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犁苏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扩所,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布碌奉,位于F島的核電站,受9級(jí)特大地震影響赐劣,放射性物質(zhì)發(fā)生泄漏哩都。R本人自食惡果不足惜魁兼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一漠嵌、第九天 我趴在偏房一處隱蔽的房頂上張望咐汞。 院中可真熱鬧儒鹿,春花似錦化撕、人聲如沸约炎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掠手。三九已至狸捕,卻和暖如春喷鸽,著一層夾襖步出監(jiān)牢的瞬間灸拍,已是汗流浹背做祝。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留混槐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓纵隔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親捌刮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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