大学生课程设计报告--基于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.xdnf.cn/news/1559113.html

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

相关文章

前端性能优化全面指南

前端性能优化是提升用户体验的关键,页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法,从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件:将多…

文献下载/影响因子查询/文献检索/文献翻译平台推荐

文献下载平台 科研通 文献互助平台 - 科研通(AbleSci.com) 每天签到可领10积分,右上角求助文献,一篇10积分,基本实现免费下载。 尽量输入doi(类似文献id),如果没有doi则输入标题作者摘要等信息&#xff0…

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

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

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…

这个问题做项目的时给某些客户普及过,这里再给你普及一下

有些因素不是地理概念,没错!但与地理有关!可以通过地理位置将他们链接起来,再结合其它业务数据,完成数据分析!例如百度地图会将:餐饮、文化、交通、住宿、甚至价格、天气与位置关联分析&#xf…

超越单线程:Web Worker 在前端性能中的角色

在当今快速发展的数字时代,用户对网页性能的期待已经达到了前所未有的高度,想象一下,当你打开一个网站,瞬间加载、流畅操作,没有任何卡顿和延迟,这种体验无疑会让你倍感惊喜。然而在前端开发中,…

@Service代替@Controller注解来标注到控制层的场景?

在SpringBoot开发中,Controller和Service基本上是日常开发中使用的最频繁的两个注解。但你有没考虑过Service代替Controller注解来标注到控制层的场景?换言之,经过Service标注的控制层能否实现将用户请求分发到服务层的功能? 前言…

【斯坦福CS144】Lab5

一、实验目的 在现有的NetworkInterface基础上实现一个IP路由器。 二、实验内容 在本实验中,你将在现有的NetworkInterface基础上实现一个IP路由器,从而结束本课程。路由器有几个网络接口,可以在其中任何一个接口上接收互联网数据报。路由…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求,市面上涌现出了众多优秀的翻译工具,福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天,我们就来对比一下这些翻译工具,看看它们各自的特点和优势。 福昕在线翻译:专业精准&#xf…

高效开发,低代码平台如何助力构建内部工具

Zoho Creator是低代码平台,助力快速构建内部工具,如审批、订单、销售管理等,提升生产力、客户满意度,并减轻管理负担。平台提供拖放界面、集成数据库等功能,入选Gartner低代码平台“魔力象限”。 一、什么是内部工具&a…

虚拟机没有网络怎么解决

CentOS7为例 进入虚拟网络编辑器 1.更改设置 2.选中NAT模式点击3点击移除网络 4添加网络,随便选一个 5.点开NAT设置,记住网关 6.DHCP设置,注意虚拟机设置ip必须在起始ip和结束ip范围内 进入虚拟机网络适配器,自定义选中第4步操作…

五、Python基础语法(程序的输入和输出)

一、输入 输入:输入就是获取键盘输入的数据,使用input()函数。代码会从上往下执行,当遇到input()函数,就会暂停执行,输入内容后,敲回车键,表示本次的输入结束。input函数得到的数据类型都是字符…

python none代表什么

python中None代表一个特殊的空值,即为一个空对象,没有任何的值。 一般用于assert,判断,函数无返回时的默认,具体如下: 1、assert断言: mylist [a, b, c] >>> assert len(mylist) is…

用包目录结构Python脚本,简陋而强大

模块清晰易于管理,模块代码以*.py脚本呈现,方便维护和扩展。 (笔记模板由python脚本于2024年10月09日 18:21:52创建,本篇笔记适合喜欢Python和编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ …

java内存控制

Java 内存控制是一个相对复杂但至关重要的主题,它涉及到如何高效地管理Java应用程序中的内存资源。在Java中,内存管理主要由Java虚拟机(JVM)负责,包括内存的分配和回收。尽管如此,作为开发者,我…

Kali Linux中安装配置影音资源下载神器Amule

一、Debian系列Linux安装amule命令: sudo apt update sudo apt-get install amule amule-utils 二、配置Amule的要点: 1、首次运行Amule,提示是否下载服务器列表,点击是。 2、搜索选项的类型选择全球,类型的默认选项…

openwrt 配置4G网卡 simcom7600ce

文章目录 概述配置并烧录系统,实现识别4G模组编译选项配置修改usb的option.c文件编译源码,烧录固件 配置4G模组成为网卡设置4G模组驱动参数模组拨号添加网卡接口ping百度验证网络 开机启动脚本 概述 在mt7628芯片上,操作系统使用openwrt21.0…

每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

目录 牛客_AB13【模板】拓扑排序 题目解析 C代码 Java代码 牛客_AB13【模板】拓扑排序 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com) 描述: 给定一个包含nn个点mm条边的有向无环图,求出该图的拓扑序。若图的拓扑序不唯一,输出任意合法…

【C++】面向对象之继承

不要否定过去,也不要用过去牵扯未来。不是因为有希望才去努力,而是努力了,才能看到希望。💓💓💓 目录 ✨说在前面 🍋知识点一:继承的概念及定义 •🌰1.继承的概念 •&…

小赢卡贷公益行:乡村振兴与多元公益并进

在金融科技的浪潮中,小赢卡贷不仅以其创新的金融产品和服务赢得了市场的广泛认可,更以其背后的公益之心,积极履行社会责任,传递着温暖与希望。小赢公益基金会,作为小赢卡贷社会责任的延伸,主要聚焦于乡村振…