飞机大战 (递归版)

import java.awt.Color;
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 javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fight extends JPanel {
    public static final int H= 1000;
    public static final int W=(int)(1.618*H);

    public static BufferedImage beeImg;
    public static BufferedImage devilImg;
    public static BufferedImage bossImg;
    public static BufferedImage bulletImg;
    public static BufferedImage hero0Img;
    public static BufferedImage hero1Img;
    public static BufferedImage startImg;
    public static BufferedImage stopImg;
    public static BufferedImage dieImg;
    static {
        try{
            devilImg   =ImageIO.read(Fight.class.getResourceAsStream("Image/devil.jpg"));
            bossImg   =ImageIO.read(Fight.class.getResourceAsStream("Image/boss.jpg"));
            bulletImg     =ImageIO.read(Fight.class.getResourceAsStream("Image/bullet.jpg"));
            beeImg        =ImageIO.read(Fight.class.getResourceAsStream("Image/bee.png"));
            hero0Img      =ImageIO.read(Fight.class.getResourceAsStream("Image/hero0.png"));
            hero1Img      =ImageIO.read(Fight.class.getResourceAsStream("Image/hero1.png"));
            startImg      =ImageIO.read(Fight.class.getResourceAsStream("Image/start.jpg"));
            stopImg      =ImageIO.read(Fight.class.getResourceAsStream("Image/stop.jpg"));
            dieImg      =ImageIO.read(Fight.class.getResourceAsStream("Image/die.jpg"));
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    int scroe=0;
    int state=0;     // 0开始界面, 1暂停, 2运行游戏
    int level=1;    // 等级
    Flies hero;        // 英雄   + 子弹
    Flies boss;        // boss + 敌机
    Flies beeK;        // 蜂王   + 工蜂

    Fight(){
        new FightThread().start();//启动线程
        this.addMouseMotionListener(l);
        this.addMouseListener(l);
    }
    MouseAdapter l=new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e){
            if(state==0 || hero.life==0  ) {
                state=2;
                hero =new Flies(W/2-32, H-64,  128, 128, 0, 0, -1, 1, 1, 0, 10);
                boss  =new Flies(-1 ,      0,  128, 128, 0, 0,  1, 1, 1, 0, 30);
                beeK  =new Flies(-1 ,      0,  128, 128, 0, 0,  1, 1, 1, 0, 50);
                beeK.vis=boss.vis=false;
                scroe=100;
            }
        }
        public void mouseMoved(MouseEvent e) {
            if(state==2){
                hero.x=e.getX()- hero.w/2;
                hero.y=e.getY()- hero.h/2;
            }
        }
        @Override
        public void mouseEntered(MouseEvent e) {
            if(state==1) state=2;
        }
        @Override
        public void mouseExited(MouseEvent e) {
            if(state==2) state=1;
        }
    };

    public void paint(Graphics g){
        super.paint(g);
        if(state==0){
            g.drawImage(startImg, 0,0,W,H, null);
            paintStr(g, "Play", Color.gray, 40, 60, H/2+30);
        }
        else if(state==1) {
            g.drawImage(stopImg, 0,0,W,H, null);
            paintStr(g, "暂停", Color.gray, 40, W-140, H/2);
        }
        else if(state==2){
            paintStr(g, "得分:"+scroe, Color.black, 20, 5, H-20);
            paintStr(g, "life:"+hero.life, Color.black, 20, W-150, H-20);
            if(boss.vis) paintStr(g, "Bosslife:"+boss.life, Color.gray, 20, 10, 20);
            if(hero.life==0){
                g.drawImage(dieImg, 0,0,W,H, null);
                paintStr(g, "HEROES NEVER DIE", Color.black, 60, 0,300);
                paintStr(g, "Click replay", Color.black, 60,   230, 350);

            }
            else {
                paintFlies(g, hero, hero0Img, bulletImg);
                paintFlies(g, boss, bossImg, devilImg);
                paintFlies(g, beeK, beeImg, beeImg);
            }
        }else if(state==3){
            paintStr(g, "Win", Color.red, 100, W/2-80, H/2);
        }
    }

    public void paintStr(Graphics g, String str, Color col, int siz, int x, int y){
        Font font=new Font("宋体", Font.BOLD , siz);
        g.setFont(font);
        g.setColor(col);
        g.drawString(str, x, y);
   }
    //递归输出
    public void paintFlies(Graphics g, Flies x, BufferedImage FatherImg, BufferedImage SonImg){
           if(x.vis && x.life>0){
                if(x.depth==0) g.drawImage(SonImg , x.x, x.y, x.w, x.h, null);
                else g.drawImage(FatherImg , x.x, x.y, x.w, x.h, null);
           }
           for(Flies y : x.SonList)
               paintFlies(g, y, FatherImg, SonImg);
   }
    class FightThread extends Thread{
        public void run(){
            while(true){
                //改变坐标
                if(state==2 && hero.life>0){
                    hero.Split();
                    boss.Split();
                    beeK.Split();
                    Shot(beeK, hero, 1);
                    Shot(boss, hero, -1);
                    if(level==28){
                        boss.vis=true;
                    }
                    if(boss.life<=0) state=3;
                }
                //重绘
                repaint();
                //休眠
                try{
                    Thread.sleep(10);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
        void Shot(Flies a, Flies b,int t){
            //a与b是否碰撞
            if(a.vis && b.vis && a.life>0 && b.life>0)
            if(a.x+a.w/2>=b.x && a.x+a.w/2<=b.x+b.w)
                if(a.y<=b.y+b.h && a.y >= b.y){
                    if(a.life>=b.life) { a.life=a.life-b.life; b.life=0; }
                    else { b.life=b.life-a.life; a.life=0; }
                    //题为标志变量,-1为杀死敌机,非-1为杀死工蜂
                    if(t==-1) {
                        scroe++;
                        if(scroe>=level*4 &&level<29) {
                            boss.upgrade(++level);
                            hero.upgrade(level);
                        }
                    }
                    else {
                        hero.Switch();
                    }
                }
            //b与a的孩子是否碰撞
            for(Flies c : a.SonList)
                Shot(c, b, t);
            //a与b的孩子是否碰撞
            for(Flies c : b.SonList)
                Shot(c, a, t);
        }
    }

    public static void main(String[] args) {
        JFrame jfr =new JFrame("打飞机");
        jfr.setSize(W+15, H+38);
        Fight jpa=new Fight();
        jfr.add(jpa);
        jfr.setAlwaysOnTop(true);
        jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfr.setLocationRelativeTo(null);
        jfr.setVisible(true);
    }
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Flies{
    protected boolean vis=true;     // 是否可绘标志
    protected boolean RandX=false;  // 出生时 横坐标是否随机标志
    protected int x, y, bornX;        // 坐标 , bornX是出生是的x坐(为了按照给定的函数运动,初始点会参与计算)
    protected int w, h;                // 大小
    protected int Vx, Vy;            // 横,纵坐标轴飞行速度
    protected int dir;                // 方向:向上或向下
    protected int way=0;            // 子弹运动方式

    protected int time=0;            // 计时器
        //    根据等级改变的量
        protected int life;            // 生命
        protected int breadth,depth;// Son广度 ,Son深度
        protected int Tshot=30;        // 如果有Son, 其生成时间间隔

    protected List<Flies> SonList=new ArrayList<Flies>();;  // Son表单
    //构造函数初始化新生飞机
    Flies(int x, int y, int w, int h, int Vx,int Vy, int dir, int depth,int breadth, int way, int Tshot){
        Random rand=new Random();
        if(x==-1) { this.x=rand.nextInt(Fight.W-10)+10; RandX=true; }
        else this.x=x;
        this.bornX=this.x;
        this.y=y;
        this.w=w;
        this.h=h;
        this.Vx=Vx;
        this.Vy=Vy;
        this.dir=dir;
        this.depth=depth;
        this.life=w*h;
        this.breadth=breadth;
        this.way = way;
        this.Tshot=Tshot;
    }

    void Split(){
        int maxV=1000;        //速度上限
                time++;
                // 1.先运动。运动方式可以随心所欲,这里假设Vy受加速度为1,速度上限maxV
                y=y+Vy;
        x=x+Vx;
                if(depth==0 && Vy<=maxV && Vy>=-maxV) Vy=Vy+(Vy<0?-1:1);
                //2.判断是否出界,出界及死亡,然后删除生命值0且孙子飞行物个数为0 的子飞行物
                if(vis && (y+h<0 || y>Fight.H)) life = 0;
                for(int i=0;i<SonList.size();i++)
                if(SonList.get(i).life==0 && SonList.get(i).SonList.size()==0)
                    SonList.remove(i--);

                //3.生成子飞行物
                if(time>=Tshot && life > 0 && depth > 0){
                    time=0;
                    for(int i=1;i<=breadth;i++){
                        SonList.add(new Flies(
                            RandX ? -1 : (x+w/2-w/8),  y,    //纵坐标固定
                            w/4, h/4,                             //假设子大小为父大小16分之一
                            Vx+(breadth/2-i+(breadth%2==1?1:(breadth/2>=i?1:0))),
                            Vy+dir, dir, depth-1, breadth, way, Tshot ));
                    }
                }

        //4.递归:子飞行物生成孙子飞行物
                for(Flies x: SonList)
                    if(x.life>0) x.Split();
    }
    // 升级函数
    void upgrade(int level){
        life=life+1000;
        Tshot=30-level/2;
        depth=level/29+1;
        if(level==29) breadth=5;
        else breadth=level/5+1;
    }
    void Switch(){
        way++;
        way=way%2;
    }

    // 横坐标运动函数
     int fun(int way){
         if(way==1) return (int)(Math.sin(3.14*2/(400/breadth)*y)*(breadth-1)*4)+Vx+x;
         return x+Vx;
     }
}

原文地址:https://www.cnblogs.com/indefinite/p/11006915.html

时间: 2024-10-09 00:02:08

飞机大战 (递归版)的相关文章

cocos2dx之飞机大战简单版(1)

先说下版本   vs2010+cocos2dx2.2 本章主要是告诉大家如何实现创建背景.飞机.***精灵,并且然后他们动起来,然后做一个碰撞测试,当***和敌方飞机碰撞时就销毁精灵并且加一个爆炸的精灵. 创建背景.飞机.***精灵 先在GameScene.h中添加以下成员 GameScene(); ~GameScene(); void addMonster(); void addBullet1(); void GameLogic(float dt); void GameLogicaddBull

Unity 飞机大战增强版

简介: 感谢: 本应用使用<Unity3D\2D手机游戏开发>提供的资源,版权归属其作者,在此感谢作者.此应用时基于原作的二次开发. 增强要素: 1.加入2s cd的机身旋转,旋转时保持无敌状态,人挡杀人... 2.加入0,5s cd的跟踪导弹,导弹随机打击目标敌人. 3.加强小飞机AI,小飞机拥有三种飞行模式,直线,sin曲线,以及追踪玩家.以不同概率随机选择飞行模式. 技术要素: 1.对于玩家飞机,采用简单switch-case有限状态机. 2.对于小飞机AI则使用RAIN AI 行为树.

豪华版飞机大战系列(一)

鉴于最近在学习cocos2d-x开发手游,对于学习过程中的一些东西做个总结,也记录下学习历程,同时分享些项目源码来和大家一起学习. 第一次写系列教程,可能中间有疏漏的,看到的还请给提个醒,不好的也多多吐槽,以便自己能更好的以后的开发中基类经验. 此次教程分享下豪华版的飞机大战,老规矩,先上图: 介绍下开发环境:cocos2d-x3.2 alpha + Ubuntu14.04 + eclipse + 命令行终端 + android 用的引擎为3.2版本的,3.0以上的应该都能运行跑下来,windo

Python版飞机大战

前面学了java用java写了飞机大战这次学完python基础后写了个python版的飞机大战,有兴趣的可以看下. 父类是飞行物类是所有对象的父类,setting里面是需要加载的图片,你可以换称自己的喜欢的图片,敌机可以分为敌机和奖励,enemy为普通敌人的父类,award为奖励敌机的父类. 各个类的基本属性 主类的大概逻辑 具体的代码: settings配置 import pygame class Settings(object): """设置常用的属性"&quo

web版canvas做飞机大战游戏 总结

唠唠:两天的时间跟着做了个飞机大战的游戏,感觉做游戏挺好的.说是用html5做,发现全都是js.说js里一切皆为对象,写的最多的还是函数,都是函数调用.对这两天的代码做个总结,希望路过的大神指点一下,我对这个游戏的思路,可改进优化的代码. 先说一下游戏的基本内容: 打飞机(不要想歪了),有鼠标控制移动英雄机,子弹自动射击:敌机从上而下,有三种敌机: 先说下HTML代码(主要就是这一行): <canvas id="canFly" width="480" heig

飞机大战原生代码版

飞机大战需要背景图,飞机,子弹,敌机 下面写的是css代码实现子弹的运动 for (var i = 0; i < this.objB.arr.length; i++) { var newArr = this.objB.arr[i].split('|');//[id|top|left] var eleB = document.getElementById(newArr[0]); newArr[1] = parseInt(newArr[1]) - 1; //将上一个的newArr1减1并赋值 //

[知了堂学习笔记]_纯JS制作《飞机大战》游戏_第1讲(实现思路与游戏界面的实现)

整体效果展示: 一.实现思路 如图,这是我完成该项目的一个逻辑图,也是一个功能模块完成的顺序图. 游戏界面的完成 英雄飞机对象实现,在实现发射子弹方法过程中,又引出了子弹对象并实现.在此时,英雄飞机能进行基本操作了. 敌机对象的实现,并且初步完成了boos出现(30s自动出现).然后又引出了许多方法的处理,如英雄子弹击中敌机和boos,英雄与敌机相撞等等.并一一解决. 随后又设置了一些游戏的参数,如血量,关卡数,等级,积分,必杀,道具对象等等. 最后又完成了一些辅助功能,暂停游戏,继续游戏,退出

Cocos2d-x飞机大战教程笔记

咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ 2014/4/22  Day01 从apk解压获取素材.再用TexturePacker拼接成plist和png. 话说TexturePacker是收费的啊...7天免费,还能够申请1年的使用期. 之前看书还看到有个神器叫zwoptex,貌似是免费的.可惜仅仅有Mac版...╮(╯_╰)╭Howev

Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

看到cocos2d-x推出了3.1版本,真是每月一次新版本,速度, 还有一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!!! 本文介绍一款纵版射击游戏的实现,开发环境: win7 vs2012 cocos2d-x3.0final android adt android ndk r9 首先看下最后的效果: (图1,微信飞机大战运行效果) 源码下载地址:http://download.csdn.net/detail/sdhjob/7513

[U3D Demo] 手机飞机大战

游戏截图 使用插件 DOTween NGUI 游戏介绍 游戏使用C#开发,素材是<全民飞机大战>中提取出来的,该游戏最早是去年由Flash Air+Starling开发的Demo,后来我修改了一版使用Unity3D开发的Demo,现在的Demo是第二个版本,是在上一版的基础上添加了大量的细节得到的完整游戏Demo.