| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
跟大牛学C++学算法数据结构
共有 1384 人关注过本帖
标题:飞机大战
只看楼主 加入收藏
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:114
帖 子:1823
专家分:7940
注 册:2015-3-19
结帖率:100%
  已结贴   问题点数:20  回复次数:31   
飞机大战
偶然看到有游戏帖子,闲来无事拿过来修改了一下,改动较大故新开一贴。
这个其实前台写的话可能更快一点。
程序代码:
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);
        }
    }
}


写的比较仓促,相关的参数没有仔细校验,不足之处欢迎指正。
附件: 您没有浏览附件的权限,请 登录注册
2019-01-05 20:22
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:114
帖 子:1823
专家分:7940
注 册:2015-3-19
  得分:0 
注:显示开始时鼠标点击界面后,可通过移动鼠标改变飞机位置
   结束后点击界面回到开始状态。

知命以下无敌
2019-01-05 20:26
摇滚萝卜
Rank: 2
等 级:论坛游民
帖 子:16
专家分:20
注 册:2019-1-4
  得分:20 
回复 2楼 林月儿
怎么我运行不了, 能打一个包发一下吗
2019-01-06 11:11
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:114
帖 子:1823
专家分:7940
注 册:2015-3-19
  得分:0 
回复 3楼 摇滚萝卜
可能是用到1.8特性,把报错的地方放到百度查一下,看低版本怎么写的
没有多余代码,以上就是全部代码

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


知命以下无敌
2019-01-06 11:59
摇滚萝卜
Rank: 2
等 级:论坛游民
帖 子:16
专家分:20
注 册:2019-1-4
  得分:0 
回复 4楼 林月儿
好的
2019-01-06 12:05
摇滚萝卜
Rank: 2
等 级:论坛游民
帖 子:16
专家分:20
注 册:2019-1-4
  得分:0 
回复 4楼 林月儿
大佬你class命名是啥, 我初学 不懂。
2019-01-06 13:19
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:114
帖 子:1823
专家分:7940
注 册:2015-3-19
  得分:0 
Test

知命以下无敌
2019-01-06 14:38
摇滚萝卜
Rank: 2
等 级:论坛游民
帖 子:16
专家分:20
注 册:2019-1-4
  得分:0 
回复 7楼 林月儿
还是打不开,不知道怎么办了。。
2019-01-06 15:12
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:114
帖 子:1823
专家分:7940
注 册:2015-3-19
  得分:0 
在frame目录下新建Test.java,把代码全部贴进去

知命以下无敌
2019-01-06 15:45
摇滚萝卜
Rank: 2
等 级:论坛游民
帖 子:16
专家分:20
注 册:2019-1-4
  得分:0 
大佬 是这样吗
附件: 您没有浏览附件的权限,请 登录注册
2019-01-06 15:54







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.081904 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved