注册 登录
编程论坛 JAVA论坛

飞机大战

林月儿 发布于 2019-01-05 20:22, 9872 次点击
偶然看到有游戏帖子,闲来无事拿过来修改了一下,改动较大故新开一贴。
这个其实前台写的话可能更快一点。
程序代码:
package com.leng.frame;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.util.Timer;
import java.util.stream.Collectors;

import javax.swing.*;

public class Test extends JFrame implements MouseListener, MouseMotionListener {
    /**
     *
     
*/
    private static final long serialVersionUID = 1L;
    private static final int START = 0,
            RUNNING = 1,
            PAUSE = 2,
            OVER = 3,
            DEFAULT_WIDTH = 610,
            DEFAULT_HEIGHT = 506;
    private int state = START;
    private MoveObj self = new MoveObj(0, 0, 40, 40);
    private List<MoveObj> enemys = new ArrayList<>();
    private List<MoveObj> bullets = new ArrayList<>();
    public Test() {
        setVisible(true);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addMouseListener(this);
        addMouseMotionListener(this);
        setResizable(false);
        JPanel myPanel = new MyPanel();
        add(myPanel);
        new Timer().schedule(new TimerTask() {
            
            @Override
            public void run() {
                if(state == RUNNING) {
                    addEnemyAction();
                    shootAction();
                    bangAction();
                    moveAction();
                    outOfBorderAction();
                    checkGameOver();
                    moveIndex++;
                }
                myPanel.repaint();
            }
        }, 10, 10);
    }
    protected void checkGameOver() {
        for(MoveObj obj : enemys) {
            if(self.x + self.width > obj.x && self.x < obj.x + obj.width &&
                    self.y + self.height > obj.y && self.y < obj.y + obj.height) {
                state = OVER;
                enemys.clear();
                bullets.clear();
                return;
            }
        }
    }
    long moveIndex = 0;
    protected void outOfBorderAction() {
        enemys = enemys.stream().filter(MoveObj::isNotOutOfBorder)
                .collect(Collectors.toList());
        bullets = bullets.stream().filter(MoveObj::isNotOutOfBorder)
                .collect(Collectors.toList());
    }
    protected void moveAction() {
        if(moveIndex % 2 == 0) {
            enemys.forEach(ele->ele.y+=1);
            bullets.forEach(ele->ele.y-=2);
        }
    }
    protected void bangAction() {
        for(MoveObj b:new ArrayList<>(bullets)) {
            for(MoveObj e:new ArrayList<>(enemys)) {
                if(b.bang(e)) {
                    bullets.remove(b);
                    enemys.remove(e);
                    break;
                }
            }
        }
    }
    protected void shootAction() {
        // 0.2s
        if(moveIndex % 20 == 0) {
            bullets.add(new MoveObj(self.x+self.width/2, self.y, 8, 12));
        }
    }
    protected void addEnemyAction() {
        // 2s
        if(moveIndex % 200 == 0) {
            int x = new Random().nextInt(DEFAULT_WIDTH - 40);
            enemys.add(new MoveObj(x, 0, 40, 40));
        }
    }
    // my plan
    Image myplanImage = new ImageIcon("image/MyPlane.png").getImage();
    // area map
    Image gameMap = new ImageIcon("image/map/gamemap.jpg").getImage();
    // enemy
    Image enemyImage = new ImageIcon("image/monster/PlaneOne.png").getImage();
    // bullet
    Image bulletImage = new ImageIcon("image/bullet.png").getImage();

    class MyPanel extends JPanel {
        /**
         *
         
*/
        private static final long serialVersionUID = 1L;
        @Override
        public void paint(Graphics g) {
           g.drawImage(gameMap, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, null);
           g.drawImage(myplanImage, self.x, self.y, self.width, self.height, null);
           enemys.forEach(e->g.drawImage(enemyImage, e.x, e.y, e.width, e.height, null));
           bullets.forEach(e->g.drawImage(bulletImage, e.x, e.y, e.width, e.height, null));
           Font font = new Font("gbk", Font.BOLD, 32);
           g.setFont(font);
           g.setColor(Color.RED);
           switch(state) {
           case START:
               g.drawString("开始", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case PAUSE:
               g.drawString("暂停", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case OVER:
               g.drawString("结束", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           }
        }
    }
    public static void main(String[] args) {
        new Test();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if(state == START)
            state = RUNNING;
        else if(state == OVER)
            state = START;
    }
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {
        if(state == PAUSE)
            state = RUNNING;
    }
    @Override
    public void mouseExited(MouseEvent e) {
        if(state == RUNNING)
            state = PAUSE;
    }
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {
        if(state == RUNNING) {
            self.x = e.getX() - 20;
            self.y = e.getY() - 40;
        }
    }
    class MoveObj {
        int x;
        int y;
        int width;
        int height;
        public MoveObj(int x, int y, int width, int height) {
            super();
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }
        public boolean bang(MoveObj e) {
            return x+width>e.x&&x<e.x+e.width&&y+height>e.y&&y<e.y+e.height;
        }
        public boolean isNotOutOfBorder() {
            return !(x < 0 || y < 0 || x + width > DEFAULT_WIDTH || y + height > DEFAULT_HEIGHT);
        }
    }
}

只有本站会员才能查看附件,请 登录

写的比较仓促,相关的参数没有仔细校验,不足之处欢迎指正。
31 回复
#2
林月儿2019-01-05 20:26
注:显示开始时鼠标点击界面后,可通过移动鼠标改变飞机位置
   结束后点击界面回到开始状态。
#3
摇滚萝卜2019-01-06 11:11
回复 2楼 林月儿
怎么我运行不了, 能打一个包发一下吗
#4
林月儿2019-01-06 11:59
回复 3楼 摇滚萝卜
可能是用到1.8特性,把报错的地方放到百度查一下,看低版本怎么写的
没有多余代码,以上就是全部代码

[此贴子已经被作者于2019-1-6 12:00编辑过]

#5
摇滚萝卜2019-01-06 12:05
回复 4楼 林月儿
好的
#6
摇滚萝卜2019-01-06 13:19
回复 4楼 林月儿
大佬你class命名是啥, 我初学 不懂。
#7
林月儿2019-01-06 14:38
Test
#8
摇滚萝卜2019-01-06 15:12
回复 7楼 林月儿
还是打不开,不知道怎么办了。。
#9
林月儿2019-01-06 15:45
在frame目录下新建Test.java,把代码全部贴进去
#10
摇滚萝卜2019-01-06 15:54
只有本站会员才能查看附件,请 登录
大佬 是这样吗
#11
摇滚萝卜2019-01-06 15:55
回复 9楼 林月儿
咋还是运行不了。。
#12
摇滚萝卜2019-01-06 16:07
回复 2楼 林月儿
只有本站会员才能查看附件,请 登录
有报错。。

[此贴子已经被作者于2019-1-6 17:18编辑过]

#13
林月儿2019-01-06 17:38
右侧不是有红点吗,报错先解决掉,用的什么版本,1.7以下要改代码
#14
摇滚萝卜2019-01-06 18:53
虽然没搞成 但还是谢谢你了
#15
林月儿2019-01-06 19:29
程序代码:
package game;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.util.Timer;
import javax.swing.*;

public class Test extends JFrame implements MouseListener, MouseMotionListener {
    /**
     *
     
*/
    private static final long serialVersionUID = 1L;
    private static final int START = 0,
            RUNNING = 1,
            PAUSE = 2,
            OVER = 3,
            DEFAULT_WIDTH = 610,
            DEFAULT_HEIGHT = 506;
    private int state = START;
    private MoveObj self = new MoveObj(0, 0, 40, 40);
    private List<MoveObj> enemys = new ArrayList<MoveObj>();
    private List<MoveObj> bullets = new ArrayList<MoveObj>();
    public Test() {
        setVisible(true);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addMouseListener(this);
        addMouseMotionListener(this);
        setResizable(false);
        final JPanel myPanel = new MyPanel();
        add(myPanel);
        new Timer().schedule(new TimerTask() {
            
            @Override
            public void run() {
                if(state == RUNNING) {
                    addEnemyAction();
                    shootAction();
                    bangAction();
                    moveAction();
                    outOfBorderAction();
                    checkGameOver();
                    moveIndex++;
                }
                myPanel.repaint();
            }
        }, 10, 10);
    }
    protected void checkGameOver() {
        for(MoveObj obj : enemys) {
            if(self.x + self.width > obj.x && self.x < obj.x + obj.width &&
                    self.y + self.height > obj.y && self.y < obj.y + obj.height) {
                state = OVER;
                enemys.clear();
                bullets.clear();
                return;
            }
        }
    }
    long moveIndex = 0;
    protected void outOfBorderAction() {
//        enemys = enemys.stream().filter(MoveObj::isNotOutOfBorder)
//                .collect(Collectors.toList());
//        bullets = bullets.stream().filter(MoveObj::isNotOutOfBorder)
//                .collect(Collectors.toList());
        for(MoveObj e:new ArrayList<MoveObj>(enemys)) {
            if(!e.isNotOutOfBorder()) {
                enemys.remove(e);
            }
        }
        for(MoveObj e:new ArrayList<MoveObj>(bullets)) {
            if(!e.isNotOutOfBorder()) {
                bullets.remove(e);
            }
        }
    }
    protected void moveAction() {
        if(moveIndex % 2 == 0) {
//            enemys.forEach(ele->ele.y+=1);
            for(MoveObj e:enemys) e.y+=1;
//            bullets.forEach(ele->ele.y-=2);
            for(MoveObj e:bullets) e.y-=2;
        }
    }
    protected void bangAction() {
        for(MoveObj b:new ArrayList<MoveObj>(bullets)) {
            for(MoveObj e:new ArrayList<MoveObj>(enemys)) {
                if(b.bang(e)) {
                    bullets.remove(b);
                    enemys.remove(e);
                    break;
                }
            }
        }
    }
    protected void shootAction() {
        // 0.2s
        if(moveIndex % 20 == 0) {
            bullets.add(new MoveObj(self.x+self.width/2, self.y, 8, 12));
        }
    }
    protected void addEnemyAction() {
        // 2s
        if(moveIndex % 200 == 0) {
            int x = new Random().nextInt(DEFAULT_WIDTH - 40);
            enemys.add(new MoveObj(x, 0, 40, 40));
        }
    }
    // my plan
    Image myplanImage = new ImageIcon("image/MyPlane.png").getImage();
    // area map
    Image gameMap = new ImageIcon("image/map/gamemap.jpg").getImage();
    // enemy
    Image enemyImage = new ImageIcon("image/monster/PlaneOne.png").getImage();
    // bullet
    Image bulletImage = new ImageIcon("image/bullet.png").getImage();

    class MyPanel extends JPanel {
        /**
         *
         
*/
        private static final long serialVersionUID = 1L;
        @Override
        public void paint(Graphics g) {
           g.drawImage(gameMap, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, null);
           g.drawImage(myplanImage, self.x, self.y, self.width, self.height, null);
//           enemys.forEach(e->g.drawImage(enemyImage, e.x, e.y, e.width, e.height, null));
           for(MoveObj e:enemys)g.drawImage(enemyImage, e.x, e.y, e.width, e.height, null);
//           bullets.forEach(e->g.drawImage(bulletImage, e.x, e.y, e.width, e.height, null));
           for(MoveObj e:bullets)g.drawImage(bulletImage, e.x, e.y, e.width, e.height, null);
           Font font = new Font("gbk", Font.BOLD, 32);
           g.setFont(font);
           g.setColor(Color.RED);
           switch(state) {
           case START:
               g.drawString("开始", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case PAUSE:
               g.drawString("暂停", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case OVER:
               g.drawString("结束", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           }
        }
    }
    public static void main(String[] args) {
        new Test();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if(state == START)
            state = RUNNING;
        else if(state == OVER)
            state = START;
    }
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {
        if(state == PAUSE)
            state = RUNNING;
    }
    @Override
    public void mouseExited(MouseEvent e) {
        if(state == RUNNING)
            state = PAUSE;
    }
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {
        if(state == RUNNING) {
            self.x = e.getX() - 20;
            self.y = e.getY() - 40;
        }
    }
    class MoveObj {
        int x;
        int y;
        int width;
        int height;
        public MoveObj(int x, int y, int width, int height) {
            super();
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }
        public boolean bang(MoveObj e) {
            return x+width>e.x&&x<e.x+e.width&&y+height>e.y&&y<e.y+e.height;
        }
        public boolean isNotOutOfBorder() {
            return !(x < 0 || y < 0 || x + width > DEFAULT_WIDTH || y + height > DEFAULT_HEIGHT);
        }
    }
}


只有本站会员才能查看附件,请 登录
#16
林月儿2019-01-06 19:33
我发现你是懂的真不多,不知道的就说出来,没什么不好意思的。
你的截图看到你用了还是1.6的,钻石语法也不支持。
不管哪个版本,多了解多学习总没坏处
#17
摇滚萝卜2019-01-06 19:55
回复 16楼 林月儿
内个。。我只是想加个敌机爆炸效果。。
#18
摇滚萝卜2019-01-06 19:58
回复 16楼 林月儿
只要上下左右控制就行了  然后子弹碰到敌机就爆炸 的那种。。
#19
林月儿2019-01-06 20:00
回复 18楼 摇滚萝卜
你可以改回键盘控制,个人偏爱鼠标,爆炸的图片有吗,加到相应位置就好了呀
#20
摇滚萝卜2019-01-06 20:09
回复 19楼 林月儿
我也想加,,但是真的是初学者  。。
#21
林月儿2019-01-06 20:11
回复 20楼 摇滚萝卜
那你下次把图片发我,我帮你加上吧,明天还要上课,我先下了,拜拜
#22
摇滚萝卜2019-01-06 20:23
回复 21楼 林月儿
只有本站会员才能查看附件,请 登录
然后在爆炸那里帮我标注下   谢谢大佬!

[此贴子已经被作者于2019-1-6 22:50编辑过]

#23
林月儿2019-01-07 21:18
程序代码:
package game;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.util.Timer;
import javax.swing.*;

public class Test extends JFrame implements MouseListener, MouseMotionListener {
    /**
     *
     
*/
    private static final long serialVersionUID = 1L;
    private static final int START = 0,
            RUNNING = 1,
            PAUSE = 2,
            OVER = 3,
            DEFAULT_WIDTH = 610,
            DEFAULT_HEIGHT = 506;
    private int state = START;
    private MoveObj self = new MoveObj(0, 0, 40, 40);
    private List<MoveObj> enemys = new ArrayList<MoveObj>();
    private List<MoveObj> bullets = new ArrayList<MoveObj>();
    private List<MoveObj> bombs = new ArrayList<MoveObj>();
    public Test() {
        setVisible(true);
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        addMouseListener(this);
        addMouseMotionListener(this);
        setResizable(false);
        final JPanel myPanel = new MyPanel();
        add(myPanel);
        new Timer().schedule(new TimerTask() {
            
            @Override
            public void run() {
                if(state == RUNNING) {
                    addEnemyAction();
                    shootAction();
                    bangAction();
                    hideBomb();
                    moveAction();
                    outOfBorderAction();
                    checkGameOver();
                    moveIndex++;
                }
                myPanel.repaint();
            }
        }, 10, 10);
    }
    protected void hideBomb() {
        for(MoveObj e:bombs) {
            if(moveIndex % 4 == 0) {
                if(e.life>0)
                    e.life--;
            }
            e.width+=1;
            e.height+=1;
        }
        for(MoveObj e:new ArrayList<MoveObj>(bombs)) {
            if(e.life<=0)
                bombs.remove(e);
        }
        
    }
    protected void checkGameOver() {
        for(MoveObj obj : enemys) {
            if(self.x + self.width > obj.x && self.x < obj.x + obj.width &&
                    self.y + self.height > obj.y && self.y < obj.y + obj.height) {
                state = OVER;
                enemys.clear();
                bullets.clear();
                return;
            }
        }
    }
    long moveIndex = 0;
    protected void outOfBorderAction() {
//        enemys = enemys.stream().filter(MoveObj::isNotOutOfBorder)
//                .collect(Collectors.toList());
//        bullets = bullets.stream().filter(MoveObj::isNotOutOfBorder)
//                .collect(Collectors.toList());
        for(MoveObj e:new ArrayList<MoveObj>(enemys)) {
            if(!e.isNotOutOfBorder()) {
                enemys.remove(e);
            }
        }
        for(MoveObj e:new ArrayList<MoveObj>(bullets)) {
            if(!e.isNotOutOfBorder()) {
                bullets.remove(e);
            }
        }
    }
    protected void moveAction() {
        if(moveIndex % 2 == 0) {
//            enemys.forEach(ele->ele.y+=1);
            for(MoveObj e:enemys) e.y+=1;
//            bullets.forEach(ele->ele.y-=2);
            for(MoveObj e:bullets) e.y-=2;
        }
    }
    protected void bangAction() {
        for(MoveObj b:new ArrayList<MoveObj>(bullets)) {
            for(MoveObj e:new ArrayList<MoveObj>(enemys)) {
                if(b.bang(e)) {
                    bullets.remove(b);
                    enemys.remove(e);
                    bombs.add(new MoveObj(e.x, e.y, 12, 12));
                    break;
                }
            }
        }
    }
    protected void shootAction() {
        // 0.2s
        if(moveIndex % 20 == 0) {
            bullets.add(new MoveObj(self.x+self.width/2, self.y, 8, 12));
        }
    }
    protected void addEnemyAction() {
        // 2s
        if(moveIndex % 200 == 0) {
            int x = new Random().nextInt(DEFAULT_WIDTH - 40);
            enemys.add(new MoveObj(x, 0, 40, 40));
        }
    }
    // my plan
    Image myplanImage = new ImageIcon("image/MyPlane.png").getImage();
    // area map
    Image gameMap = new ImageIcon("image/map/gamemap.jpg").getImage();
    // enemy
    Image enemyImage = new ImageIcon("image/monster/PlaneOne.png").getImage();
    // bullet
    Image bulletImage = new ImageIcon("image/bullet.png").getImage();
    // bomb
    Image bombImage = new ImageIcon("image/bomb.png").getImage();

    class MyPanel extends JPanel {
        /**
         *
         
*/
        private static final long serialVersionUID = 1L;
        @Override
        public void paint(Graphics g) {
           g.drawImage(gameMap, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, null);
           g.drawImage(myplanImage, self.x, self.y, self.width, self.height, null);
//           enemys.forEach(e->g.drawImage(enemyImage, e.x, e.y, e.width, e.height, null));
           for(MoveObj e:enemys)g.drawImage(enemyImage, e.x, e.y, e.width, e.height, null);
//           bullets.forEach(e->g.drawImage(bulletImage, e.x, e.y, e.width, e.height, null));
           for(MoveObj e:bullets)g.drawImage(bulletImage, e.x, e.y, e.width, e.height, null);
           for(MoveObj e:bombs) {
               if(e.life > 0)
               g.drawImage(bombImage, e.x, e.y, e.width, e.height, null);
           }
           Font font = new Font("gbk", Font.BOLD, 32);
           g.setFont(font);
           g.setColor(Color.RED);
           switch(state) {
           case START:
               g.drawString("开始", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case PAUSE:
               g.drawString("暂停", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           case OVER:
               g.drawString("结束", DEFAULT_WIDTH/3, DEFAULT_HEIGHT/2);
               break;
           }
        }
    }
    public static void main(String[] args) {
        new Test();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if(state == START)
            state = RUNNING;
        else if(state == OVER)
            state = START;
    }
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {
        if(state == PAUSE)
            state = RUNNING;
    }
    @Override
    public void mouseExited(MouseEvent e) {
        if(state == RUNNING)
            state = PAUSE;
    }
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {
        if(state == RUNNING) {
            self.x = e.getX() - 20;
            self.y = e.getY() - 40;
        }
    }
    class MoveObj {
        int x;
        int y;
        int width;
        int height;
        int life = 10;
        public MoveObj(int x, int y, int width, int height) {
            super();
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }
        public boolean bang(MoveObj e) {
            return x+width>e.x&&x<e.x+e.width&&y+height>e.y&&y<e.y+e.height;
        }
        public boolean isNotOutOfBorder() {
            return !(x < 0 || y < 0 || x + width > DEFAULT_WIDTH || y + height > DEFAULT_HEIGHT);
        }
    }
}
#24
摇滚萝卜2019-01-08 11:02
#25
幻紫灵心2019-01-09 17:45
以下是引用林月儿在2019-1-6 20:11:10的发言:

那你下次把图片发我,我帮你加上吧,明天还要上课,我先下了,拜拜

月儿还是学生?
#26
豆豆的滴2019-01-10 20:58
嗯嗯玩物丧志
#27
林月儿2019-01-10 21:47
回复 26楼 豆豆的滴
老脸一红
#28
xzc9122019-01-12 16:50
回复 27楼 林月儿
老夫猜可能是大学生吧
#29
林月儿2019-01-13 05:35
回复 28楼 xzc912
新员工培训
#30
xzc9122019-01-13 11:22
回复 29楼 林月儿
好吧
#31
yuguygu2019-01-16 18:45
小白看完了一脸懵
#32
xzc9122019-01-17 14:47
回复 31楼 yuguygu
的确是的
1