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

 更新时间:2022年02月28日 10:16:35   作者:小虚竹and掘金  
本文将用Java语言自制一个小游戏:《接月饼小游戏》,游戏规则为不要被月亮砸到,尽可能地多接月饼。文中的实现代码讲解清晰,感兴趣的可以动手试一试

前言

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

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

主要设计

  • 设计游戏界面,用swing实现
  • 设计背景
  • 设计得分物体-月饼,碰到加一分
  • 设计障碍物-月亮,碰到会死亡
  • 监听鼠标的左右键,用来控制篮子左右移动
  • 设计积分系统
  • 将resource文件夹设为resource(Project Manage中可以设置),因为要用里面的图片

功能截图

游戏开始界面:

代码实现

游戏启动类

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);
        }
    }
}

总结

通过此次的《接月饼小游戏》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

到此这篇关于Java实现接月饼小游戏的示例代码的文章就介绍到这了,更多相关Java接月饼游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java强制保留两位小数的四种方法案例详解

    Java强制保留两位小数的四种方法案例详解

    这篇文章主要介绍了Java强制保留两位小数的四种方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 常用的Spring Boot调用外部接口方式实现数据交互

    常用的Spring Boot调用外部接口方式实现数据交互

    Spring Boot提供了多种调用外部接口的方式,可以方便地实现与其他系统的数据交互,提高系统的可扩展性和数据共享能力,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • Hadoop Combiner使用方法详解

    Hadoop Combiner使用方法详解

    这篇文章主要介绍了 Hadoop Combiner使用方法详解的相关资料,希望通过本文能帮助到大家让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Java 超详细讲解hashCode方法

    Java 超详细讲解hashCode方法

    在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致
    2022-04-04
  • SpringBoot项目中使用Swagger2及注解解释的详细教程

    SpringBoot项目中使用Swagger2及注解解释的详细教程

    Swagger2是一个开源项目,用于为RESTful Web服务生成REST API文档,下面这篇文章主要给大家介绍了关于SpringBoot项目中使用Swagger2及注解解释的详细教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Windows编写jar启动脚本和关闭脚本的操作方法

    Windows编写jar启动脚本和关闭脚本的操作方法

    脚本文件,通常放入/bin目录下,编写启动脚本需要保证能够识别到对应的jar文件,其次需要保证能够识别到/config中的配置文件信息,这篇文章主要介绍了Windows编写jar启动脚本和关闭脚本的操作方法,需要的朋友可以参考下
    2022-12-12
  • jquery uploadify和apache Fileupload实现异步上传文件示例

    jquery uploadify和apache Fileupload实现异步上传文件示例

    这篇文章主要介绍了jquery uploadify和apache Fileupload实现异步上传文件示例,需要的朋友可以参考下
    2014-05-05
  • java收集器Collector案例汇总

    java收集器Collector案例汇总

    这篇文章主要介绍了java收集器Collector案例汇总,Collectors作为Stream的collect方法的参数,Collector是一个接口,它是一个可变的汇聚操作,更多相关介绍,需要的朋友可以参考下
    2022-06-06
  • SpringBoot中的文件上传与下载详解

    SpringBoot中的文件上传与下载详解

    这篇文章主要介绍了SpringBoot中的文件上传与下载详解,springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程,本文我们就一起来看看上传与下载的操作,需要的朋友可以参考下
    2023-08-08
  • Spring boot配置文件加解密详解

    Spring boot配置文件加解密详解

    这篇文章主要给大家介绍了关于Spring boot配置文件加解密的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论