首页 > 编程语言 >大学生课程设计报告--基于JavaGUI的贪吃蛇

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

时间:2024-10-09 22:18:29浏览次数:9  
标签:课程设计 窗口 游戏 -- GUI 逻辑 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):

     //绘制面板 游戏中所有东西都使用这支画笔
        @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(

标签:课程设计,窗口,游戏,--,GUI,逻辑,JavaGUI,贪吃蛇,模块
From: https://blog.csdn.net/wozhaonue_w/article/details/142798039

相关文章

  • 凯撒密码加密以及解密功能实现
    凯撒密码属于古典密码学范畴,本人最近开始学习密码学,今天尝试用python编写一个凯撒密码的加密与解密函数,我觉得过程很有趣,属于暴力美学。一、加密函数凯撒密码的加密过程符合人们的思维习惯,即获取加密密钥之后,对数据进行移动再拼接成一个字符串,核心代码为:chr((ord(i)+key-97/......
  • 积分与多元函数 高数复习笔记
    4.不定积分4.1.定义如果函数F(x)满足F′(x)=f(x),则称F(x)是f(x)的一个原函数。不定积分∫f(x......
  • 从零搭建Cesium+vue3+vite
    介绍在现代前端开发中,Cesium是一个功能强大的WebGL库,广泛应用于3D地球可视化、空间数据展示等领域。结合Vue3的组件化开发模式,我们可以创建一个高效且可维护的3D地图应用。本文将带你一步步搭建一个简单的Cesium+Vue3项目,并且对各个功能模块进行细致划分,帮助你快......
  • Rstudio占用内存过大
    在R中,尤其是在使用RStudio时,如果数据集很大,全部加载到内存可能会导致内存不足的问题。为了优化内存使用,可以考虑以下几种加载策略:1.按需加载数据使用data.table或dplyr包的功能,可以按需加载数据,而不是将整个数据集加载到内存中。例如,可以使用fread()函数从CSV文件......
  • P6277 [USACO20OPEN] Circus P
    做法来自浙江队长,因为其他的题解我一篇都看不懂。考察一条极长的二度链C,即左右端点度数不为\(2\),中间的点度数都等于\(2\),它把整张图分成了左右两部分A和B(端点既属于AB也属于C)。如果\(|C|\gen-k\),那么A和B都一定被占满了,C上的点一定会阻挡A和B之间互换,所......
  • 代码随想录算法训练营day10| 232.用栈实现队列 225. 用队列实现栈 20. 有效的括
    学习资料:https://programmercarl.com/栈与队列理论基础.html栈与队列学习记录:232.用栈实现队列(两个栈(stack_in,stack_out)实现一个队列的行为)点击查看代码classMyQueue(object):def__init__(self):self.stack_in=[]self.stack_out=[]d......
  • 20222426 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    学号202224262024-2025-1《网络与系统攻防技术》实验一实验报告1.实验内容1.1NOP,JNE,JE,JMP,CMP汇编指令的机器码:1.1.1NOP(NoOperation)功能:NOP指令是一条空操作指令,它不做任何事情。执行NOP指令时,处理器的状态(如寄存器值、内存内容等)不会发生变化,只是简单地消耗了一......
  • 【题目解析】蓝桥杯23国赛C++中高级组 - 斗鱼养殖场
    【题目解析】蓝桥杯23国赛C++中高级组-斗鱼养殖场题目链接跳转:点击跳转前置知识:了解过基本的动态规划。熟练掌握二进制的位运算。题解思路这是一道典型的状压动态规划问题。设\(dp_{i,j}\)表示遍历到第\(i\)行的时候,当前行以\(j_{(base2)}\)的形式排列乌龟可以构......
  • 天梯赛随笔
    吉祥矩阵思路:爆搜+剪枝,每一行、每一列搜索至末尾时直接判断该填的数字,可行则继续搜索。对于其他位置只搜索范围内的数字代码://吉祥矩阵#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;introw[5],col[5];inta[5][5];boolcheck(){for(inti=0;......
  • 20222401 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容本次实验是关于缓冲区溢出攻击的,主要的学习内容如下:1.基本Linux命令objdump:将代码段反汇编,在这次实验中主要是用来找地址的。xxd:实现十六进制与二进制的转换,在这次实验的过程中,主要是有两个地方用到了这个命令。一是在打开文件后进行转换,而是以十六进制打开文件,保证......