上周上课的时候老师让用Java写个小程序,我本想写一个经典的飞机大战游戏来着,可以后来突发奇想就写成了这个

一、整体思路

  1. 继承窗体类,复写窗体刷新
  2. 添加按键监听
  3. 游戏结束界面
  4. 王思聪类和热狗类 移动轨迹计算
  5. 判断碰撞 音乐播放
  6. 不断刷新窗体 处理细节

二、编码

1.图片

首先你要找到图片,可以百度一张,然后用ps切开,再找一张背景图片就搞定了

你还需要一个加载图片的工具类,可以使用getResource得到图片的URL路径,然后使用java自带的工具类ImageIO来读取图片

public class GameUtil {public static Image getImage(String path){URL url=GameUtil.class.getClassLoader().getResource(path);BufferedImage img=null;try {img = ImageIO.read(url);} catch (IOException e) {e.printStackTrace();} return img;}
}

2.窗体

写一个类来继承窗体,为其设置宽高,位置,关闭设置,可否缩放大小

复写它的更新和绘画方法,以后要在里面写绘画思聪和热狗和碰撞判断逻辑

为其添加按键监听事件,在这里处理按键的点击和释放,以此来实现思聪的移动

     public void launchFrame(){setSize(width,height);setResizable(false);setLocation(200,20);setVisible(true);addKeyListener(new KeyMoniter());addWindowListener(new WindowAdapter(){@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}@Overridepublic void paint(Graphics graphics) {}@Overridepublic void update(Graphics g){}class KeyMoniter extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {//按键按下}@Overridepublic void keyReleased(KeyEvent e) {//按键抬起}  }

3.思聪和热狗

首先要有一个位置,还要能移动,其实也就是不断的计算位置和把图片画上去的过程

定义一些思聪的属性,并在构造方法中初始化这些属性

 boolean left,right,down,up;public int x,y,width,height;Image img ;public Plane(String img_path,int x, int y){this.img = GameUtil.getImage(img_path);this.x = x;this.y = y;width = img.getWidth(null);height = img.getWidth(null);live = true;}

把思聪画上去

 public void draw(Graphics g){if(live){g.drawImage(img, x, y, null);move();}}

接下来最重要的就是计算思聪的位置了,为什么要把位置计算写到画思聪的方法里呢?主要是考虑这样的一种情况,如果你把方法计算写到按键按下或者释放里面,那么你想移动思聪的位置就得疯狂按键盘,要想长按按键来控制移动就要吧移动方法写到画思聪的方法里面,然后用按键的按下和释放来控制是否移动。

移动的时候还要考虑到边界的情况

 public void move(){if(left&&x>=10){x -= 10;}       if(up&&y>=30){y -= 10;}if(right&&x<=FeiJiGame.width-60){x += 10;}if(down&&y<=FeiJiGame.height -60){y += 10;}}public void KeyPressedControlDirection(KeyEvent e){int key_code = e.getKeyCode();if(key_code == 37){left = true;}if(key_code == 38){up = true;}if(key_code == 39){right = true;}if(key_code == 40){down = true;}}public void KeyRelasedControlDirection(KeyEvent e){int key_code = e.getKeyCode();if(key_code == 37){left = false;}if(key_code == 38){up =false;}if(key_code == 39){right = false;}if(key_code == 40){down = false;}}

最后提供两个方法来改写思聪的生存

对于热狗类就简单多了,就是让它不断的跑,不需要响应按键事件

定义一些属性和在构造方法中初始化

 double speed=15;double degree;public double x,y;public int width,height;Image img;public Bullet(String img_path){img=GameUtil.getImage(img_path);degree = Math.random()*Math.PI*2;x=FeiJiGame.width/2;y=FeiJiGame.height/2;width = 10;height = 10;}

随机的degree的用途是让它们的初始方向不同,使用sin和cos函数来控制热狗的移动,同时也要注意边界

 public void draw(Graphics g){g.drawImage(img, (int)x, (int)y, null);x += speed*Math.cos(degree);y += speed*Math.sin(degree);if(x>FeiJiGame.width-width||x<width){degree=Math.PI-degree;}if(y>FeiJiGame.height-height||y<height){degree=-degree;}}

4.碰撞检测和音乐播放

在java的awt里面有一个矩形类可以判断两个矩形是否有重叠部分,有重叠说明就碰撞上了

Rectangle bulletRectangle = new Rectangle((int)bullet.x,(int)bullet.y,bullet.width,bullet.height);
Rectangle planeRectangle = new Rectangle(plane.x,plane.y,plane.width,plane.height);
boolean collide= bulletRectangle.intersects(planeRectangle);

音乐播放可以使用第三方的库,jl-1.0.1.jar,因为可能连续吃到热狗,所以需要多线程播放音乐

 class MusicPlayer implements Runnable{@Overridepublic void run() {try {new Player(new FileInputStream(FeiJiGame.class.getClassLoader().getResource("raw/music.mp3").getPath().substring(1))).play();} catch (Exception e) {e.printStackTrace();}}}

5.完成

剩下的就是窗体的刷新,这个可以开一个线程来做

 class PaintThread extends Thread {@Overridepublic void run() {while(!Thread.currentThread().isInterrupted()){repaint();try {Thread.sleep(40);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}  }

游戏右上方要显示现在的游戏时间,结束也要显示一些文字信息,写了一个工具类

使用font控制字体,graphics.setFont设置字体,drawString画上去

 public void printInfo(Graphics g,String message,int size,int x,int y){g.setColor(Color.white);Font f = new Font("宋体",Font.BOLD,size);g.setFont(f);g.drawString(message, x,y);}

游戏结束时显示一些信息,根据时间判断给出等级

 private void gameOver(Graphics graphics) {printInfo(graphics,"GAME OVER",80,270,300);int survivalTime = (int)(endTime.getTime()-starTime.getTime())/1000;printInfo(graphics,"吃热狗时间:"+survivalTime+"秒",40,300,400);switch(survivalTime/10){case 1:printInfo(graphics,"独孤求败",50,350,500);break;case 2:printInfo(graphics,"登堂入室",50,350,500);break;case 3:printInfo(graphics,"小有成就",50,350,500);break;default:printInfo(graphics,"初入江湖",50,350,500);break;}paintThread.interrupt();}

在初始化窗体时要添加热狗和开始重绘线程,开始计时

     for(int i=0;i<15;i++){Bullet bullet = new Bullet("images/hotdog.png");bulletList.add(bullet);}starTime = new Date();endTime = new Date();paintThread=new PaintThread();paintThread.start();

复写绘画和更新

        @Overridepublic void paint(Graphics graphics) {graphics.drawImage(bg, 0, 0, null);plane.draw(graphics);endTime = new Date();if(gameState){for(int i=0;i<bulletList.size();i++){Bullet bullet=bulletList.get(i);bullet.draw(graphics);Rectangle bulletRectangle = new Rectangle((int)bullet.x,(int)bullet.y,bullet.width,bullet.height);Rectangle planeRectangle = new Rectangle(plane.x,plane.y,plane.width,plane.height);boolean collide= bulletRectangle.intersects(planeRectangle);if(collide){if (bulletList.size()!=0){executorService.execute(musicPlayer);bulletList.remove(i);if (bulletList.size()==0){gameState = false;}}}}}else {endTime = new Date();gameOver(graphics);paintThread.interrupt();}int count_time = (int)(endTime.getTime()-starTime.getTime())/1000;printInfo(graphics,"你已经吃了"+count_time+"秒",20,750,50);}Image ImageBuffer = null;  Graphics GraImage = null;@Overridepublic void update(Graphics g){ImageBuffer = createImage(this.getWidth(), this.getHeight());GraImage = ImageBuffer.getGraphics();paint(GraImage);GraImage.dispose();g.drawImage(ImageBuffer, 0, 0, this);}  

在按键监听里面调用思聪的按键按下和释放方法

 class KeyMoniter extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {plane.KeyPressedControlDirection(e);}@Overridepublic void keyReleased(KeyEvent e) {plane.KeyRelasedControlDirection(e);} }

最后启动游戏

 public static void main(String[] args) {FeiJiGame game = new FeiJiGame();game.loadGame();}

github:https://github.com/s15603333319/SiCongEatHotDog

csdn:https://download.csdn.net/download/qq_37482202/11084561

教你用JAVA写个小游戏相关推荐

  1. Java写五子棋小游戏

    Java写五子棋小游戏 最近用Java写了个五子棋小游戏,遇到了许多细节问题,在此不得不总结一下,以便有同样需求朋友参考. 1.]面板发生变化,重绘棋盘与棋局问题: 必须调用父类的paint方法,因为 ...

  2. java写的小游戏打砖块_java实现打砖块小游戏

    本文实例为大家分享了java实现打砖块小游戏的具体代码,供大家参考,具体内容如下 源码共包含两个文件 文件1:play_zhuankuai.java import java.awt.*; import ...

  3. 【java游戏开发】教你用java做出扫雷小游戏

    扫雷是一款大众类的益智小游戏.根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 本课程详细讲解一个扫雷游戏的开发过程.只要90分钟就可以完成一个你自己亲手开发出来的Java ...

  4. 用java写猜拳小游戏

    题目:用面向对象编程的思想,设计一个猜拳游戏,完成人机猜拳互动游戏的开发. 题目要求: 基本思想: 各部分主要代码: Npc1类代码: Player1类: content方法: checked方法: ...

  5. 用Java写个小游戏--黄金矿工代码实现

    黄金矿工 项目结构 前期准备 Stone类 Gold类(包含Gold类,GoldMini类,GoldPlus类) GameWin类 Line类 Parent类 Sky类 项目结构 GameWin类,游 ...

  6. 过年了教你自己动手写一个小游戏给表弟玩-猜数字小游戏

    目录

  7. Java实现五子棋小游戏(附源码)

    今天给大家分享一个用java写的小游戏--<五子棋> (完整代码可在[资源下载]目录查看) . 推荐学习专栏: Java基础学习专栏:[Java]基础篇 Java进阶学习专栏:[Java] ...

  8. java登塔小游戏,是男人就上一百层

    学习java很久了,很少完完全全的自己编写一个有难度点的程序.又正好赶上一门课程任务,所以前段时间自己决定用java写一个小游戏,既可以当设计作品又可以练习巩固所学. 这个游戏具体规则如下: 1. 在 ...

  9. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

  10. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

最新文章

  1. 弹性计算双周刊 第 9 期
  2. linux文件给另一用户名和密码错误,linux重命名root后,使用su命令切换新用户时,提示密码错误...
  3. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 A题 Visiting Peking University
  4. 智能电源分配PDU应用
  5. 170525、解决maven隐式依赖包版本问题
  6. 用c语言随机获区100个整数,用rand() 函数去100 个随机的整数的有关问题
  7. thinkjs——空对象判断
  8. w ndows太卡,用Windows 10太卡?教你快速干掉Windows Defender
  9. easy datagrid 按钮控制
  10. 用HTML5/CSS3/JS开发Android/IOS应用
  11. 物联网卡使用过程中的注意事项
  12. Python爬取美女图片 爬虫基础
  13. 循环群、对称群、陪集和拉格朗日定理、正规子群和商群
  14. Elasticsearch第二篇:es之间版本比较
  15. 互联网中常见优化手段
  16. Python备份Mysql脚本_python备份mysql脚本
  17. Redis的基本操作--Redis的常用语句
  18. 【SE】Week3 : 个人博客作业(必应词典)
  19. 高并发秒杀系统方案的优化
  20. 星淘惠:跨境电商行业发展逐渐完善,四大方向是跨境电商的未来

热门文章

  1. FIO压测-SSDvsHDD
  2. sas ods html的作用是什么意思,SAS ODS
  3. 定制家具设计拆单用什么软件好?
  4. python水仙花数的编程代码-Python 求“水仙花数”的方法和具体代码
  5. 计算机组成原理 蒋本珊pdf,计算机组成原理 蒋本珊 习题解答.pdf
  6. 数学建模:lingo软件学习心得
  7. setuna截图怎么放大缩小_实用的高清截图系列小窍门详解,一章带你“真正学会”截图!...
  8. Pycharm 主题背景色的配置
  9. vue写一个简单的警察抓小偷的打字游戏
  10. 【离散数学】集合论 第三章 集合与关系(2) 集合的基本运算