「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
文章简介:
在我们学习完JavaSE之后,急需要自己动手开发一些JavaSE的综合性项目来练练手,综合提升自己的编码能力,巩固所学的JavaSE知识,那么这篇文章就是一套基于JavaSE实现的俄罗斯方块游戏项目,那么这个项目非常适合大家来练手,在下文中会带着大家一步一步地实现这个俄罗斯方块游戏的各个功能,通过学习筑牢你所学的JavaSE基础。
1. 准备工作
JDK8.0
IntelliJ IDEA
2. 所使用素材
小方块 :
游戏背景图片:
3. 编写小方块类
、
以上就是俄罗斯方块的七种图形,每个图形都是有4个小方格组成,则抽象出一个小方块类Cell
小方块属性:行、列、每个小方块的图片
方法:左移一格left、右移一格right、下降一格drop,并且编写为实体类,
具体代码如下:
4. 编写四方格父类
1、俄罗斯方块的七种图形都有一些共同特征:
都有4个小方格组成、都可以进行左移、右移、下落、变形,但是变形相对比较复杂,暂时先不在父类中编写代码。
2、创建一个四方格父类Tetromino
- 属性:Cell数组用于创建4个小方块
- 方法:moveLeft()、moveRight()、softDrop(),
- 具体代码如下:
5. 创建7个不同的形状
7个不同的形状分别使用I、T、L、J、S、Z、O表示,形状都要继承四方格父类Tetromino,7个形状主要是初始化各形状的位置
编写I形状,具体代码如下:
其他6个形状也需要继承四方格父类即可
6. 编写俄罗斯方块类
7个不同的形状主要是初始化形状的位置,单元格的背景图片使用的是静态成员,在俄罗斯方块主类的静态代码块中需要先初始化游戏资源,方便后面使用。
编写俄罗斯方块类Tetris并继承JPanel框架,通过重写JPanel方法完成游戏的制作,具体代码如下:
再在7个不同的形状中初始化形状的各位置
7. 随机生成四方格
在四方格父类中,编写随机生成四方格的静态方法,因为共计有7个不同的形状,因此(int)(Math.random() * 7)来表示7个不同的形状,具体代码如下:
在俄罗斯方块类Tetris中,抽象相应的成员:
- currentOne表示正在下落的方块
- nextOnt表示将要下落的方块
- wall表示游戏主区域
具体代码如下:
8. 创建游戏场景
在Tetris中创建一个main方法,在main方法中创建游戏场景,窗口的尺寸为810 * 940像素。具体代码如下:
运行效果如下:
9. 绘制游戏背景
首先在main方法中添加以下两行代码,建议编写在JFrame frame = new JFrame(“俄罗斯方块”);语句下面,具体如下:
10. 绘制游戏
重写JPanel中的paint方法,绘制游戏背景, 具体如下:
运行效果如下:
11. 绘制游戏主区域
绘制游戏主区域paintWall,是一个18行9列的二维数组,每个单元格的宽度和高度值为48像素,在绘制时需要判断小方格也就是wall[i][j]是否有小方格,如果没有则绘制矩形,否则获取小方格图片嵌入墙中。
在paint方法中调用paintWall方法,具体代码如下:
运行效果如下:
运行发现游戏主区域在游戏背景当中并不是左上角的位置,因此需要在paint方法中添加偏移值,也就是平移坐标的位置,具体代码如下:
运行效果如下:
12. 绘制正在下落的四方块
首先获取随机生成四方格赋给Cell数组,然后遍历Cell数组,取得每个小方格的行号和列号乘以宽度值,将每个小方格作为图片画到游戏主区域中,然后再在paint方法中调用,具体代码如下:
运行效果如下:
13. 绘制下一个将要下落的四方块
原理与绘制正在下落的四方块一样,需要设置偏移量,具体代码如下:
运行效果如下:
14. 绘制游戏得分
首先,需要创建一下用于存储游戏分数的值:
- scores_pool表示游戏分数池,根据一次消除行数的数量不同,得到不同的分数,消除一行得1分,消除两行得2分,消除3行得5分,最多消除4行得10分
- totalScore表示当前获得的游戏分数
- totalLine表示当前已消除的行数
编写paintScore方法绘制游戏得分:
- g.setFont设置字符串的格式,比如:字体、大小等
- g.drawString用于绘制字符串
具体代码如下:
运行效果如下:
15. 绘制游戏状态
游戏分为三个状态:游戏中、暂停、游戏结束,需要声明常量表示游戏状态,并且定义一个变量存放当前的游戏状态值,具体代码如下:
编写绘制游戏当前状态方法,但是需要先创建一个字符串数组,用来显示游戏状态,具体如下:
当游戏运行时,显示按P键暂停,游戏暂停时,显示按C键继续,游戏结束时,显示按S重新开始。具体代码如下:
运行效果如下:
好啦,今天就先到这里啦,下次咱们接着讲一讲 编写游戏主要逻辑 和 调用游戏逻辑完成游戏操作 的相关教程