【Java】Java小游戏之Shoot游戏源码及详解

【Java】Java小游戏之Shoot游戏源码及详解


Shoot游戏是模仿微信中打飞机小游戏,这个游戏虽然简单,但通过这个游戏小项目,可以练习很多小的知识点,提高对面向对象的理解,还能提高逻辑思维能力。总之,好处多多,下面我将对游戏的结构及代码进行详细说明:

游戏运行状态界面:

1)游戏中类的结构图:

2)游戏步骤01:

1.class FlyingObject{
    image,width,height,x,y
  }
2.interface Enemy{
    int getScore();
  }
3.interface Award{
    DOUBLE_FILE,LIFE
    int getType();
  }
4.class Airplane extends 1 implements 2{
    speed
    Airplane(){}
    重写getScore()
  }
5.class Bee extends 1 implements 3{
    xSpeed,ySpeed,awardType
    Bee(){}
    重写getType()
  }
6.class Bullet extends 1{
    speed
    Bullet(int x,int y){}
  }
7.class Hero extends 1{
    life,doubleFire,images,index
    Hero(){}
  }
8.class ShootGame extends JPanel{
    WIDTH,HEIGHT
    background,start,pause,gameover
    airplane,bee,bullet,hero0,hero1
    hero(Hero)
    flyings(FlyingObject[])
    bullets(Bullet[])
    ShootGame(){初始化对象}
    static{}
    重写paint(g){
       画背景图
       paintHero(g);
       paintFlyingObjects(g);
       paintBullets(g);
    }
    paintHero(g){} //画英雄机
    paintFlyingObjects(g){} //画敌人
    paintBullets(g){} //画子弹
    main(){
      ...
      frame.setVisible(true);
    }
  }

3)游戏步骤02:

1.敌人入场的实现步骤:
  1)main(){ game.action(); }
  2)action(){
      ...
      run(){ //10毫秒定时执行
        enteredAction(); //敌人入场
	repaint();
      }
    }
  3)int index = 0;
    enteredAction(){ //10毫秒
      index++;
      if(index%40==0){  //40*10毫秒
        FlyingObject one = nextOne(); //创建一个敌人对象
        flyings = Arrays.copyOf(flyings,flyings.length+1); //扩容
        flyings[flyings.length-1] = one; //将敌人对象添加到敌人数组中
      }
    }
  4)nextOne(){
      生成0到19间的随机数
      为0时return new Bee();
      否则return new Airplane();
    }
2.飞行物走一步的实现步骤:
  1)FlyingObject----抽象方法step();
  2)Airplane,Bee,Bullet,Hero---重写step()
  3)action(){
      run(){
        enterAction();
	stepAction();
	repaint(); //重画
      }
    }
  4)stepAction(){
      遍历所有敌人,调用step()
      遍历所有子弹,调用step()
      hero.step();
    }
3.子弹入场的实现步骤:
  1)Hero---shoot()英雄机发射子弹
  2)action(){
      run(){
        ...
	shootAction(); //发射子弹
	repaint();
      }
    }
  3)int shootIndex = 0;
    shootAction(){ //10毫秒走一次
      shootIndex++;
      if(shootIndex%30==0){ //300毫秒
        调用Hero的shoot()得到发射出的子弹数组bs
	将bullets扩容
	将bs追加到bullets数组中--System.arraycopy()
      }
    }
4.英雄机随着鼠标移动的实现步骤:
  1)Hero---moveTo(int x,int y)
  2)action(){
      MouseAdapter l = new MouseAdapter(){
         重写MouseMoved(){
	   获取鼠标的x和y
	   hero.moveTo(x,y); //移动
	 }
      };
      this.addMouseMotionListener(l);
      this.addMouseListener(l);
      run(){
        ...
      }
    }
5.子弹和敌人碰撞的实现步骤:
  1)FlyingObject---shootBy(Bullet b)
  2)Hero----addDoubleFire(),addLife()
  3)action(){
      run(){
        ...
	bangAction(); //检查碰撞
	repaint();
      }
    }
  4)bangAction(){
      遍历所有子弹,将子弹传给bang()方法
    }
  5)bang(Bullet b){ //1发子弹与所有敌人撞
      遍历所有敌人,获取每一个敌人f
      判断f是否与b撞上了
      若撞上了:
        5.1)得分或得奖励
	      5.1.1)得到被撞敌人对象
	      5.1.2)判断是敌人还是奖励
	             若是敌人则增分
		     若是奖励则得奖励类型
		       判断不同的奖励类型:
		         增命或增火力值
	5.2)将被撞对象从flyings中删除
	    5.2.1)将被撞敌人与最后一个元素交换(追尾并绕圈)
	    5.2.2)缩容---删除最后一个元素(被撞的对象)
    }

4)游戏步骤03:

1.画分和画命的实现步骤:
  1)hero---getLife()获取命
  2)paint(g){
      ......
      paintScore(g); //画分和命
    }
  3)paintScore(g){
      设置颜色g.setColor(...)
      设置字体g.setFont(...)
      画分g.drawString(...);
      画命g.drawString(...);
    }
2.删除越
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值