IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> java游戏 飞机对战 -> 正文阅读

[系统运维]java游戏 飞机对战

飞机对战

联机版思路1正在报错中…,就不上传了

联机版思路1:同步画面,2个玩家可以一起玩游戏,每两个客户机进行联机,如果连接服务器的客户机的数量为奇数,则最后一个连接服务器的客户端需要等待下一个客户端的连接才能开始游戏
每两个客户端进行实体类的坐标利用服务器中转信息进行同步,但是会有延迟,好像不可行…

联机版思路2:向服务器发送玩家的最高分数,进行排名存储,然后发送给客户端对所有玩家进行排名;数据库可以实现数据持久化;

游戏规则:

参考于: https://blog.csdn.net/qq_50459047/article/details/118472562

操作
可以操作两个飞机,分别是飞机1、飞机2,当两个飞机血量都为零游戏结束;
飞机1操作:wsad控制上下左右,空格发射子弹
飞机2操作:鼠标控制飞机移动,按压鼠标发射子弹
敌机子弹打死后随机掉落金钱20,50,100;

联机思路1后:可以把每一组(2个客户机)看作一个整体,进行按照金钱总数的游戏排名;这一组的两个客户机的飞机1、2的金钱分数可以进行比较,判断谁赢了;多了画面同步,可两人一起玩,并且判断两人的输赢

联机版思路2后:对所有玩家进行一个排名,并使客户端的游戏在结束后可查看其所有人的排名
缺点:游戏在玩的时候还是单人游戏,只是最终可以看到其他人玩的分数;

以下为单机版

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下为联机版思路2

在这里插入图片描述
在这里插入图片描述

飞机对战单机版

implements Serializable 进行对象序列化原因:联机时可能要用到
Fly:定义的通用类减少代码的重复编写,关键是坐标x,y;在之后的实体类中都继承Fly

package flyevery;
import java.awt.image.BufferedImage;
import java.io.Serializable;

/**
    游戏中的飞行物类----共同特点
    一个超类    提高代码的复用性,不重复写代码
    对象序列化
 */
public class Fly implements Serializable {

    public BufferedImage img ;  //飞行物的图片
    public int x;  //飞行物的横坐标
    public int y;  //飞行物的纵坐标
    public int w;  //飞行物的宽度
    public int h;  //飞行物的高度
}

GetIMG:读取图片,获得图片,利用BufferedImage

mport java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;

public class GetIMG implements Serializable {
    // BufferedImage:是Java中表示图片的类
    // 处理图片的工具类
    public static BufferedImage getImg(String path)
    {

        try {
            BufferedImage img = ImageIO.read(new FileInputStream(path));
            return img;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

MainPlane1:飞机1,创建时出现在定义的初始位置处,有四个方法moveUp、moveDown、moveLeft、moveRight,进行坐标上下左右的改变,在之后根据事件监听而调用

package flyplane;
import img.GetIMG;

public class MainPlane1 extends flyevery.Fly{
   private int blood;  //飞机1的血量

   public int getBlood() {
       return blood;
   }

   public void setBlood(int blood) {
       this.blood = blood;
   }

   // 构造方法
   public MainPlane1(){
       img = GetIMG.getImg("src/main/java/img/飞机1.png");//飞机1的图片
       // 飞机1的图片的大小设置-----设置为图片的大小
       w = img.getWidth();
       h = img.getHeight();
       // 设置飞机1的初始位置
       x = 175;
       y = 650 - h;
       blood = 5;  // 飞机1的初始血量值
   }

   //利用事件监听器---键盘KeyEvent--按键
   //向上移动 w
   public void moveUp(){
       if(y >= 50)   y -= 50;
   }
   //向下移动 s
   public void moveDown(){
       if(y <= 530)  y += 50;
   }
   //向左移动 a
   public void moveLeft(){
       if(x >= 25)   x -= 50;
   }
   //向右移动 d
   public  void moveRight(){
       if(x <= 335)  x += 50;
   }

}

DeputyPlane2:飞机2,创建时出现在定义的初始位置处,有方法moveToMouse,进行坐标的改变,在之后根据事件监听而调用

package flyplane;
import img.GetIMG;
public class DeputyPlane2 extends flyevery.Fly{
   private int blood;  //飞机2的血量
   public int getBlood() {
       return blood;
   }

   public void setBlood(int blood) {
       this.blood = blood;
   }

   // 构造方法
   public DeputyPlane2(){
       img = GetIMG.getImg("src/main/java/img/飞机2.png");//飞机2的图片
       // 飞机2的图片的大小设置-----设置为图片的大小
       w = img.getWidth();
       h = img.getHeight();
       // 设置飞机2的初始位置
       x = 300;
       y = 550 - h;
       blood = 5;  // 飞机2的初始血量值
   }

   //利用事件监听器---鼠标MouseEvent----光标移入触发
   public void moveToMouse(int mx, int my){
       x = mx - w/2; //将鼠标居正中
       y = my - h/2; //将鼠标居于僚机正中
   }

}

EnemyPlane:敌机,有速度,血量,但不能进行攻击。被子弹击中后,血量减少一滴,和我方飞机相撞后直接死亡且对应我机血量减少一滴;方法有move坐标改变,hitBy判断是否和我机相撞,shootBy判读是否被子弹击中

package flyplane;
import img.GetIMG;
import flyevery.Fly;

import java.util.Random;

public class EnemyPlane extends flyevery.Fly{
   private int speed;  //敌机飞来的速度
   public int blood;  // 敌机的初始血量值

   public EnemyPlane(){
       // nextInt(num),表示在[0,num)之间随机生成一个正数
       int index = new Random().nextInt(6) + 1;
       img = GetIMG.getImg("src/main/java/img/敌机"+index+".png");    //敌机们的图片
       // 飞机2的图片的大小设置-----设置为图片的大小
       w = img.getWidth();
       h = img.getHeight();
       // 设置飞机2的初始位置
       x = new Random().nextInt(480 - w);
       y = -h;
       blood = index * 2;  // 敌机的初始血量值
       // 设置敌机的速度
       speed = new Random().nextInt(15)+10;    // [10, 25)
   }
   // 敌机移动
   public void move() {
       y += speed;
   }

   //检测敌机是否和我机相撞
   public boolean hitBy(MainPlane1 he) {
       boolean hitH = x <= he.x + he.w && x >= he.x - w && y <= he.y + he.h && y >= he.y-h;
       return hitH;
   }
   public boolean hitBy(DeputyPlane2 he) {
       boolean hitH = x <= he.x + he.w && x >= he.x - w && y <= he.y + he.h && y >= he.y-h;
       return hitH;
   }

   // 检测敌机是否被子弹击中
   public boolean shootBy(Fly b) {
       boolean hit = x <= b.x + b.w && x >= b.x - w && y <= b.y + b.h && y >= b.y - h;
       return hit;
   }

}

BulletPlane1:飞机1发射的子弹,初始位置即飞机1的前方,有方法move坐标的改变;空格发射

package flyothers;
java
import img.GetIMG;

public class BulletPlane1 extends flyevery.Fly{
    public BulletPlane1(int plane1x, int plane1y)
    {
        img = GetIMG.getImg("src/main/java/img/子弹1.png");    //飞机1子弹的图片
        // 飞机1子弹的图片的大小设置-----设置为图片的大小
        w = img.getWidth();
        h = img.getHeight();

        //子弹的初始位置
        x = plane1x + 5;
        y = plane1y + 5;
    }

    //子弹移动
    public void move(){
        y -= 9;
    }
}

BulletPlane2:飞机2的子弹,初始位置即飞机2的前方,有方法move坐标的改变,鼠标按压发射

package flyothers;

import img.GetIMG;

public class BulletPlane2 extends flyevery.Fly{
    public BulletPlane2(int plane2x, int plane2y)
    {
        img = GetIMG.getImg("src/main/java/img/子弹2.png");    //飞机2子弹的图片
        // 飞机2子弹的图片的大小设置-----设置为图片的大小
        w = img.getWidth();
        h = img.getHeight();

        //子弹的初始位置
        x = plane2x + 5;
        y = plane2y + 5;
    }

    //子弹移动
    public void move(){
        y -= 9;
    }

}

Money:金钱掉落,当敌机被子弹打死后会掉落子弹。有20、50、100随机掉落,有方法move坐标改变,catchBy判断是否捡取

package flyothers;
	
import flyplane.DeputyPlane2;
import flyplane.MainPlane1;
import img.GetIMG;

import java.util.Random;

public class Money extends flyevery.Fly{
    private int money;

    public int getMoney() {
        return money;
    }

    public Money(int enemyplanex, int enemyplaney){
        int []a ={20,50,100};   //金钱面额
        // nextInt(num),表示在[0,num)之间随机生成一个正数
        int index = new Random().nextInt(3);
        money = a[index];   //金钱大小
        index++;
        img = GetIMG.getImg("src/main/java/img/金钱"+index+".jpg");    //金钱的图片
        // 金钱的图片的大小设置-----设置为图片的大小
        w = img.getWidth();
        h = img.getHeight();
        // 设置金钱的位置---敌机被消灭的位置
        x = enemyplanex;
        y = enemyplaney;

    }
    // 金币掉落移动
    public void move(){
        y += new Random().nextInt(5) + 2;
        x += new Random().nextInt(50) - 25;
    }

    public boolean catchBy(MainPlane1 plane1) {
        boolean catchMoney = x <= plane1.x + plane1.w && x >= plane1.x - w && y <= plane1.y + plane1.h && y >= plane1.y - h;
        return catchMoney;
    }
    public boolean catchBy(DeputyPlane2 plane2) {
        boolean catchMoney = x <= plane2.x + plane2.w && x >= plane2.x - w && y <= plane2.y + plane2.h && y >= plane2.y - h;
        return catchMoney;
    }
}

GamePanel:游戏面板,核心;在构造函数时,进行事件监听,键盘的按压、释放,鼠标的按压释放,根据方法myPlane进行对应的移动或攻击;paint进行可视化,画图操作;enemyPlaneEnter敌机入场;enemyPlaneMove敌机移动;plane1Shoot飞机1发射子弹;lane2Shoot飞机2发射子弹;bulletPlane1sMove飞机1发射的子弹移动;bulletPlane2sMove飞机2发射的子弹移动;attack敌机是否被子弹攻击打中;shootPlane 判断每一个子弹是否命中敌机;moneyMoveCatch金钱掉落是否被捡取;最终以一个线程运行;

package gamePlay;

import img.GetIMG;
import flyevery.Fly;
import flyothers.BulletPlane1;
import flyothers.BulletPlane2;
import flyothers.Money;
import flyplane.DeputyPlane2;
import flyplane.EnemyPlane;
import flyplane.MainPlane1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


// 核心:Java中的游戏面板: JPanel   对象序列化
public class GamePanel extends JPanel implements Serializable {
    private int moneyCnt = 0;   //记录金钱总数
    private int enemyCnt = 0;   //记录击杀敌机数量
    public int moneyCnt1 = 0;   //记录飞机1金钱总数
    public int enemyCnt1 = 0;   //记录飞机1击杀敌机数量
    public int moneyCnt2 = 0;   //记录飞机2金钱总数
    public int enemyCnt2 = 0;   //记录飞机2击杀敌机数量
    //设置游戏开关
    boolean GameOver;   // 游戏是否结束
    boolean plane1Over;   // 飞机1是否炸毁
    boolean plane2Over;   // 飞机2是否炸毁
    protected int xx, yy;   //鼠标坐标
    boolean[] mouse = {false};    //鼠标按压
    boolean[] keywords = {false, false, false, false, false}; //w s a d space
    public int getMoneyCnt() {
        return moneyCnt;
    }
    public int getEnemyCnt() {
        return enemyCnt;
    }

    public int getXx() {
        return xx;
    }

    public void setXx(int xx) {
        this.xx = xx;
    }

    public int getYy() {
        return yy;
    }

    public void setYy(int yy) {
        this.yy = yy;
    }

    // 准备工作
    BufferedImage background;   // 背景图

    public MainPlane1 plane1 = new MainPlane1();  // 创建飞机1
    public DeputyPlane2 plane2 = new DeputyPlane2();    // 创建飞机2

    public List<EnemyPlane> enemyPlanes = new ArrayList<EnemyPlane>();   // 创建敌机集合

    public List<BulletPlane1> bulletPlane1s = new ArrayList<BulletPlane1>();//创建飞机1子弹集
    public List<BulletPlane2> bulletPlane2s = new ArrayList<BulletPlane2>();//创建飞机2子弹集

    public List<Money> money = new ArrayList<Money>();   // 创建金钱集合

    // 游戏初始化
    private void init(){
        plane1 = new MainPlane1();
        plane2 = new DeputyPlane2();
        GameOver = false;
        plane1Over = false;
        plane2Over = false;
        int moneyCnt = 0;
        int enemyCnt = 0;
        int moneyCnt1 = 0;
        int enemyCnt1 = 0;
        int moneyCnt2 = 0;
        int enemyCnt2 = 0;
        enemyPlanes.clear();
        bulletPlane1s.clear();
        bulletPlane2s.clear();
        money.clear();
        repaint();  //重新绘制
    }
    // 构造函数
    public GamePanel(JFrame frame){
        //背景
        setBackground(Color.black);
        int index = new Random().nextInt(3) + 1;
        background = GetIMG.getImg("src/main/java/img/background"+index+".png"); // 背景图片

        // 事件监听器---键盘---适配器
        KeyAdapter kd = new KeyAdapter() {
            // 按压对应按键触发对应方法
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();   // 获取按下的键盘对应的按键
                if(GameOver && keyCode == KeyEvent.VK_ENTER)    init();
                else if (!GameOver && ! plane1Over){
                    // 飞机1的上下左右移动
                    if (keyCode == KeyEvent.VK_W)   keywords[0] = true;        // plane1.moveUp();
                    else if (keyCode == KeyEvent.VK_S)   keywords[1] = true;  // plane1.moveDown();
                    else if (keyCode == KeyEvent.VK_A)   keywords[2] = true;  // plane1.moveLeft();
                    else if (keyCode == KeyEvent.VK_D)   keywords[3] = true;  // plane1.moveRight();
                    // 空格飞机1攻击
                    else if (keyCode == KeyEvent.VK_SPACE) keywords[4] = true;    // plane1Shoot();

                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
                int keyCode = e.getKeyCode();
                if (keyCode == KeyEvent.VK_W)   keywords[0] = false;        // plane1.moveUp();
                else if (keyCode == KeyEvent.VK_S)    keywords[1] = false;  // plane1.moveDown();
                else if (keyCode == KeyEvent.VK_A)    keywords[2] = false;  // plane1.moveLeft();
                else if (keyCode == KeyEvent.VK_D)    keywords[3] = false;  // plane1.moveRight();
                else if (keyCode == KeyEvent.VK_SPACE)  keywords[4] = false;    // plane1Shoot();
            }

        };


        frame.addKeyListener(kd);   // 将适配器加入到窗体的监听器中0

        // 事件监听器---鼠标---适配器
        MouseAdapter adapter = new MouseAdapter() {
            // 飞机2跟着鼠标移动
            @Override
            public void mouseDragged(MouseEvent e) {
                xx = e.getX();
                yy = e.getY();
            }
            @Override
            public void mouseMoved(MouseEvent e) {
                xx = e.getX();
                yy = e.getY();
            }

            // 按压鼠标飞机2发射子弹
            @Override
            public void mousePressed(MouseEvent e) {
                mouse[0] = true;
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                mouse[0] = false;
            }

            // 点击鼠标左键
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON1);
            }


        };
        //将鼠标适配器加入到监听器中
        addMouseListener(adapter);
        addMouseMotionListener(adapter);

    }

    // 画图---Graphics g 画笔
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        // 在画背景的时候改变图片大小
        // g.drawImage(图片,图片的横坐标,图片的纵坐标,图片的宽度,图片的高度,null);
        g.drawImage(background, 0, 0, null);
        g.drawImage(background, 480, 0, null);

        // 画飞机---在paint中画图是有顺序的,先画的会被后画的覆盖
        if (!plane1Over)
            g.drawImage(plane1.img, plane1.x, plane1.y, plane1.w, plane1.h, null);
        if (!plane2Over)
            g.drawImage(plane2.img, plane2.x, plane2.y, plane2.w, plane2.h, null);

        for (int i = 0; i < enemyPlanes.size(); i++) {
            EnemyPlane enemyplane = enemyPlanes.get(i);
            g.drawImage(enemyplane.img, enemyplane.x, enemyplane.y, enemyplane.w, enemyplane.h, null);
        }
        // 画子弹
        for (int i = 0; i < bulletPlane1s.size(); i++){
            BulletPlane1 bulletPlane1 = bulletPlane1s.get(i);
            g.drawImage(bulletPlane1.img, bulletPlane1.x, bulletPlane1.y, bulletPlane1.w, bulletPlane1.h, null);
        }
        for (int i = 0; i < bulletPlane2s.size(); i++){
            BulletPlane2 bulletPlane2 = bulletPlane2s.get(i);
            g.drawImage(bulletPlane2.img, bulletPlane2.x, bulletPlane2.y, bulletPlane2.w, bulletPlane2.h, null);
        }

        // 画金钱
        for (int i = 0; i < money.size(); i++){
            Money money1 = money.get(i);
            g.drawImage(money1.img, money1.x, money1.y, money1.w, money1.h, null);
        }


        // 画飞机1、2的血量
        for (int i = 0; i < plane1.getBlood(); i++){
            g.drawImage(plane1.img,300+i*35,5,30,30,null);
        }
        for (int i = 0; i < plane2.getBlood(); i++){
            g.drawImage(plane2.img,300+i*35,30,30,30,null);
        }
        //画内容
        g.setColor(Color.white);
        g.setFont(new Font("楷体",Font.BOLD,15));
        g.drawString("金钱:"+moneyCnt,13,30);
        g.drawString("击杀数:"+enemyCnt,13,45);
        g.drawString("飞机1金钱:"+moneyCnt1,13,60);
        g.drawString("飞机1击杀数:"+enemyCnt1,13,75);
        g.drawString("飞机2金钱:"+moneyCnt2,13,90);
        g.drawString("飞机2击杀数:"+enemyCnt2,13,105);

        g.setColor(Color.red);
        g.setFont(new Font("楷体",Font.BOLD,15));
        g.drawString("飞机1血量:",250,25);
        g.drawString("飞机2血量:",250,50);

        //当游戏结束时,画出GameOver
        if(GameOver) {
            g.setColor(Color.WHITE);
            g.setFont(new Font("黑体", Font.BOLD, 40));
            g.drawString("游戏结束 Game Over!!", 105, 300);
            g.setColor(Color.BLACK);
            g.setFont(new Font("楷体",Font.BOLD,20));
            g.drawString("enter再次开始游戏",100,350);
        }


    }

    // 对应事件监听器操作
    protected void myPlane(){
        if (!plane2Over){
            plane2.moveToMouse(xx, yy);
            plane2.x = xx;
            plane2.y = yy;
        }
        if (mouse[0])   plane2Shoot();
        if (keywords[0])    plane1.moveUp();
        if (keywords[1])    plane1.moveDown();
        if (keywords[2])    plane1.moveLeft();
        if (keywords[3])    plane1.moveRight();
        if (keywords[4])    plane1Shoot();
        repaint();  //要刷新页面,将飞机2重新绘制到新的位置上
    }

    // 敌机入场-------每执行12次,创建一个敌机
    int t = 0;
    protected void enemyPlaneEnter(){
        t++;
        if (t >= 12){
            EnemyPlane enemyPlane = new EnemyPlane();
            enemyPlanes.add(enemyPlane);
            t = 0;
        }
    }

    // 敌机集合移动
    protected void enemyPlaneMove(){
        for (int i = 0; i < enemyPlanes.size(); i++){
            EnemyPlane enemyPlane = enemyPlanes.get(i);
            enemyPlane.move();
        }
    }

    // 发射子弹----每执行3次发射
    int bulletPlane1Num = 0;
    protected  void plane1Shoot(){
        bulletPlane1Num ++;
        if (bulletPlane1Num > 2){
            BulletPlane1 bulletPlane1 = new BulletPlane1(plane1.x, plane1.y);
            BulletPlane1 bulletPlane12 = new BulletPlane1(plane1.x + 40, plane1.y);
            BulletPlane1 bulletPlane13 = new BulletPlane1(plane1.x + 80, plane1.y);
            bulletPlane1s.add(bulletPlane1);
            bulletPlane1s.add(bulletPlane12);
            bulletPlane1s.add(bulletPlane13);

            bulletPlane1Num = 0;
        }
    }

    int bulletPlane2Num = 0;
    protected  void plane2Shoot(){
        bulletPlane2Num ++;
        if (bulletPlane2Num > 1){
            BulletPlane2 bulletPlane2 = new BulletPlane2(plane2.x, plane2.y);
            BulletPlane2 bulletPlane22 = new BulletPlane2(plane2.x + 36, plane2.y);
            bulletPlane2s.add(bulletPlane2);
            bulletPlane2s.add(bulletPlane22);
            bulletPlane2Num = 0;
        }
    }

    // 子弹集合移动
    protected void bulletPlane1sMove(){
        for(int i = 0; i < bulletPlane1s.size(); i++){
            BulletPlane1 bulletPlane1 = bulletPlane1s.get(i);
            bulletPlane1.move();
        }
    }

    protected void bulletPlane2sMove(){
        for(int i = 0; i < bulletPlane2s.size(); i++){
            BulletPlane2 bulletPlane2 = bulletPlane2s.get(i);
            bulletPlane2.move();
        }
    }

    // 子弹是否打中敌机
    protected void attack(Fly bullet){
        if (!(bullet instanceof BulletPlane1) && !(bullet instanceof BulletPlane2))  return;
        for (int i = 0; i < enemyPlanes.size(); i++){
            EnemyPlane enemyPlane = enemyPlanes.get(i);

            if (enemyPlane.shootBy(bullet)) {
                enemyPlane.blood--;
                if (enemyPlane.blood <= 0){
                    if (bullet instanceof BulletPlane1) enemyCnt1++;
                    else enemyCnt2++;
                    int x = enemyPlane.x;
                    int y = enemyPlane.y;
                    enemyPlanes.remove(enemyPlane);
                    enemyCnt++;
                    money.add(new Money(x, y));
                }
                if (bullet instanceof BulletPlane1) bulletPlane1s.remove(bullet);
                else bulletPlane2s.remove(bullet);
            }

        }
    }
    protected void shootPlane(){
        for (int i = 0; i < bulletPlane1s.size(); i++){
            BulletPlane1 bulletPlane1 = bulletPlane1s.get(i);
            attack(bulletPlane1);
        }
        for (int i = 0; i < bulletPlane2s.size(); i++){
            BulletPlane2 bulletPlane2 = bulletPlane2s.get(i);
            attack(bulletPlane2);
        }
    }

    // 金钱掉落---是否被捡取
    protected void moneyMoveCatch(){
        for (int i = 0; i < money.size(); i++){
            Money m = money.get(i);
            m.move();
            if (m.catchBy(plane1)){
                m.move();
                moneyCnt += m.getMoney();
                moneyCnt1 += m.getMoney();
                money.remove(m);
            }
            else if (m.catchBy(plane2)){
                m.move();
                moneyCnt += m.getMoney();
                moneyCnt2 += m.getMoney();
                money.remove(m);
            }
        }
    }

    // 敌机撞到后,我机掉血
    protected void hit(){
        for (int i = 0; i < enemyPlanes.size(); i++){
            EnemyPlane enemyPlane = enemyPlanes.get(i);
            if (!plane1Over && enemyPlane.hitBy(plane1)){
                enemyPlanes.remove(enemyPlane);
                plane1.setBlood(plane1.getBlood()-1);
                enemyCnt++;
                enemyCnt1++;
                if (plane1.getBlood() <= 0) plane1Over = true;
            }
            else if (!plane2Over && enemyPlane.hitBy(plane2)){
                enemyPlanes.remove(enemyPlane);
                plane2.setBlood(plane2.getBlood()-1);
                enemyCnt++;
                enemyCnt2++;
                if (plane2.getBlood() <= 0) plane2Over = true;
            }
            if (plane1Over && plane2Over) GameOver = true;
        }
    }




    // 开始游戏---创建线程
    public void start(){
        Runnable r = ()->{
            while (true) {
                try {
                    if (!GameOver) {
                        myPlane();
                        enemyPlaneEnter();
                        enemyPlaneMove();
                        bulletPlane1sMove();
                        bulletPlane2sMove();
                        shootPlane();
                        moneyMoveCatch();
                        hit();
                    }
                    Thread.sleep(50);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //重绘,刷新画布
                repaint();
            }
        };
        new Thread(r).start();

    }
}

游戏的窗体(固定的模式)
Java中的窗体类:JFrame
自定义窗体步骤:
1、写一个类,继承JFrame
2、写一个构造方法,初始化窗体的属性
属性对应特点,方法对应行为

package gamePlay;

import javax.swing.*;
import java.awt.*;
import java.io.Serializable;


public class GameFrame extends JFrame implements Serializable{
    private static final long serialVersionUID = 1;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    /*
        构造方法:方法名和类名一样
        构造方法的作用:如同模具,给对象定型
         */
    public GameFrame(){
        //设置标题 方法源于JFrame类
        setTitle("飞机对战");
        //设置大小  setSize(宽度,高度)
        setSize(500,740);
        //设置居中显示  null表示相对与屏幕左上角居中
        setLocationRelativeTo(null);
        //设置不允许玩家改变界面大小
        setResizable(false);
        //设置默认的关闭选项
        //关闭窗体时推出程序
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        //创建窗体对象:调用窗体的构造方法,制作窗体
        GameFrame frame = new GameFrame();
        //创建面板对象:调用面板 构造方法,制作面板
        GamePanel panel =new GamePanel(frame);  //方便在面板中添加键盘监听器

        //调用启动游戏的方法
        panel.start();

        //将面板加入到窗体中
        frame.add(panel);
        //显示窗体 true 显示, false 隐藏
        frame.setVisible(true);
    }
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-18 23:34:08  更:2022-06-18 23:35:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:22:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码