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

前言

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

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

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

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

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

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

系统设计思路

系统整体架构

​ 贪吃蛇通过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):

     //绘制面板 游戏中所有东西都使用这支画笔@Overrideprotected 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.rhkb.cn/news/443278.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TM1618控制共阳极数码管的数据传送问题

数据传送中的问题 首先每个字节是按照一个地址写入的,而共阳极数码管的公共端是SEG引脚连接的。这使得数码管显示的编码是按照竖向的字节。如下图所示中,横向是公共端,竖向是实际编码字符字节。 数据转换方式 这样可以一次写入所有需要显示…

腾讯云SDK项目管理

音视频终端 SDK(腾讯云视立方)控制台提供项目管理功能,您可参照以下步骤为您的应用快速添加音视频通话能力和多人音视频互动能力。 若需正式开发并上线音视频应用,请在完成创建后,参照 集成指南 进行开发包下载、集成…

yolov11人物背景扣除

有时候我们需要对图片进行背景扣除和替换,本文将基于yolov11对一张图片进行背景扣除,对视频的处理同理。 安装 pip install ultralytics 2 、获取测试图片 3、代码 from ultralytics import YOLO import cv2 import nu

【概率论】泊松分布

泊松分布 若 ,则 归一性 例子 泊松分布多出现在当X表示一定时间或一定空间内出现的事件的个数这种场合,如在一定时间内某交通路口所发生的事故的个数。 将泊松分布假设为二项分布 假设条件: (1)泊松分布一般为一段时间或一…

ChatGPT:引领人工智能新潮流!

一、ChatGPT 是什么? 1. ChatGPT 的强大功能和广泛应用。 ChatGPT 作为一款先进的 AI 语言模型,拥有众多强大功能。它可以进行文本生成、文本分类、情感分析、机器翻译等多种自然语言处理任务。同时,ChatGPT 还能进行对话式交互,…

C++版iwanna2

第二篇目录 程序的流程图程序游玩的效果下一篇博客要说的东西 程序的流程图 #mermaid-svg-lFW0ZjCdi5Xvl3gE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lFW0ZjCdi5Xvl3gE .error-icon{fill:#552222;}#mermaid-s…

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备,用于监控和控制网络流量,以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机,也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略,对进出的通信流…

Window系统编程 - 文件操作

前言 各位师傅大家好,我是qmx_07,今天主要介绍使用windows系统编程操作读写文件 文件 CreateFile()函数讲解 介绍:该函数用于打开文件或者I/O流设备,文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和…

Java Collection接口

01 Collection体系 1.Collection是父接口,List和Set是子接口,用于实现父接口。接口不能被实例化,因为接口没有构造方法。 2.第三行和第四行的class就是这些接口的实现类。 02 Collection父接口 1.特点:代表一组任意类型的对象、…

【计算机毕设】springboot-家具销售电商平台(附源码)

摘 要 Abstracts 目 录 第1章 绪论 1.1课题背景 1.2研究意义 1.3研究内容 第2章 技术介绍 2 2.1相关技术 3 2.2 Java技术 3 2.3 MySQL数据库 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第3章 需求分析 5 3.1需求分析概述 6 3.2可行性分析 6 3.2.1经济可行性 6 3.2.2技…

十二、血条UI

一、制作血条UI 注:一般不用Slider制作血条;而是用两个Image制作,选择为填充 使用Slider滑动条制作UI 人物血条:背景深绿色;滑条浅绿色 在场景中的画布选择为OverLay 敌人血条: 在预制体里面制作&#x…

VUE 开发——Vue学习(二)

一、watch侦听器 作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 简单写法 <div id"app"><textarea v-model"words"></textarea></div><script>const app new Vue({el:#app,data: {words: },watch…

ai论文写作软件哪个好?分享5款ai论文题目生成器

在当前的学术研究和写作领域&#xff0c;AI论文写作软件已经成为提高效率和质量的重要工具。根据多个来源的评测和推荐&#xff0c;以下是五款值得推荐的AI论文写作软件&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…

扭蛋机深受年轻人欢迎,线上扭蛋机小程序发展优势

近几年&#xff0c;扭蛋机一直处于高速发展阶段&#xff0c;市场发展前景逐渐扩大。扭蛋机的玩法可以激发年轻人追求刺激的心理&#xff0c;从而提高扭蛋机的吸引力。在扭蛋中带来的不确定性和刺激性&#xff0c;能够提高消费者的体验感&#xff0c;满足消费者的娱乐休闲需求&a…

Qt开发环境的搭建

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt开发环境的搭建 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. Qt开发工具概述 Qt…

【分立元件】案例:电感焊盘部分发黑原因有什么?

大家都知道正常的一体成型电感的PIN脚外观如下图所示: 其中要求对电极的验收要求可能有几个关注点,如:电极偏位、划痕、凸起、生锈、孔洞等。 但是在工作过程中,前段时间,有同事咨询电感来料焊盘存在发黑现象的原因是什么。 对于这方面其实我也不懂,但通…

通信工程学习:什么是RIP路由信息协议

RIP&#xff1a;路由信息协议 RIP&#xff08;Routing Information Protocol&#xff09;路由信息协议是一种基于距离矢量算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系统&#xff08;AS&#xff09;内部进行路由信息的交换和传播。以下是关于RI…

Base64字符串转图片在线工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 Base64编码&#xff0c;作为一种将二进制数据转换为文本格式的方法&#xff0c;其核心在于利用64个可打印字符来表征任意的二进制信息。这一编码方式的出现&#…

一些零散的和编译相关的语法/flash-attn涉及语法扫盲

#pragma once&#xff1a;一个编译指令&#xff0c;用于防止头文件被多次包含。当编译器遇到#pragma once时&#xff0c;它会确保该头文件在一个编译单元&#xff08;一个.cpp文件及其包含的所有文件&#xff09;中只会被包含一次。即使该文件被间接包含多次&#xff0c;编译器…

用于图像识别的判别图正则化技术

本文所涉及所有资源均在 传知代码平台 可获取。 目录 论文概述 图正则化技术及其优点 算法流程 在标准BLS中嵌入判别图正则化的方法 模型整体架构 代码复现 图拉普拉斯矩阵的构建——generateLmatrix.py文件 复现模型整体架构——bls2deep_graph.py文件 顶层文件——GBLS.py文件…