Java實現的一個打飛機的小游戲

KieraGrace 8年前發布 | 11K 次閱讀 Java

Bullet.java       

package GameSubstance;

import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit;

import Tools.GameBox; import View.StartFrame;

public class Bullet{ public static final int BULLET_SPEED=15; private int x,y; private boolean live=true; Image bullet=GameBox.bullet; public Bullet(int x,int y){ this.x=x; this.y=y; } public void draw(Graphics g){ if(!live){ return; } g.drawImage(bullet,x,y,GameBox.BULLET_WIDTH,GameBox.BULLET_HEIGHT,null); y=y-BULLET_SPEED; if(y<-30){ live=false; } } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } public int getX() { return x; } public int getY() { return y; } } </pre>

EnemyBullet.java        

package GameSubstance;

import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import Tools.GameBox; public class EnemyBullet { private int x,y; private int bulletspeed=15; private boolean live=true;

Image enemyplanebullet=GameBox.enemybullet;

public EnemyBullet(int x,int y){
    this.x=x;
    this.y=y;
}
public void draw(Graphics g){
    if(!live){
        return;
    }
    y=y+bulletspeed;
    g.drawImage(enemyplanebullet,x,y,GameBox.ENEMYBULLET_WIDTH,GameBox.ENEMYBULLET_HEIGHT,null);
    if(y>GameBox.GAME_HEIGHT+GameBox.ENEMYBULLET_HEIGHT){
        live=false;
    }
}
public boolean isLive() {
    return live;
}
public void setLive(boolean live) {
    this.live = live;
}
public int getX() {
    return x;
}
public int getY() {
    return y;
}

} </pre>

 EnemyPlane.java       

package GameSubstance;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import Tools.GameBox; import View.StartFrame;

public class EnemyPlane { StartFrame sf; private int xpeed=8; private int yspeed=5; private boolean live=true; private boolean fired=true; private int x,y=0; private static int i=0; private String dir; Image enemy; Random rand=new Random(); public EnemyPlane(StartFrame sf){ this.sf=sf; if(i==0){ enemy=GameBox.enemy1; i=1; }else{ enemy=GameBox.enemy2; i=0; } x=rand.nextInt(GameBox.GAME_WIDTH); if(x%2==0){ dir="left"; }else{ dir="right"; } if(x<0){ x=0; } if(x+GameBox.ENEMY_WIDTH>GameBox.GAME_WIDTH){ x=GameBox.GAME_WIDTH-GameBox.ENEMY_WIDTH; } } public void draw(Graphics g){

    if(live){
        g.drawImage(enemy,x,y,GameBox.ENEMY_WIDTH,GameBox.ENEMY_HEIGHT,null);
        move();
    }


}
private void move(){
    y=y+xpeed;
    int i=rand.nextInt(5)+2;
    if(dir=="left"){
        x=x-i;
    }else{
        x=x+i;
    }
    if(y>GameBox.GAME_HEIGHT+GameBox.ENEMY_HEIGHT){
        live=false;
    }
    if(x<0){
        x=0;
        dir="right";
    }
    if(x+GameBox.ENEMY_WIDTH>GameBox.GAME_WIDTH){
        x=GameBox.GAME_WIDTH-GameBox.ENEMY_WIDTH;
        dir="left";
    }

}
public int getX() {
    return x;
}
public int getY() {
    return y;
}
public boolean isLive() {
    return live;
}
public void setLive(boolean live) {
    this.live = live;
}
public int getXpeed() {
    return xpeed;
}
public void setXpeed(int xpeed) {
    this.xpeed = xpeed;
}
public int getYspeed() {
    return yspeed;
}
public void setYspeed(int yspeed) {
    this.yspeed = yspeed;
}
public boolean isFired() {
    return fired;
}
public void setFired(boolean fired) {
    this.fired = fired;
}

} </pre>

 Explode.java ~ 724B  

package GameSubstance;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import Tools.GameBox;
public class Explode {
    private int x,y;
    private boolean live=true;
    private int count;
    Image Explode1=GameBox.Explode1;
    public Explode(int x,int y){
        this.x=x;
        this.y=y;
    }
    public void draw(Graphics g){
        if(!live){
            return;
        }
        g.drawImage(Explode1,x,y,GameBox.EXPLODE1_WIDTH,GameBox.EXPLODE1_HEIGHT,null);
        if(count==8){
            live=false;
        }
    }
    public boolean isLive() {
        return live;
    }
    public void setLive(boolean live) {
        this.live = live;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
}

[文件] MyPlane.java ~ 2KB         

package GameSubstance;
import Tools.GameBox;
import View.StartFrame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
public class MyPlane {
    private int x,y;
    private static Image plane;
    private Bullet  bullet;
    private boolean dl=false,du=false,dr=false,dd=false;
    public static final int MYPLANE_XSPEED=10;
    public static final int MYPLANE_YSPEED=10;
    private boolean live=true;
    public MyPlane(int x,int y){
        this.x=x;
        this.y=y;
    }
    public void draw(Graphics g){
        if(!live){
            return;
        }
        g.drawImage(GameBox.plane,x,y,GameBox.PLANE_WIDTH,GameBox.PLANE_HEIGHT,null);
        move();
    }

public void keyPressed(KeyEvent e) {
    int key=e.getKeyCode();
    switch(key){
    case KeyEvent.VK_UP:
        du=true;
        break;
    case KeyEvent.VK_DOWN:
        dd=true;
        break;
    case KeyEvent.VK_LEFT:
        dl=true;
        break;
    case KeyEvent.VK_RIGHT:
        dr=true;
        break;
    }
}
public void keyReleased(KeyEvent e) {
    int key=e.getKeyCode();
    switch(key){
    case KeyEvent.VK_UP:
        du=false;
        break;
    case KeyEvent.VK_DOWN:
        dd=false;
        break;
    case KeyEvent.VK_LEFT:
        dl=false;
        break;
    case KeyEvent.VK_RIGHT:
        dr=false;
    }
}
private void move(){
    if(du&&!dl&&!dd&&!dr){
        y=y-MYPLANE_YSPEED;//上
    }else if(dd&&!du&&!dl&&!dr){
        y=y+MYPLANE_YSPEED;//下
    }else if(!dd&&!du&&dl&&!dr){
        x=x-MYPLANE_XSPEED;//左
    }else if(!dd&&!du&&!dl&&dr){
        x=x+MYPLANE_XSPEED;//右
    }else if(!dd&&du&&dl&&!dr){
        y=y-MYPLANE_YSPEED;//左上
        x=x-MYPLANE_XSPEED;
    }else if(du&&!dl&&!dd&&dr){
        y=y-MYPLANE_YSPEED;//右上
        x=x+MYPLANE_XSPEED;
    }else if(dd&&!du&&dl&&!dr){
        x=x-MYPLANE_XSPEED;//左下
        y=y+MYPLANE_YSPEED;
    }else if(dd&&!du&&!dl&&dr){
        x=x+MYPLANE_XSPEED;//右下
        y=y+MYPLANE_YSPEED;
    }
    if(x+GameBox.PLANE_WIDTH>GameBox.GAME_WIDTH){
        x=GameBox.GAME_WIDTH-GameBox.PLANE_WIDTH;
    }
    if(x<0){
        x=0;
    }
    if(y+GameBox.PLANE_HEIGHT*2>GameBox.GAME_HEIGHT){
        y=GameBox.GAME_HEIGHT-GameBox.PLANE_HEIGHT*2;
    }
    if(y<30){
        y=30;
    }
}
public int getX() {
    return x;
}
public int getY() {
    return y;
}
public boolean isLive() {
    return live;
}
public void setLive(boolean live) {
    this.live = live;
}

} </pre>

 GameBox.java  

package Tools;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import GameSubstance.EnemyBullet; import GameSubstance.Explode; public class GameBox { public static int GAME_WIDTH=800; public static int GAME_HEIGHT=600; public static Font f1=new Font("oúì?",3,20); public static Toolkit tk = Toolkit.getDefaultToolkit(); public static Image backgroundimage=tk.createImage("images\±3?°.jpg"); public static Image plane=tk.createImage("images\?ò·?·é?ú.gif"); public static int PLANE_WIDTH=30; public static int PLANE_HEIGHT=30; public static Image Explode1=tk.createImage("images/±??¨.gif"); public static int EXPLODE1_WIDTH=30; public static int EXPLODE1_HEIGHT=30; public static Image bullet=tk.createImage("images\×óμˉ.gif"); public static int BULLET_WIDTH=18; public static int BULLET_HEIGHT=35; public static Image enemy1=tk.createImage("images\μD?ú1.gif"); public static Image enemy2=tk.createImage("images\μD?ú2.gif"); public static int ENEMY_WIDTH=30; public static int ENEMY_HEIGHT=30; public static Image enemybullet=tk.createImage("images\·??-μ?×óμˉ.gif"); public static int ENEMYBULLET_WIDTH=15; public static int ENEMYBULLET_HEIGHT=30; } </pre>

 StartFrame.java  

package View;
import GameSubstance.;
import Tools.;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.ImageObserver;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class StartFrame extends JFrame implements Runnable{ //游戲組件 Image bk=GameBox.backgroundimage; MyPlane myplane; List<EnemyPlane> enemyplanelist=new ArrayList<EnemyPlane>(); private int count=0; private float sourse=0; List<Bullet> bulletlist=new ArrayList<Bullet>(); List<Explode> explodelist=new ArrayList<Explode>(); List<EnemyBullet> enemybulletlist=new ArrayList<EnemyBullet>(); JPanel jp; public static void main(String[] args) { new Thread(new StartFrame()).start();

}
public StartFrame(){
    this.setSize(GameBox.GAME_WIDTH,GameBox.GAME_HEIGHT);
    //窗口居中
    int width=Toolkit.getDefaultToolkit().getScreenSize().width;
    int height=Toolkit.getDefaultToolkit().getScreenSize().height;
    setLocation(width/2-GameBox.GAME_WIDTH/2, height/2-GameBox.GAME_HEIGHT/2);
    setResizable(false);
    myplane=new MyPlane(GameBox.GAME_WIDTH/2,GameBox.GAME_HEIGHT-GameBox.PLANE_HEIGHT*2);
    new Thread(new AddEnemy()).start();
    this.addKeyListener(new KeyMonitor());
    this.add(new GameJPanel());
    setTitle("打飛機小游戲");
    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
    setVisible(true);
}

@Override
public void run() {
    while(true){
        repaint();
        Random rand=new Random();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private class KeyMonitor extends KeyAdapter {

    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_F2){
            myplane.setLive(true);
        }
        myplane.keyReleased(e);
    }

    public void keyPressed(KeyEvent e) {
        myplane.keyPressed(e);
    }

}

private class AddEnemy implements Runnable{
    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(500);
                addEnemyPlane();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void addEnemyPlane(){
        EnemyPlane enemyplane=new EnemyPlane(StartFrame.this);
        enemybulletlist.add(new EnemyBullet(enemyplane.getX(),enemyplane.getY()));
        enemyplanelist.add(enemyplane);
    }
}


private class GameJPanel extends JPanel{

    public void paint(Graphics g){
        super.paint(g);
        g.drawImage(bk,0,0,GameBox.GAME_WIDTH,GameBox.GAME_HEIGHT,null);
        myplane.draw(g);
        if (count==0){
            if(myplane.isLive()){
                createBullet();
            }else{
                for(int i=0;i<bulletlist.size();i++){
                    bulletlist.remove(i);
                }
            }
        }
        count++;
        if(count==2){
            count=0;
        }
        for(int i=0;i<bulletlist.size();i++){

            Bullet bullet=bulletlist.get(i);
            bullet.draw(g);
            clearBullet();
        }
        for(int i=0;i<enemyplanelist.size();i++){
            EnemyPlane enemyplane=enemyplanelist.get(i);
            enemyplane.draw(g);
            clearEnemyplane();
            Random rand=new Random();
            if(rand.nextInt(100)>93&&enemyplane.isLive()){
                enemybulletlist.add(new EnemyBullet(enemyplane.getX(),enemyplane.getY()));
            }
            //如果敵機面對我方飛機時發射一枚子彈
            if(enemyplane.getX()>=myplane.getX()&&enemyplane.getX()<=myplane.getX()+GameBox.PLANE_WIDTH&&enemyplane.isFired()&&enemyplane.isLive()){
                enemybulletlist.add(new EnemyBullet(enemyplane.getX(),enemyplane.getY()));
                enemyplane.setFired(false);
            }

        }
        for(int i=0;i<enemybulletlist.size();i++){
            EnemyBullet eb=enemybulletlist.get(i);
            eb.draw(g);
            clearEnemyBullet();
        }

        hitPlane();//攻擊敵機
        impactMyplane();//敵機與我方飛機發生碰撞
        if(enemybulletlist.size()>=1)hitMyplane();//
        for(int i=0;i<explodelist.size();i++){
            Explode exp=explodelist.get(i);
            exp.draw(g);
            exp.setCount(exp.getCount()+1);
            clearExplode();
        }
        g.setColor(Color.RED);
    //  g.setFont(GameBox.f1);//設置字體之后加載窗口會卡2秒鐘
        if(sourse!=0){
            g.drawString("您的得分:"+(int)sourse+"0", 50, 50);
        }else{
            g.drawString("您的得分:0", 50, 50);
        }

    }

    private void clearEnemyBullet() {
        for(int i=0;i<enemybulletlist.size();i++){
            if(!(enemybulletlist.get(i).isLive())){
                enemybulletlist.remove(i);
            }
        }
    }
    private void createBullet(){
        Bullet bullet=new Bullet((myplane.getX()+5),(myplane.getY()-30));
        bulletlist.add(bullet);
    }
    private void clearBullet(){
        for(int i=0;i<bulletlist.size();i++){
            if(!(bulletlist.get(i).isLive())){
                bulletlist.remove(i);
            }
        }
    }
    private void clearEnemyplane() {
        for(int i=0;i<enemyplanelist.size();i++){
            if(!(enemyplanelist.get(i).isLive())){
                enemyplanelist.remove(i);
            }
        }
    }
    private void clearExplode() {
        for(int i=0;i<explodelist.size();i++){
            if(!(explodelist.get(i).isLive())){
                explodelist.remove(i);
            }
        }
    }
    private void hitPlane(){
        int bx,ex,by,ey;
        for(int i=0;i<bulletlist.size();i++){
            Bullet bullet=bulletlist.get(i);
            bx=bullet.getX();
            by=bullet.getY();
            for(int j=0;j<enemyplanelist.size();j++){
                EnemyPlane enemyplane=enemyplanelist.get(j);
                ex=enemyplane.getX();
                ey=enemyplane.getY();
                if(bx>=ex&&bx<=ex+GameBox.ENEMY_WIDTH&&by>=ey&&by<=ey+GameBox.ENEMY_HEIGHT&&enemyplane.isLive()&&bullet.isLive()){
                    bullet.setLive(false);
                    enemyplane.setLive(false);
                    explodelist.add(new Explode(bx,by));
                    sourse=sourse+1.168320194f;//防止CE惡意修改分數(我的QQ號碼)
                }
            }
        }
    }
    private void impactMyplane(){
        int mx,my,ex,ey;
        mx=myplane.getX();
        my=myplane.getY();
        for(int i=0;i<enemyplanelist.size();i++){
            EnemyPlane enemyplane=enemyplanelist.get(i);
            ex=enemyplane.getX();
            ey=enemyplane.getY();
            if(mx>=ex&&mx<=ex+GameBox.ENEMY_WIDTH&&my>=ey&&my<=ey+GameBox.ENEMY_HEIGHT&&myplane.isLive()&&enemyplane.isLive()){
                myplane.setLive(false);
                enemyplane.setLive(false);
                explodelist.add(new Explode(mx,my));
                explodelist.add(new Explode(ex,ey));
            }
        }
    }
    private void hitMyplane() {
        int mx,my,ex,ey;
        mx=myplane.getX();
        my=myplane.getY();
        for(int i=0;i<enemyplanelist.size();i++){
            EnemyBullet eb=enemybulletlist.get(i);
            ex=eb.getX();
            ey=eb.getY();
            if(ex+GameBox.ENEMYBULLET_WIDTH>=mx&&ex+GameBox.ENEMYBULLET_WIDTH<=mx+GameBox.PLANE_WIDTH&&ey+GameBox.ENEMYBULLET_HEIGHT>=my&&ey+GameBox.ENEMYBULLET_HEIGHT<=my+GameBox.PLANE_HEIGHT&&myplane.isLive()&&eb.isLive()){
                myplane.setLive(false);
                eb.setLive(false);
                explodelist.add(new Explode(mx,my));
            }
        }
    }
}

}

</pre>

爆炸.gif    

背景.jpg    

[圖片] 敵機1.gif    

[圖片] 敵機2.gif    

[圖片] 憤怒的子彈.gif    

[圖片] 子彈.gif    

 本文由用戶 KieraGrace 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!