用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

飞机大战小游戏

2018-03-04 作者: 勿语举报

[java]代码库

package com.test.shoot;
 
import java.util.Random;
 
public class Airplane extends Flyer {
    private int speed=2;
    private int score=5;
    public int getScore() {
        return score;
    }
     
    public Airplane() {
        image=ShootGame.airplane;
        width=image.getWidth();
        height=image.getHeight();
        y=-height;
        Random r=new Random();
        x=r.nextInt(ShootGame.WIDTH-width);
    }
    @Override
    public void step() {
        // TODO Auto-generated method stub
        y+=speed;
    }
    @Override
    public boolean outOfBounds() {
        // TODO Auto-generated method stub
        return y>ShootGame.HEIGHT;
    }
}
package com.test.shoot;
 
import java.util.Random;
 
public class Bee extends Flyer{
    public static final int DOUBLE_FIRE=0;
    public static final int LIFE=1;
    private int xspeed=1;
    private int yspeed=2;
    private int awardType;
    public int getAwardType() {
        return awardType;
    }
     
    public Bee() {
        image=ShootGame.bee;
        width=image.getWidth();
        height=image.getHeight();
        y=-height;
        Random r=new Random();
        x=r.nextInt(ShootGame.WIDTH-width);
        awardType=r.nextInt(2);    
    }
     
    @Override
    public void step() {
        x+=xspeed;
        y+=yspeed;
        if(x<0||x>(ShootGame.WIDTH-width)) {
            xspeed*=-1;
        }
    }
    @Override
    public boolean outOfBounds() {
        return y>ShootGame.HEIGHT;
    }
}
package com.test.shoot;
 
public class Bullet extends Flyer {
    private int speed=5;
     
    public Bullet(int x,int y) {
        image=ShootGame.bullet;
        width=image.getWidth();
        height=image.getHeight();
        this.x=x;
        this.y=y;
    }
 
    @Override
    public void step() {
        y-=speed;
    }
 
    @Override
    public boolean outOfBounds() {
        return y+height<0;
    }
}
package com.test.shoot;
 
import java.awt.image.BufferedImage;
 
public abstract class Flyer {
    protected int x;
    protected int y;
    protected int width;
    protected int height;
    protected BufferedImage image;
     
    public abstract void step();
     
    public abstract boolean outOfBounds();
     
    public static boolean bang(Flyer f1,Flyer f2) {
        //求中心点
        int f1x=f1.x+f1.width/2;
        int f1y=f1.y+f1.height/2;
        int f2x=f2.x+f2.width/2;
        int f2y=f2.y+f2.height/2;
        //检测碰撞
        boolean H=Math.abs(f1x-f2x)<((f1.width+f2.width)/2);
        boolean V=Math.abs(f1y-f2y)<((f1.height+f2.height)/2);
        return H&V;
    }
}
package com.test.shoot;
 
import java.util.Random;
 
public class Hero extends Flyer {
    private int doubleFire;
    private int life;
    private int score;
    public int getLift() {
        return life;
    }
    public int getScore() {
        return score;
    }
     
    public Hero() {
        image=ShootGame.hero0;
        width=image.getWidth();
        height=image.getHeight();
        x=150;
        y=450;
        doubleFire=0;
        life=3;
        score=0;
    }
     
    @Override
    public void step() {
        Random r=new Random();
        if(r.nextInt(2)==0) {
            image=ShootGame.hero0;
        }else {
            image=ShootGame.hero1;
        }
    }
    @Override
    public boolean outOfBounds() {
        return false;
    }
     
    public void move(int x,int y) {
        this.x=x-width/2;
        this.y=y-height/2;
    }
     
    public void getScore_Award(Flyer f) {
        if(f instanceof Airplane) {
            score+=((Airplane)f).getScore();
        }else {
            if(((Bee)f).getAwardType()==Bee.DOUBLE_FIRE) {
                doubleFire+=100;
            }else {
                life+=1;
            }
        }
    }
     
    public Bullet[] shoot() {
        Bullet[] bullets=null;
        if(doubleFire!=0) {
            bullets=new Bullet[2];
            Bullet b1=new Bullet(x+width/4,y-ShootGame.bullet.getHeight());
            Bullet b2=new Bullet(x+width*3/4,y-ShootGame.bullet.getHeight());
            bullets[0]=b1;
            bullets[1]=b2;
            doubleFire-=2;
        }else {//单倍火力
            bullets=new Bullet[1];
            bullets[0]=new Bullet(x+width/2,y-ShootGame.bullet.getHeight());
        }
        return bullets;
    }
     
    public boolean hit(Flyer f) {
        boolean r=Flyer.bang(this, f);
        if(r) {
            life--;
            doubleFire=0;
        }
        return r;
    }
}
package com.test.shoot;
 
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class ShootGame extends JPanel {
    public static final int WIDTH=400;
    public static final int HEIGHT=700;
     
    public static BufferedImage background;
    public static BufferedImage start;
    public static BufferedImage airplane;
    public static BufferedImage bee;
    public static BufferedImage bullet;
    public static BufferedImage hero0;
    public static BufferedImage hero1;
    public static BufferedImage pause;
    public static BufferedImage gameover;
     
    public Hero hero=new Hero();
    public Flyer[] flyers= {};
    public Bullet[] bullets= {};
     
    private int state=START;
    public static final int START=0;
    public static final int RUNNING=1;
    public static final int PAUSE=2;
    public static final int GAME_OVER=3;
     
    static {
        try {
            background=ImageIO.read(ShootGame.class.getResource("background.png"));
            airplane=ImageIO.read(ShootGame.class.getResource("airplane.png"));
            bee=ImageIO.read(ShootGame.class.getResource("bee.png"));
            bullet=ImageIO.read(ShootGame.class.getResource("bullet.png"));
            hero0=ImageIO.read(ShootGame.class.getResource("hero0.png"));
            hero1=ImageIO.read(ShootGame.class.getResource("hero1.png"));
            pause=ImageIO.read(ShootGame.class.getResource("pause.png"));
            gameover=ImageIO.read(ShootGame.class.getResource("gameover.png"));
            start=ImageIO.read(ShootGame.class.getResource("start.png"));
             
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
     
    public static void main(String[] args) {
        JFrame frame=new JFrame("Fly");
        frame.setSize(WIDTH, HEIGHT);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        ShootGame game=new ShootGame();
        frame.add(game);
        frame.setVisible(true);
        game.action();
    }
    public void action() {
        /*游戏开始时,鼠标事件的监听*/
        MouseAdapter l=new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                if(state==RUNNING) {
                    int x=e.getX();
                    int y=e.getY();
                    hero.move(x, y);
                }
            }
 
            @Override
            public void mouseClicked(MouseEvent e) {
                if(state==START) {
                    state=RUNNING;
                    }else if(state==GAME_OVER) {
                        state=START;
                        flyers=new Flyer[0];
                        bullets=new Bullet[0];
                        hero=new Hero();
                    }
            }
 
            @Override
            public void mouseExited(MouseEvent e) {
                if(state==RUNNING) {
                    state=PAUSE;
                    }
            }
 
            @Override
            public void mouseEntered(MouseEvent e) {
                if(state==PAUSE) {
                    state=RUNNING;
                    }
            }
             
             
        };
        this.addMouseMotionListener(l);
        this.addMouseListener(l);
        Timer timer=new Timer();
        timer.schedule(new TimerTask() {
            private int runTimes=0;
            @Override
            public void run() {
                if(state==RUNNING) {
                    runTimes++;
                    if(runTimes%40==0) {
                        nextOne();
                    }
                    for(int i=0;i<flyers.length;i++) {
                        flyers[i].step();
                    }
                    if(runTimes%15==0) {
                        shoot();
                    }
                    for(int i=0;i<bullets.length;i++) {
                        bullets[i].step();
                    }
                    hero.step();
                    bang();
                    hit();
                    outOfBounds();
                }
                repaint();
            }
             
        }, 5,5);
    }
 
    @Override
    public void paint(Graphics g) {
         
        g.drawImage(background,0,0,null);//super.paint(arg0);
         
        paintHero(g);
         
        paintFlyers(g);
         
        paintBullets(g);
         
        paintScore_Life(g);
         
        if(state==START) {
            g.drawImage(start, 0, 0, null);
        }else if(state==PAUSE){
            g.drawImage(pause, 0, 0, null);
        }else if(state==GAME_OVER) {
            g.drawImage(gameover, 0, 0, null);
        }
    }
    public void paintHero(Graphics g) {
        g.drawImage(hero.image,hero.x,hero.y,null);
    }
    public void paintFlyers(Graphics g) {
        for(int i=0;i<flyers.length;i++) {
            g.drawImage(flyers[i].image,flyers[i].x,flyers[i].y,null);
        }
    }
    public void paintBullets(Graphics g) {
        for(int i=0;i<bullets.length;i++) {
            g.drawImage(bullets[i].image, bullets[i].x, bullets[i].y, null);
        }
    }
     
    /**
     * 随机生成1个敌人
     * 每生成一个新敌人,flyers数组都要扩容1
     * 然后将新敌人放入数组最后一个元素
     */
    public void nextOne() {
        Random r=new Random();
        Flyer f=null;
        if(r.nextInt(20)==0) {//只有随机数取0时,才创建蜜蜂
            f=new Bee();
        }else {//其余都是敌机
            f=new Airplane();
        }
        flyers=Arrays.copyOf(flyers, flyers.length+1);
        flyers[flyers.length-1]=f;
    }
     
    public void shoot() {
        Bullet[]newBullets=hero.shoot();
        bullets=Arrays.copyOf(bullets, bullets.length+newBullets.length);
        System.arraycopy(newBullets, 0, bullets, bullets.length-newBullets.length, newBullets.length);
    }
     
    public void bang() {
        for(int i=0;i<bullets.length;i++) {
            for(int j=0;j<flyers.length;j++) {
                if(Flyer.bang(bullets[i], flyers[j])) {
                    hero.getScore_Award(flyers[j]);
                    flyers[j]=flyers[flyers.length-1];
                    flyers=Arrays.copyOf(flyers, flyers.length-1);
                    bullets[i]=bullets[bullets.length-1];
                    bullets=Arrays.copyOf(bullets, bullets.length-1);
                    i--;
                    break;
                }
            }
        }
    }
    public void paintScore_Life(Graphics g) {
        int x=10;
        int y=15;
        Font font=new Font(Font.SANS_SERIF,Font.BOLD,14);
        g.setFont(font);
        g.drawString("分数:"+hero.getScore(), x, y);
        y+=20;
        g.drawString("生命:"+hero.getLift(), x, y);
    }
     
    public void outOfBounds() {
        Flyer[] Flives=new Flyer[flyers.length];
        int index=0;
        for(int i=0;i<flyers.length;i++) {
            if(!flyers[i].outOfBounds()) {
                Flives[index]=flyers[i];
                index++;
            }
        }
        flyers=Arrays.copyOf(Flives, index);
         
        Bullet[] Blives=new Bullet[bullets.length];
        index=0;
        for(int i=0;i<bullets.length;i++) {
            if(!bullets[i].outOfBounds()) {
                Blives[index]=bullets[i];
                index++;
            }
        }
        bullets=Arrays.copyOf(Blives, index);
    }
    public void hit() {
        Flyer[] lives=new Flyer[flyers.length];
        int index=0;
        for(int i=0;i<flyers.length;i++) {
            if(!hero.hit(flyers[i])) {
                lives[index]=flyers[i];
                index++;
            }
        }
        if(hero.getLift()<=0) {
            state=GAME_OVER;
        }
        flyers=Arrays.copyOf(lives, index);
    }
}

[代码运行效果截图]


飞机大战小游戏


网友评论    (发表评论)

共4 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...