收藏 分享(赏)

java项目实战——Java打飞机小游戏(附完整源码).docx

上传人:dreamzhangning 文档编号:2783800 上传时间:2018-09-27 格式:DOCX 页数:18 大小:167.37KB
下载 相关 举报
java项目实战——Java打飞机小游戏(附完整源码).docx_第1页
第1页 / 共18页
java项目实战——Java打飞机小游戏(附完整源码).docx_第2页
第2页 / 共18页
java项目实战——Java打飞机小游戏(附完整源码).docx_第3页
第3页 / 共18页
java项目实战——Java打飞机小游戏(附完整源码).docx_第4页
第4页 / 共18页
java项目实战——Java打飞机小游戏(附完整源码).docx_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、摘要: 写在前面 技术源于分享,所以今天抽空把自己之前用 java 做过的小游戏整理贴出来给大家参考学习。java 确实不适合写桌面应用,这里只是通过这个游戏让大家理解 oop 面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。写在前面技术源于分享,所以今天抽空把自己之前用 java 做过的小游戏整理贴出来给大家参考学习。java 确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop 面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。完整代码敌飞机import ja

2、va.util.Random;敌飞机: 是飞行物,也是敌人public class Airplane extends FlyingObject implements Enemy private int speed = 3; /移动步骤/* 初始化数据 */public Airplane()this.image = ShootGame.airplane;width = image.getWidth();height = image.getHeight();y = -height; Random rand = new Random();x = rand.nextInt(ShootGame.WIDT

3、H - width);/* 获取分数 */Overridepublic int getScore() return 5;/* /越界处理 */Overridepublic boolean outOfBounds() return yShootGame.HEIGHT;/* 移动 */Overridepublic void step() y += speed;分数奖励/* * 奖励 */ public interface Award int DOUBLE_FIRE = 0; /双倍火力 int LIFE = 1; /1 条命 /* 获得奖励类型(上面的 0 或 1) */ int getType(

4、); 蜜蜂import java.util.Random; /* 蜜蜂 */ public class Bee extends FlyingObject implements Award private int xSpeed = 1; /x 坐标移动速度 private int ySpeed = 2; /y 坐标移动速度 private int awardType; /奖励类型 /* 初始化数据 */ public Bee() this.image = ShootGame.bee; width = image.getWidth(); height = image.getHeight(); y

5、= -height; Random rand = new Random(); x = rand.nextInt(ShootGame.WIDTH - width); awardType = rand.nextInt(2); /初始化时给奖励 /* 获得奖励类型 */ public int getType() return awardType; /* 越界处理 */ Override public boolean outOfBounds() return yShootGame.HEIGHT; /* 移动,可斜着飞 */ Override public void step() x += xSpeed

6、; y += ySpeed; if(x ShootGame.WIDTH-width) xSpeed = -1; if(x 0) /双倍火力 Bullet bullets = new Bullet2; bullets0 = new Bullet(x+xStep,y-yStep); /y-yStep(子弹距飞机的位置 ) bullets1 = new Bullet(x+3*xStep,y-yStep); return bullets; else /单倍火力 Bullet bullets = new Bullet1; bullets0 = new Bullet(x+2*xStep,y-yStep);

7、 return bullets; /* 移动 */ Override public void step() if(images.length0) image = imagesindex+/10%images.length; /切换图片 hero0,hero1 /* 碰撞算法 */ public boolean hit(FlyingObject other) int x1 = other.x - this.width/2; /x 坐标最小距离 int x2 = other.x + this.width/2 + other.width; /x 坐标最大距离 int y1 = other.y - t

8、his.height/2; /y 坐标最小距离 int y2 = other.y + this.height/2 + other.height; /y 坐标最大距离 int herox = this.x + this.width/2; /英雄机 x 坐标中心点距离 int heroy = this.y + this.height/2; /英雄机 y 坐标中心点距离 return heroxx1 /区间范围内为撞上了 游戏启动主类如果你想学习 java 可以来这个群,首先是 532,中间是 259,最后是 952,里面可以学习和交流,也有资料可以下载。import java.awt.Font;

9、import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax

10、.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; /* Java 学习交流 QQ 群:532259952 我们一起学 Java!*/public class ShootGame extends JPanel public static final int WIDTH = 400; / 面板宽 public static final int HEIGHT = 654; / 面板高 /* 游戏的当前状态: START RUNNING PAUSE GAME_OVER */ private int state

11、; private static final int START = 0; private static final int RUNNING = 1; private static final int PAUSE = 2; private static final int GAME_OVER = 3; private int score = 0; / 得分 private Timer timer; / 定时器 private int intervel = 1000 / 100; / 时间间隔(毫秒) public static BufferedImage background; public

12、static BufferedImage start; public static BufferedImage airplane; public static BufferedImage bee; public static BufferedImage bullet; public static BufferedImage hero0; public static BufferedImage hero1; public static BufferedImage pause; public static BufferedImage gameover; private FlyingObject f

13、lyings = ; / 敌机数组 private Bullet bullets = ; / 子弹数组 private Hero hero = new Hero(); / 英雄机 static / 静态代码块,初始化图片资源 try background = ImageIO.read(ShootGame.class .getResource(“background.png“); start = ImageIO.read(ShootGame.class.getResource(“start.png“); airplane = ImageIO .read(ShootGame.class.getRe

14、source(“airplane.png“); bee = ImageIO.read(ShootGame.class.getResource(“bee.png“); bullet = ImageIO.read(ShootGame.class.getResource(“bullet.png“); hero0 = ImageIO.read(ShootGame.class.getResource(“hero0.png“); hero1 = ImageIO.read(ShootGame.class.getResource(“hero1.png“); pause = ImageIO.read(Shoot

15、Game.class.getResource(“pause.png“); gameover = ImageIO .read(ShootGame.class.getResource(“gameover.png“); catch (Exception e) e.printStackTrace(); /* 画 */ Override public void paint(Graphics g) g.drawImage(background, 0, 0, null); / 画背景图 paintHero(g); / 画英雄机 paintBullets(g); / 画子弹 paintFlyingObject

16、s(g); / 画飞行物 paintScore(g); / 画分数 paintState(g); / 画游戏状态 /* 画英雄机 */ public void paintHero(Graphics g) g.drawImage(hero.getImage(), hero.getX(), hero.getY(), null); /* 画子弹 */ public void paintBullets(Graphics g) for (int i = 0; i bullets.length; i+) Bullet b = bulletsi; g.drawImage(b.getImage(), b.ge

17、tX() - b.getWidth() / 2, b.getY(), null); /* 画飞行物 */ public void paintFlyingObjects(Graphics g) for (int i = 0; i flyings.length; i+) FlyingObject f = flyingsi; g.drawImage(f.getImage(), f.getX(), f.getY(), null); /* 画分数 */ public void paintScore(Graphics g) int x = 10; / x 坐标 int y = 25; / y 坐标 Fon

18、t font = new Font(Font.SANS_SERIF, Font.BOLD, 22); / 字体 g.setColor(new Color(0xFF0000); g.setFont(font); / 设置字体 g.drawString(“SCORE:“ + score, x, y); / 画分数 y=y+20; / y 坐标增 20 g.drawString(“LIFE:“ + hero.getLife(), x, y); / 画命 /* 画游戏状态 */ public void paintState(Graphics g) switch (state) case START:

19、/ 启动状态 g.drawImage(start, 0, 0, null); break; case PAUSE: / 暂停状态 g.drawImage(pause, 0, 0, null); break; case GAME_OVER: / 游戏终止状态 g.drawImage(gameover, 0, 0, null); break; public static void main(String args) JFrame frame = new JFrame(“Fly“); ShootGame game = new ShootGame(); / 面板对象 frame.add(game);

20、/ 将面板添加到 JFrame 中 frame.setSize(WIDTH, HEIGHT); / 设置大小 frame.setAlwaysOnTop(true); / 设置其总在最上 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); / 默认关闭操作 frame.setIconImage(new ImageIcon(“images/icon.jpg“).getImage(); / 设置窗体的图标 frame.setLocationRelativeTo(null); / 设置窗体初始位置 frame.setVisible(true);

21、/ 尽快调用 paint game.action(); / 启动执行 /* 启动执行代码 */ public void action() / 鼠标监听事件 MouseAdapter l = new MouseAdapter() Override public void mouseMoved(MouseEvent e) / 鼠标移动 if (state = RUNNING) / 运行状态下移动英雄机-随鼠标位置 int x = e.getX(); int y = e.getY(); hero.moveTo(x, y); Override public void mouseEntered(Mous

22、eEvent e) / 鼠标进入 if (state = PAUSE) / 暂停状态下运行 state = RUNNING; Override public void mouseExited(MouseEvent e) / 鼠标退出 if (state = RUNNING) / 游戏未结束,则设置其为暂停 state = PAUSE; Override public void mouseClicked(MouseEvent e) / 鼠标点击 switch (state) case START: state = RUNNING; / 启动状态下运行 break; case GAME_OVER:

23、 / 游戏结束,清理现场 flyings = new FlyingObject0; / 清空飞行物 bullets = new Bullet0; / 清空子弹 hero = new Hero(); / 重新创建英雄机 score = 0; / 清空成绩 state = START; / 状态设置为启动 break; ; this.addMouseListener(l); / 处理鼠标点击操作 this.addMouseMotionListener(l); / 处理鼠标滑动操作 timer = new Timer(); / 主流程控制 timer.schedule(new TimerTask()

24、 Override public void run() if (state = RUNNING) / 运行状态 enterAction(); / 飞行物入场 stepAction(); / 走一步 shootAction(); / 英雄机射击 bangAction(); / 子弹打飞行物 outOfBoundsAction(); / 删除越界飞行物及子弹 checkGameOverAction(); / 检查游戏结束 repaint(); / 重绘,调用 paint()方法 , intervel, intervel); int flyEnteredIndex = 0; / 飞行物入场计数 /*

25、 飞行物入场 */ public void enterAction() flyEnteredIndex+; if (flyEnteredIndex % 40 = 0) / 400 毫秒生成一个飞行物-10*40 FlyingObject obj = nextOne(); / 随机生成一个飞行物 flyings = Arrays.copyOf(flyings, flyings.length + 1); flyingsflyings.length - 1 = obj; /* 走一步 */ public void stepAction() for (int i = 0; i flyings.leng

26、th; i+) / 飞行物走一步 FlyingObject f = flyingsi; f.step(); for (int i = 0; i bullets.length; i+) / 子弹走一步 Bullet b = bulletsi; b.step(); hero.step(); / 英雄机走一步 /* 飞行物走一步 */ public void flyingStepAction() for (int i = 0; i flyings.length; i+) FlyingObject f = flyingsi; f.step(); int shootIndex = 0; / 射击计数 /

27、* 射击 */ public void shootAction() shootIndex+; if (shootIndex % 30 = 0) / 300 毫秒发一颗 Bullet bs = hero.shoot(); / 英雄打出子弹 bullets = Arrays.copyOf(bullets, bullets.length + bs.length); / 扩容 System.arraycopy(bs, 0, bullets, bullets.length - bs.length, bs.length); / 追加数组 /* 子弹与飞行物碰撞检测 */ public void bangA

28、ction() for (int i = 0; i bullets.length; i+) / 遍历所有子弹 Bullet b = bulletsi; bang(b); / 子弹和飞行物之间的碰撞检查 /* 删除越界飞行物及子弹 */ public void outOfBoundsAction() int index = 0; / 索引 FlyingObject flyingLives = new FlyingObjectflyings.length; / 活着的飞行物 for (int i = 0; i flyings.length; i+) FlyingObject f = flyings

29、i; if (!f.outOfBounds() flyingLivesindex+ = f; / 不越界的留着 flyings = Arrays.copyOf(flyingLives, index); / 将不越界的飞行物都留着 index = 0; / 索引重置为 0 Bullet bulletLives = new Bulletbullets.length; for (int i = 0; i bullets.length; i+) Bullet b = bulletsi; if (!b.outOfBounds() bulletLivesindex+ = b; bullets = Arra

30、ys.copyOf(bulletLives, index); / 将不越界的子弹留着 /* 检查游戏结束 */ public void checkGameOverAction() if (isGameOver()=true) state = GAME_OVER; / 改变状态 /* 检查游戏是否结束 */ public boolean isGameOver() for (int i = 0; i flyings.length; i+) int index = -1; FlyingObject obj = flyingsi; if (hero.hit(obj) / 检查英雄机与飞行物是否碰撞 h

31、ero.subtractLife(); / 减命 hero.setDoubleFire(0); / 双倍火力解除 index = i; / 记录碰上的飞行物索引 if (index != -1) FlyingObject t = flyingsindex; flyingsindex = flyingsflyings.length - 1; flyingsflyings.length - 1 = t; / 碰上的与最后一个飞行物交换 flyings = Arrays.copyOf(flyings, flyings.length - 1); / 删除碰上的飞行物 return hero.getLi

32、fe() = 0; /* 子弹和飞行物之间的碰撞检查 */ public void bang(Bullet bullet) int index = -1; / 击中的飞行物索引 for (int i = 0; i flyings.length; i+) FlyingObject obj = flyingsi; if (obj.shootBy(bullet) / 判断是否击中 index = i; / 记录被击中的飞行物的索引 break; if (index != -1) / 有击中的飞行物 FlyingObject one = flyingsindex; / 记录被击中的飞行物 Flying

33、Object temp = flyingsindex; / 被击中的飞行物与最后一个飞行物交换 flyingsindex = flyingsflyings.length - 1; flyingsflyings.length - 1 = temp; flyings = Arrays.copyOf(flyings, flyings.length - 1); / 删除最后一个飞行物(即被击中的) / 检查 one 的类型(敌人加分,奖励获取 ) if (one instanceof Enemy) / 检查类型,是敌人,则加分 Enemy e = (Enemy) one; / 强制类型转换 score

34、 += e.getScore(); / 加分 else / 若为奖励,设置奖励 Award a = (Award) one; int type = a.getType(); / 获取奖励类型 switch (type) case Award.DOUBLE_FIRE: hero.addDoubleFire(); / 设置双倍火力 break; case Award.LIFE: hero.addLife(); / 设置加命 break; /* * 随机生成飞行物 * * return 飞行物对象 */ public static FlyingObject nextOne() Random random = new Random(); int type = random.nextInt(20); / 0,20) if (type 4) return new Bee(); else return new Airplane(); 写在最后以上就是这个游戏我整理的完整代码,因为图片差不多 9 张,所以图片没上传,需要图片的友友请简信我,最后,我做了一张思维导图贴出来让大家更好的理解 OOP 面向对象编程的过程。跟多资讯:http:/www.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报