Java Swing实现思聪吃热狗游戏

news2024/11/20 8:27:51

引言

Java Swing,一种灵活的图形用户界面库,让我们可以以相对简便的方式创建图形化应用程序。在本文中,我们将讲述如何借助Swing构建一个简单的游戏:DogGame,它的规则是控制一只名为Wsc的狗来捕捉飞来的热狗。让我们浏览一下游戏设计的构思,代码的实现,并逐行解析关键的编程细节。
在这里插入图片描述

设计理念

在开始编码之前,我们需要理解的是,一个好的游戏是如何设计的。我们的DogGame具备以下特点:

  • 简易性:界面简洁明了,用户易于上手。
  • 响应性:游戏界面应对用户输入做出快速响应。
  • 扩展性:代码结构清晰,便于未来添加新功能。

构建游戏模型

我们的游戏模型包含三个主要类:DogGame, Wsc, 和 HotDog

  1. DogGame:这是游戏的主类,负责创建游戏窗口,初始化游戏环境,并控制游戏的主要循环。
  2. Wsc:代表游戏中的狗,能够移动并接住热狗。
  3. HotDog:它们从屏幕的一端飞到另一端,是Wsc需要捕捉的目标。

游戏实现

在Java Swing中,我们通常从创建一个继承JPanel的类开始。接着,我们将添加自定义的面板,用于渲染游戏元素,如Wsc和HotDog。让我们深入到每个类和关键功能的实现中。

DogGame类

DogGame类将继承自JFrame,并创建游戏的主窗口。在这个类中,我们将设置窗口的大小,初始化游戏元素,并创建游戏的主要循环来更新和渲染元素。

public class DogGame extends JPanel implements Runnable, MouseMotionListener {
    private Wsc wsc = new Wsc();
    private List<HotDog> list = new ArrayList<>();
    int sum = 0;

    public DogGame() {
        Icon icon = new ImageIcon(DogGame.class.getResource("/statics/Beijing.jpg"));
        JLabel label = new JLabel(icon);
        this.add(label);
    }

    //       采用定时器的方式,创建很多的热狗对象,存入到list集合中
//       使用Java的定时器的API,定时器每隔1秒钟执行一次方法 
    public void createHotDogs() {
        TimerTask timerTask = new TimerTask() {
            public void run() {
                HotDog dog = new HotDog(list);
            }
        };
        java.util.Timer timer = new java.util.Timer();
        timer.schedule(timerTask, 0, 1000);
    }

    //    重写面板的绘图方法
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(wsc.getImage(), wsc.getX(), wsc.getY(), null);
        for (int i = 0; i < list.size(); i++) {
            HotDog hotDog = list.get(i);
            hotDog.move();
            int n = hotDog.clear(wsc);
            sum += n;
            g.drawImage(hotDog.getImage(), hotDog.getX(), hotDog.getY(), null);
        }
        g.setColor(Color.yellow);
        g.setFont(new Font("宋体", Font.BOLD, 20));
        g.drawString("您现在已经吃了" + sum + "个热狗", 20, 30);
        if (sum >= 4) {
            g.drawString("真香(热狗就是好吃)!", 250, 30);
        }
    }

    //     线程run方法
    public void run() {
        while (true) {
            this.repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void mouseDragged(MouseEvent e) {
    }

    public void mouseMoved(MouseEvent e) {
        int x = e.getX();
        wsc.setX(x);
    }

    //     主函数,运行主函数开始游戏
    public static void main(String[] args) {
        FlatDarkLaf.setup();
        JFrame frame = new JFrame();
        frame.setTitle("思聪吃热狗");
        frame.setSize(489, 650);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DogGame dogGame = new DogGame();
        frame.add(dogGame);
        dogGame.createHotDogs();
        dogGame.repaint();
        new Thread(dogGame).start();
        dogGame.addMouseMotionListener(dogGame);
        frame.setVisible(true);
    }

}

Wsc类

Wsc类代表游戏中的狗,我们使用图片绘绘制狗,并实现键盘监听来移动狗的坐标。

public class Wsc {
    private int x;
    private int y;
    private BufferedImage image;

    public Wsc() {
        try {
            x = 180;
            y = 500;
            image = ImageIO.read(Wsc.class.getResource("/statics/Wsc.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }

}
HotDog类

接下来是HotDog类,它需要能够随机生成,并沿屏幕飞行。

public class HotDog {
    private int x;
    private int y;
    private BufferedImage image;
    private Random random = new Random();
    private List<HotDog> list;

    //    热狗随机出现的位置
    public HotDog(List<HotDog> list) {
        try {
            image = ImageIO.read(HotDog.class.getResource("/statics/HotDog.png"));
            this.list = list;
            y = 0;
            x = random.nextInt(400);
            this.list.add(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void move() {
        y += 10;
        if (y >= 600) {
            this.list.remove(this);
        }
    }

    //
//       吃热狗碰撞,消除数据
//    返回消除的数量
    public int clear(Wsc wsc) {
        int dogx2 = x;
        int dogx3 = dogx2 + 66;
        int dogy = y;
        int dogy2 = dogy + 102;
        int wscx = wsc.getX();
        int wscx2 = wscx + 30;
        int wscx3 = wscx + 80;
        int wscy = wsc.getY();
        int flagx2 = dogx2 - wscx2;
        int flagx3 = dogx3 - wscx3;
        int flagy = dogy2 - wscy;
        if (flagx2 > -20 && flagx3 < 20 && flagy > 20 && flagy < 40) {
            boolean remove = this.list.remove(this);
            if (remove) {
                return 1;
            }
        }
        return 0;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }
}

项目亮点

使用到了FlatLaf (IDEA风格)-干净、优雅、扁平化的现代开源跨平台外观

<dependency>
    <groupId>com.formdev</groupId>
    <artifactId>flatlaf</artifactId>
    <version>2.3</version>
</dependency>

结语

本文提供了一个简单游戏的设计和开发旅程——从构想到实现,从代码到操作。虽然简单,但DogGame是理解如何使用Java Swing构建应用程序的绝佳入门方式。学习完这个教程后,你应该能够运用相似的概念自己创建更复杂的游戏或其他类型的应用。


如要获取完整的代码和静态资源,请查看我的同名公众号,回复:吃热狗。希望你在构建自己的DogGame时会有很多乐趣!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Github 2F2【解决】经验帖-PPHub登入

最近在做项目时,Github总是出问题,这是一经验贴 Github 2F2登入问题【无法登入】PPhub 2F2是为了安全,更好的生态 启用 2FA 二十八 (28) 天后,要在使用 GitHub.com 时 2FA 检查 物理安全密钥、Windows Hello 或面容 ID/触控 ID、SMS、GitHub Mobile 都可以作为 2F2 的工…

架构学习(三):scrapy-redis源码分析并实现自定义初始请求

scrapy-redis源码分析并实现自定义初始请求 前言关卡&#xff1a;如何自定义初始请求背景思考简单又粗暴的方式源码分析 结束 前言 通过这篇文章架构学习(二)&#xff1a;原生scrapy如何接入scrapy-redis&#xff0c;初步入局分布式&#xff0c;我们正式开启scrapy-redis分布式…

MySQL EXPLAIN查询执行计划

EXPLAIN 可用来查看SQL执行计划&#xff0c;常用来分析调试SQL语句&#xff0c;来使SQL语句达到更好的性能。 1 前置知识 在学习EXPLAIN 之前&#xff0c;有些基础知识需要清楚。 1.1 JSON类型 MySQL 5.7及以上版本支持JSON数据类型。可以将数组存为JSON格式的字符串&#…

【CSS】css选择器和css获取第n个元素(:nth-of-type(n)、:nth-child(n)、first-child和last-child)

:nth-of-type、:nth-child的区别 一、css选择器二、:nth-of-type、:nth-child的区别:nth-of-type(n)&#xff1a;选择器匹配属于父元素的特定类型的第N个子元素:nth-child(n)&#xff1a;选择器匹配属于其父元素的第 N 个子元素&#xff0c;不论元素的类型:first-child&#xf…

2017 年全国职业院校技能大赛高职组“信息安全管理与评估”赛项任务书(笔记解析)

1. 网络拓扑图 2. IP 地址规划表 3. 设备初始化信息 阶段一 任务1:网络平台搭建 1 根据网络拓扑图所示,按照 IP 地址参数表,对 WAF 的名称、各接口 IP 地址进 行配置。 主机名称 模式选择:透明模式 IP 地址:匹配参数表 WAF IP 地址 子网掩码 网口列表: eth0 和 eth1 2…

【操作宝典】IntelliJ IDEA新建maven项目详细教程

目录 &#x1f33c;1. 配置maven环境 &#x1f33c;2. 创建maven项目 &#x1f33c;3. 创建maven项目完整示例 a. 导入spring boot环境 b. 修改maven配置 c. 下载jar包 d. 创建Java类 &#x1f33c;1. 配置maven环境 【安装指南】maven下载、安装与配置详细教程-CSDN博客…

Vue3+vite引入Tailwind CSS

Tailwind CSS 是一个为快速创建定制化 UI 组件而设计的实用型框架。与其他 CSS 框架或库不同&#xff0c;Tailwind CSS 组件没有预先设置好样式。可以使用 Tailwind 的低级实用类来为 CSS 元素设置样式&#xff0c;如 margin、flex、color 等。 自从 2017 年发布以来&#xff…

基于python flask茶叶网站数据大屏设计与实现,可以做期末课程设计或者毕业设计

基于Python的茶叶网站数据大屏设计与实现是一个适合期末课程设计或毕业设计的项目。该项目旨在利用Python技术和数据可视化方法&#xff0c;设计和开发一个针对茶叶行业的数据大屏&#xff0c;用于展示和分析茶叶网站的相关数据。 项目背景 随着互联网的快速发展&#xff0c;越…

【Java程序设计】【C00196】基于(JavaWeb+SSM)的旅游管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的旅游管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游平台 本系统分为前台、管理员2个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的…

使用 Dockerfile 定制镜像详解

使用 Dockerfile 定制镜像详解 1.DockerfileFROM 指定基础镜像RUN 执行命令构建镜像 2.COPY 复制文件3.ADD 更高级的复制文件4.CMD 容器启动命令5.ENTRYPOINT 入口点6.ENV 设置环境变量7.ARG 构建参数8.VOLUME 定义匿名卷9.EXPOSE 暴露端口10.WORKDIR 指定工作目录11.USER 指定…

鸿道(Intewell)操作系统是什么?

科东软件自主研发的鸿道&#xff08;Intewell&#xff09;新型工业操作系统历经30多年研发积累&#xff0c;采用业界领先的微内核架构&#xff0c;具备高实时、高安全及强扩展的特性&#xff0c;与自主研发的Hypervisor虚拟化技术相结合&#xff0c;既能满足工业现场对设备控制…

Ray on ACK 实践探索之旅 - RayCluster 篇

作者&#xff1a;张杰、霍智鑫、行疾 什么是 Ray&#xff1f; Ray 是一个开源框架&#xff0c;专为构建可扩展的分布式应用程序而设计&#xff0c;旨在通过提供简单直观的 API&#xff0c;简化分布式计算的复杂性&#xff0c;让开发者能够便捷高效地编写并行和分布式 Python …

Git 指令

Git 安装 操作 命令行 简介&#xff1a; Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion …

Iceberg从入门到精通系列之二十一:Spark集成Iceberg

Iceberg从入门到精通系列之二十一&#xff1a;Spark集成Iceberg 一、在 Spark 3 中使用 Iceberg二、添加目录三、创建表四、写五、读六、Catalogs七、目录配置八、使用目录九、替换会话目录十、使用目录特定的 Hadoop 配置值十一、加载自定义目录十二、SQL 扩展十三、运行时配置…

avast网页随机密码生成器

随机密码生成器 | 告别 12345 | Avast 可以生成随机密码 按需调整

Vue3学习记录(二)--- 组合式API之计算属性和侦听器

一、计算属性 1、简介 ​ 计算属性computed()&#xff0c;用于根据依赖的响应式变量的变化&#xff0c;进行自动的计算&#xff0c;并返回计算后的结果。当依赖的响应式变量发生变化时&#xff0c;computed()会自动进行重新计算&#xff0c;并返回最新的计算结果。如果依赖的…

Open CASCADE学习|球面上曲线长度计算

球和球面是数学和物理学中非常重要的概念&#xff0c;它们在许多领域都有广泛的应用。 球面是指所有与固定点等距离的点的集合&#xff0c;这个固定点被称为球心&#xff0c;而这个等距离的长度就是球的半径。球面是一个二维曲面&#xff0c;它是三维空间中点与距离之间关系的…

大数据平台-可视化面板介绍-Echarts

应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。 目录 01-使用技术 02- 案例适配方案 03-基础…

在IDEA中使用git(教程)

目录 第一章、快速了解git和idea1.1&#xff09;git安装使用教程1.2&#xff09;idea安装使用教程 第二章、在IDEA中使用git2.1&#xff09;安装插件和git设置2.2&#xff09;基础操作2.2.1&#xff09;使用IDEA初始化本地仓库&#xff0c;2.2.2&#xff09;关联本地仓库和远程…

XGB-1:XGBoost安装及快速上手

XGBoost是“Extreme Gradient Boosting”的缩写&#xff0c;是一种高效的机器学习算法&#xff0c;用于分类、回归和排序问题。它由陈天奇&#xff08;Tianqi Chen&#xff09;在2014年首次提出&#xff0c;并迅速在数据科学竞赛和工业界获得广泛应用。XGBoost基于梯度提升框架…