前言
贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的;
不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而不是更多边缘设计;
而且,贪吃蛇的设计涉及了多个学科领域,如计算机科学,数学,艺术和心理学,有助于我将所学知识综合运用到实际项目中;
以及贪吃蛇可以培养我的算法思维,通过写算法去决定如何让蛇在屏幕中进行移动,如何处理蛇头与食物的碰撞,对我的算法锻炼真的起到了很好的作用;
贪吃蛇游戏的设计也可以锻炼我的模块化编程思想,如将贪吃蛇这款游戏分为不同模块,如游戏界面,游戏逻辑,控制模块等等;
以上就是我对贪吃蛇这款游戏作为我的课程设计作业的理由。
系统设计思路
系统整体架构
贪吃蛇通过GUI图形界面来使图像渲染到程序中,并通过帧的概念来进行定时器的设计,使画笔每次重画的次数大于一秒十次,通过人眼能够捕捉到的帧数,来达到动画的效果,再通过键盘输入的监控来实现与玩家的交互,通过事件的判断来控制游戏的开始和结束,这是这个游戏的基本制作流程。
模块划分
贪吃蛇这个游戏总共分为三个大模块,其中还有一些小的模块
- 导入图片变量模块
- 创建显示GUI模块
- 游戏及其对应的操作逻辑实现模块
- 初始化模块
- 渲染模块
- 用户交互模块
- 游戏逻辑模块
各模块之间的逻辑
- 导入图片模块为渲染模块提供了现成的图片与画板进行缝合
- 游戏及对应的操作逻辑模块实现为创建显示GUI模块具体显示什么内容提供了具体实例
- 创建显示GUI模块为游戏及对应的操作逻辑模块在什么窗口下进行实现提供了位置
- 初始化模块为游戏逻辑模块提供了初始的变量值,使其可以进行判断交互
- 用户交互模块为游戏逻辑模块中的小蛇的移动以及游戏状态的开始结束与否提供了具体指示
- 渲染模块使用户交互模块再监听事件后可以得到图像变化的反馈
系统的设计过程
创建显示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
并实现了KeyListener
和ActionListener
接口。作用为实现游戏操作逻辑,用户与键盘的交互反馈,面板的渲染
其中,
- 继承自
JPanel
,这意味着它可以作为Swing组件添加到窗口中 - 实现了
KeyListener
接口,允许类处理键盘事件 - 实现了
ActionListener
接口,允许类响应定时器事件。
类中的成员变量有:
length
:记录小蛇的长度。snakeX
和snakeY
:数组,分别存储小蛇身体的x和y坐标。fx
:字符串,表示小蛇当前移动的方向。random
:用于生成随机数,确定食物的位置。foodx
和foody
:存储食物的坐标。isStart
:布尔值,表示游戏是否开始。timer
:定时器,用于控制游戏刷新速度。bigfoodx
和bigfoody
:分别存储大食物的x和y坐标boomx
和boomy
:分别存储炸弹的x和y坐标have
:用于决定下一帧是否渲染大食物bigfood
:用于判断大食物出现的时机score
和level
:分别为游戏的分数和等级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(