Java实现接月饼小游戏的示例代码

作者:小虚竹and掘金 时间:2022-08-16 03:26:06 

前言

《接月饼小游戏》是一个基于java的自制游戏,不要被月亮砸到,尽可能地多接月饼。

此小项目可用来巩固JAVA基础语法,swing的技巧用法。

主要设计

  • 设计游戏界面,用swing实现

  • 设计背景

  • 设计得分物体-月饼,碰到加一分

  • 设计障碍物-月亮,碰到会死亡

  • 监听鼠标的左右键,用来控制篮子左右移动

  • 设计积分系统

  • 将resource文件夹设为resource(Project Manage中可以设置),因为要用里面的图片

功能截图

游戏开始界面:

Java实现接月饼小游戏的示例代码

Java实现接月饼小游戏的示例代码

代码实现

游戏启动类

public class Start {
   public static void main(String[] args) throws URISyntaxException {
       new EatGame();
   }
}

核心类

public class EatGame extends JFrame implements ActionListener, MouseListener
{
   private final int WIDTH = 400;
   private final int HEIGHT = 800;
   private int score;
   private int ticks;
   private boolean gameOver = false;
   private GameControl control;
   private List<Moon> moons;
   private List<Cake> cakes;
   private Timer timer;
   private ChangeE changeE;
   /**
    * Constructor for objects of class FallingGame
    */
   public EatGame() throws URISyntaxException {

changeE = new ChangeE(150, 650, "player.jpg", WIDTH);
       moons = new ArrayList<>();
       cakes = new ArrayList<>();
       addMoonAndCake();

control = new GameControl(changeE, moons, cakes);
       timer = new Timer(20, this);

//add keybinds
       control.addAction("Left", -20, KeyEvent.VK_LEFT);
       control.addAction("Right", 20, KeyEvent.VK_RIGHT);

//add components
       add(control);
       addMouseListener(this);
       control.addMouseListener(this);
       setTitle("吃月饼");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(WIDTH, HEIGHT);
       setResizable(false);
       setVisible(true);

timer.start();

}

/**
    * 添加月亮和月饼
    */
   public void addMoonAndCake() {
       Random r = new Random();
       int x, y;
       x = 60 + (r.nextInt(35) * 2);
       y = r.nextInt(20) + moons.size() * 30;
       Moon moon1 = new Moon(x, y, "moon.png");
       moons.add(moon1);

x = 190 + r.nextInt(35) * 2;
       y = r.nextInt(20) + moons.size() * 30;
       Moon moon2 = new Moon(x, y, "moon.png");
       moons.add(moon2);

x = 80 + (r.nextInt(35) * 2);
       y = r.nextInt(20) + moons.size() * 50;
       Cake cake = new Cake(x, y, "cake.png");
       cakes.add(cake);
   }

/**
    * 更新窗口
    */
   private void updateFrame() {
       ticks++;
       for(int i = 0; i < moons.size(); i++)
       {
           Moon moon = moons.get(i);
           if(ticks % 25 == 0 && moon.getSpeed() < 10)
           {
               moon.setSpeed(moon.getSpeed() + 2);
           }
       }
       Iterator<Moon> moonIterator = moons.iterator();
       while (moonIterator.hasNext()) {
           Moon moon = moonIterator.next();
           // 超出屏幕
           if(moon.getY() > HEIGHT) {
               moonIterator.remove();
           } else
               moon.move();
       }
       Iterator<Cake> cakeIterator = cakes.iterator();
       while (cakeIterator.hasNext()) {
           Cake cake = cakeIterator.next();
           // 超出屏幕
           if(cake.getY() > HEIGHT) {
               cakeIterator.remove();
           } else
               cake.move();
       }
       if(moons.size() == 0) {
           addMoonAndCake();
       }
   }

private boolean checkCollision() {
       Rectangle rectangle = (Rectangle) changeE.getShape();
       for(Moon moon : moons) {
           Ellipse2D circle = (Ellipse2D) moon.getShape();
           // 判断是否与圆形相撞
           if (circle.intersects(rectangle)) {
               gameOver = true;
           }
       }
       Iterator<Cake> cakeIterator = cakes.iterator();
       while (cakeIterator.hasNext()) {
           Cake cake = cakeIterator.next();
           Ellipse2D circle = (Ellipse2D) cake.getShape();
           if (circle.intersects(rectangle)) {
               score ++;   // 得分
               cakeIterator.remove();
           }
       }
       return gameOver;
   }
   public void actionPerformed(ActionEvent e)
   {
       if(gameOver) {
           timer.stop();
           control.drawEnd(control.getGraphics(), score);
       } else {
           //continue with game
           updateFrame();
           checkCollision();
           control.repaint();
       }
   }
   public void mouseClicked(MouseEvent e) {

}
   public void mousePressed(MouseEvent e)
   {
       if(gameOver)
       {
           //reset game
           moons.clear();
           control.removeAll();
           control.updateUI();
           score = 0;
           changeE.setX(150);
           changeE.setY(650);
           addMoonAndCake();
           timer.start();
           repaint();
           gameOver = false;
       }
   }
   public void mouseReleased(MouseEvent e)
   {

}
   public void mouseEntered(MouseEvent e)
   {

}
   public void mouseExited(MouseEvent e)
   {

}
}

画面绘制

/**
* 画面绘制
*/
public class GameControl extends JPanel
{
   private InputMap inputMap;
   private ChangeE myChangeE;
   private List<Moon> moons;
   private List<Cake> cakes;

public GameControl(ChangeE changeE, List<Moon> moons, List<Cake> cakes)
   {
       this.myChangeE = changeE;
       this.moons = moons;
       this.cakes = cakes;
       setBackground(Color.white);
       inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);  
   }

@Override
   protected void paintComponent(Graphics g)
   {
       super.paintComponent(g);
       // 绘制背景
       ImageIcon icon=new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("background.png"));
       Image img=icon.getImage();
       g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
       // 绘制玩家
       g.drawImage(myChangeE.getImage(), myChangeE.getX(), myChangeE.getY(), this);
       // 绘制月亮
       for(Moon moon : moons) {
           g.drawImage(moon.getImage(), moon.getX(), moon.getY(), this);
       }
       // 绘制月饼
       for (Cake cake : cakes) {
           g.drawImage(cake.getImage(), cake.getX(), cake.getY(), this);
       }

}

public void drawEnd(Graphics g, int score)
   {
       g.setColor(Color.WHITE);
       g.fillRect(50, 200, 300, 300);
       g.setColor(Color.RED);
       g.drawString("祝你中秋快乐,阖家欢乐!", 100, 300);
       g.setColor(Color.BLUE);
       g.drawString("您吃的到的月饼个数为:" + score, 100, 350);
       g.setColor(Color.BLACK);
       g.drawString("鼠标点击重玩", 100, 400);
   }

public void addAction(String name, int deltaX, int keyCode) {
       MoveAction moveAction = new MoveAction(name, deltaX);
       inputMap.put(KeyStroke.getKeyStroke(keyCode, 0), name);
       getActionMap().put(name, moveAction);
   }

private class MoveAction extends AbstractAction implements ActionListener {
       private int myDeltaX;

public MoveAction(String name, int deltaX) {
           super(name);
           myDeltaX = deltaX;
       }

public void actionPerformed(ActionEvent e) {
           myChangeE.move(myDeltaX);
       }
   }
}

来源:https://juejin.cn/post/7069561982747148318

标签:Java,接月饼,游戏
0
投稿

猜你喜欢

  • java基础的详细了解第八天

    2023-11-08 10:47:47
  • SSH框架网上商城项目第10战之搭建商品类基本模块

    2023-11-12 14:00:29
  • Mybatis延迟加载和缓存深入讲解

    2022-06-02 15:50:43
  • 程序猿必须要掌握的多线程安全问题之锁策略详解

    2021-10-19 04:57:17
  • RocketMQ producer同步发送单向发送源码解析

    2022-11-20 01:55:55
  • java中为何重写equals时必须重写hashCode方法详解

    2022-10-24 01:44:39
  • Springboot整合redis实现发布订阅功能介绍步骤

    2021-11-23 16:42:26
  • Spring Security Remember me使用及原理详解

    2023-10-28 04:59:56
  • Java动态显示文件上传进度实现代码

    2022-09-09 20:18:17
  • MyEclipse设置Console输出到文件的实现方法

    2022-01-14 10:37:03
  • 详解Java中Iterable与Iterator用法

    2022-05-14 04:25:30
  • iOS实现微信朋友圈与摇一摇功能

    2023-06-16 13:59:48
  • servlet实现文件上传、预览、下载、删除功能

    2023-11-16 21:52:48
  • Spring Boot示例代码整合Redis详解

    2022-03-20 19:23:37
  • 聊一聊SpringBoot服务监控机制

    2023-02-09 02:47:48
  • Java构建JDBC应用程序的实例操作

    2023-08-07 12:09:13
  • java识别一篇文章中某单词出现个数的方法

    2022-04-24 06:18:40
  • Scala小程序详解及实例代码

    2023-03-29 12:10:56
  • SpringCloud整合Nacos实现流程详解

    2021-07-04 11:11:09
  • 浅谈解决Hibernate懒加载的4种方式

    2022-07-04 00:46:39
  • asp之家 软件编程 m.aspxhome.com