大学生课程设计报告--基于JavaGUI的贪吃蛇

news2024/12/23 23:03:55

前言

​ 贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的;

​ 不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而不是更多边缘设计;

​ 而且,贪吃蛇的设计涉及了多个学科领域,如计算机科学,数学,艺术和心理学,有助于我将所学知识综合运用到实际项目中;

​ 以及贪吃蛇可以培养我的算法思维,通过写算法去决定如何让蛇在屏幕中进行移动,如何处理蛇头与食物的碰撞,对我的算法锻炼真的起到了很好的作用;

​ 贪吃蛇游戏的设计也可以锻炼我的模块化编程思想,如将贪吃蛇这款游戏分为不同模块,如游戏界面,游戏逻辑,控制模块等等;

以上就是我对贪吃蛇这款游戏作为我的课程设计作业的理由。

系统设计思路

系统整体架构

​ 贪吃蛇通过GUI图形界面来使图像渲染到程序中,并通过帧的概念来进行定时器的设计,使画笔每次重画的次数大于一秒十次,通过人眼能够捕捉到的帧数,来达到动画的效果,再通过键盘输入的监控来实现与玩家的交互,通过事件的判断来控制游戏的开始和结束,这是这个游戏的基本制作流程。

在这里插入图片描述

模块划分

贪吃蛇这个游戏总共分为三个大模块,其中还有一些小的模块

  • 导入图片变量模块
  • 创建显示GUI模块
  • 游戏及其对应的操作逻辑实现模块
    • 初始化模块
    • 渲染模块
    • 用户交互模块
    • 游戏逻辑模块

各模块之间的逻辑

  1. 导入图片模块为渲染模块提供了现成的图片与画板进行缝合
  2. 游戏及对应的操作逻辑模块实现为创建显示GUI模块具体显示什么内容提供了具体实例
  3. 创建显示GUI模块为游戏及对应的操作逻辑模块在什么窗口下进行实现提供了位置
  4. 初始化模块为游戏逻辑模块提供了初始的变量值,使其可以进行判断交互
  5. 用户交互模块为游戏逻辑模块中的小蛇的移动以及游戏状态的开始结束与否提供了具体指示
  6. 渲染模块使用户交互模块再监听事件后可以得到图像变化的反馈

系统的设计过程

创建显示GUI模块

公共类为StartGame,作用是创建一个GUI的Jframe窗口,包含进行游戏操作逻辑实现的面板,通过frame.add(new GamePanel())方法来将游戏面板添加到Jframe窗口中去

方法

public static void main(String[] args) { ... }:程序运行的入口。

frame.setBounds(10,10,900,720):设置窗口的大小以及相对视口的位置。

``import javax.swing.*:这是一个通配符导入语句,它导入javax.swing`包中的所有类。这个包包含了用于创建Java Swing GUI应用程序的所有类。

import com.bao.snake.GamePanel:导入语句,它告诉编译器这个程序将要使用com.bao.snake包中的GamePanel类。GamePanel类应该是在这个包中定义的,并且将被用来作为游戏画面的容器。

JFrame frame = new JFrame():创建了一个新的JFrame对象,JFrame是Swing库中的一个类,用于表示一个窗口。

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE):当用户关闭窗口时程序应该执行的操作。而WindowConstants.EXIT_ON_CLOSE是一个常量,它告诉程序在用户关闭窗口时应该退出。

frame.setResizable(false):设置窗口是否可以被用户调整大小。在这里,false表示用户不能调整窗口的大小,不给用户调整窗口大小的原因是游戏动画无法根据窗口大小进行自适应,若给用户调整了窗口大小,会导致一系列不适配以及操作逻辑上的问题。

frame.add(new GamePanel1()):创建了一个GamePanel1对象(该类在游戏以及对应操作逻辑实现模块中实现),并将其添加到JFrame窗口中。add方法是Container类的一个方法,JFrame继承了Container类,因此可以添加组件。

frame.setVisible(true):这个方法使窗口可见。在调用setVisible(true)之前,窗口虽然已经创建,但是不会显示在屏幕上。


导入图片变量模块

公共类为Data,作用为通过路径变量获取图片的路径,并将其加载到一个ImageIcon对象中去,实现图片的获取和加载

方法

Data.class.getResource("static/topbar.png"):来自java.net.URL,这个方法是Class类的一个实例方法,用于获取类路径下的资源。它接收一个资源名称作为参数,并返回一个URL对象,该对象代表了资源的路径。如果资源不存在,则返回null。而如"static/topbar.png"这种参数,就是所需对应图片的路径

new ImageIcon(upURL):来自javax.swing.ImageIcon,这是一个ImageIcon类的构造方法,用于创建一个ImageIcon对象,该对象用于表示一个图像。它接收一个URL对象作为参数,该URL指向图像文件的位置。而upURL就是对应蛇头向上的适合的图像的URL对象

该类中有多个重复如以上两种方法的调用而得到的ImageIcon对象

游戏及其对应的操作逻辑实现模块

公共类为GamePanel,继承自JPanel并实现了KeyListenerActionListener接口。作用为实现游戏操作逻辑,用户与键盘的交互反馈,面板的渲染

其中,

  • 继承自JPanel,这意味着它可以作为Swing组件添加到窗口中
  • 实现了KeyListener接口,允许类处理键盘事件
  • 实现了ActionListener接口,允许类响应定时器事件。

类中的成员变量有:

  • length:记录小蛇的长度。
  • snakeXsnakeY:数组,分别存储小蛇身体的x和y坐标。
  • fx:字符串,表示小蛇当前移动的方向。
  • random:用于生成随机数,确定食物的位置。
  • foodxfoody:存储食物的坐标。
  • isStart:布尔值,表示游戏是否开始。
  • timer:定时器,用于控制游戏刷新速度。
  • bigfoodxbigfoody:分别存储大食物的x和y坐标
  • boomxboomy:分别存储炸弹的x和y坐标
  • have:用于决定下一帧是否渲染大食物
  • bigfood:用于判断大食物出现的时机
  • scorelevel:分别为游戏的分数和等级
  • boom: 用于判断炸弹出现的时机

方法

1.构造方法

在这里插入图片描述

init():初始化游戏状态及对应变量

this.setFocusable(true):获得焦点(游戏游玩一般都需要获得焦点)

this.addKeyListener(this):配置键盘监听事件

timer.start();:启动定时器(通过定时器来实现帧的概念进而实现动画效果,变成游戏画面)

2.init( )

在这里插入图片描述

  • 设置定时器间隔多少事件进行一次(一开始为100毫秒)

  • 通过随机数方法来赋予食物,大食物,炸弹的x和y坐标

  • 给定蛇一开始头和身体的位置

  • 给定蛇头一开始向右

  • 将分数和等级都初始化为0 – 等级level每升一级,都会减少定时器每次调用的间隔事件,进而来提升玩家的游戏难度

    3.protected void paintComponent(Graphics g):

     //绘制面板 游戏中所有东西都使用这支画笔
        @Override
        protected void paintComponent(Graphics g) {
         
            //重画中需要先进行清屏,只要帧数够大,即可实现动画
            super.paintComponent(g); //清屏
    
            //绘制静态面板
            this.setBackground(Color.WHITE);
            Data.topbar.paintIcon(this,g,20,11); //头部广告栏画上去
            g.setColor(Color.DARK_GRAY);
            g.fillRect(25,75,850,600); //默认的游戏界面
    
    
            //后面想出来的
            //画积分
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体
            g.drawString("等级"+level,750,35);
            g.drawString("分数"+score,750,55);
    
    
            //游戏状态
            if(isStart == false){
         
                g.setColor(

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

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

相关文章

​ ​视觉任务大一统!图像生成,编辑,翻译三合一!全能视觉助手PixWizard来袭!

文章链接:https://arxiv.org/pdf/2409.15278 github链接:https://github.com/AFeng-x/PixWizard 亮点直击 任务统一:针对视觉任务的多样性,提出将其框架化为图像到图像的转换问题,并通过后处理将生成的可视化效果转化…

【论文速看】DL最新进展20241009-图像生成、多模态、医学扩散模型、行人重识别

目录 【图像生成】【多模态】【医学扩散模型】【行人重识别】 【图像生成】 [2024] CAR: Controllable Autoregressive Modeling for Visual Generation 论文链接:https://arxiv.org/pdf/2410.04671 代码链接:https://github.com/MiracleDance/CAR 可控…

windows C++-避免死锁(上)

下面通过“哲学家就餐问题”说明了如何使用 concurrency::join 类来避免在应用程序中发生死锁。 在软件应用中,如果两个或多个进程分别留有资源,且相互等待另一进程释放其他资源,就会发生死锁。 “哲学家就餐问题”是在多个并发进程之间共享…

掌握甘特图,没有Excel也能轻松制作的技巧

甘特图是项目管理中常用工具,由亨利甘特发明。不擅长Excel者可用ZohoProjects等软件创建甘特图,其直观展示项目时间和任务,支持实时协作、工时管理等功能,广泛应用于各领域项目管理。 一、甘特图的由来 甘特图最初是由工程师和管…

反射在Go语言中的具体应用场景

在Go语言中,反射(Reflection)是一种强大的特性,它允许程序在运行时检查、修改和操作变量的类型信息。 尽管反射在性能上通常不如直接操作,但它在某些特定场景下非常有用。 反射在Go语言中的具体应用场景:…

YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测

前言 本文分享YOLO11的模型推理,检测任务包括物体分类、目标检测与跟踪、实例分割 、关键点估计、旋转目标检测等。 首先安装YOLO11 官方默认安装方式 通过运行 pip install ultralytics 来快速安装 Ultralytics 包 安装要求: Python 版本要求&…

leetcode125:验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是 回文串 ,返回 true ;否则&#…

赋能新时代,智象未来(HiDream.ai)推动智能服务深度融入生活

在人工智能领域的最新发展中,智象未来科技有限公司(简称“智象未来(HiDream.ai)”以其卓越的技术创新和深厚的行业积累脱颖而出,一跃成为多模态生成式人工智能技术的领军者。该公司致力于开发和优化视觉多模态基础模型…

天海一体,遨游双卫星智能终端扬帆5G智慧海洋

海洋面积占地球表面的70%以上,世界贸易的90%左右由国际海运行业承运。但是,信号覆盖不均、通信延迟高、定位精度不足等问题,严重制约了海洋作业的效率与安全。智慧海洋,通信先行,AORO M5-5G双卫星智能终端应时代需求而…

MySQL从0到1基础语法笔记(下)

博客主页:誓则盟约系列专栏:Java Web关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 多表问题分析: 部门数据可以直接删除,然后还有部分员工…

为了加速上市,独角兽SHEIN的神秘创始人终于要露脸了?

神秘独角兽SHEIN在假期中迎来一个特殊新闻,《华尔街日报》、英国《金融时报》等媒体都报道称,SHEIN创始人许仰天最近先后前往美国和伦敦会见投资者,为其伦敦上市做准备。 (图源:英国《金融时报》官网) 这条…

使用fastjson解析json格式数据

在java里面无法直接解析JSON格式的字符串或文本&#xff0c;这时候我们就需要一个解析json格式的库&#xff0c;我们这里用fastjson,接下来的代码操作如下&#xff1a; 1、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson&…

【阿克曼odom里程计解算】:从下位机到上位机,从原理到代码实现

前言 本文将从阿克曼的里程计计算原理出发&#xff0c;讲解下位机STM32如何对电机编码器数据进行整合计算&#xff0c;再通过串口进行上下位机进行数据转发&#xff0c;最终在Linux板端对下位机发送来的数据进行积分计算并最终通过ROS的odometry数据进行全局广播。本文使用到的…

JavaScript 数组简单学习

目录 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例 1. 数组 1.1 介绍 1.2 基本使用 1.2.1 声明语法 1.2.2 取值语法 1.2.3 术语 1.3 案例

自动化测试selenium篇(四)

1.定位一组元素 1.0 小问题 当运行测试代码程序需要跳转到页面&#xff0c;由于没有授权&#xff0c;导致页面不能成功跳转&#xff0c;且出现下面的情况&#xff1a; 步骤一&#xff1a;进入到idea&#xff0c;点击设置&#xff0c;如下所示&#xff1a; 进行上图操作之后&am…

图为大模型一体机的优秀落地案例:图为语伴

随着客户对即时、准确信息和解决方案的期望不断提升&#xff0c;企业面临着处理大量客户咨询、减少人力成本、提高服务效率等多重挑战。 而图为大模型一体机的诞生&#xff0c;就是为了应对传统的人工客服在处理客户咨询时&#xff0c;其产生的数据如聊天记录、通话记录等&…

中科院认可SCI期刊精选合集:5本国人友好刊,涵盖各领域!

本期&#xff0c;科检易学术将为大家精心推荐一系列既享有盛誉又相对容易发表的期刊。这些期刊不仅在各自的学术领域内具有较高的认可度和影响力&#xff0c;同时也以对国内研究者的友好态度而闻名。 无论是初出茅庐的研究新手还是经验丰富的学者&#xff0c;都能在这份涵盖多…

当今SNARKs全景

1. 引言 前序博客有&#xff1a; ZKP历史总览SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇Transparent 且 Post-quantum zkSNARKsSNARK DesignRollup项目的SNARK景观 SNARKs因&#xff1a; proof size证明时长验证时长密码学信任假设是否需要tr…

Chatgpt 原理解构

一、背景知识 1. 自然语言处理的发展历程 自然语言处理在不同时期呈现出不同的特点和发展态势。萌芽期&#xff0c;艾伦・图灵在 1936 年提出 “图灵机” 概念&#xff0c;为计算机诞生奠定基础&#xff0c;1950 年他提出著名的 “图灵测试”&#xff0c;预见了计算机处理自然…

linux 配置nfs

服务器端 sudo apt update sudo apt-get install nfs-kernel-server配置NFS服务器 mkdir /home/aa/workspace/nfsdir chmod 777 /home/aa/workspace/nfsdir sudo vim /etc/exports添加这个语句 /home/aa/workspace/nfsdir *(rw,sync,no_root_squash,insecure)sudo systemctl …