【俄罗斯方块项目】Java项目游戏开发详细教程-下

215 阅读4分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

文章简介:

在我们学习完JavaSE之后,急需要自己动手开发一些JavaSE的综合性项目来练练手,综合提升自己的编码能力,巩固所学的JavaSE知识,那么这篇文章就是一套基于JavaSE实现的俄罗斯方块游戏项目,那么这个项目非常适合大家来练手,在下文中会带着大家一步一步地实现这个俄罗斯方块游戏的各个功能,通过学习筑牢你所学的JavaSE基础。

建议从开头开始看

16. 编写游戏主要逻辑

1、判断方块是否出界

image.png

2、判断方块是否重合

image.png

3、按键一次四方格左移一次

image.png

4、按键一次四方格右移一次 image.png

5、四方格变形

四方格变形需要记录每个小方块在不同形状时相对于第一个小方块的(也就是:序号为0小方块)相对位置。

操作步骤:

  • 需设置一个计数器,用计数器对当前状态取余即可。
  • 但是不同的四方格旋转的次数不同,比如:有旋转4次、有旋转2次也有旋转0次的。
  • 首先,在四方格父类Tetromino中添加旋转状态属性和计数器,计数器的取值最好设置为能被4整除的数
  • 在四方格父类中编写一个内部类旋转状态State,属性:存储四方格各元素的相对位置,编写实体类

具体代码如下:

image.png

image.png

6、初始化7个形状的相对坐标

I共计有两种旋转状态,在I无参构造方法中初始化两种状态的相对坐标,具体代码如下:

image.png

image.png

T共计有四种旋转状态,在T无参构造方法中初始化四种状态的相对坐标,具体代码如下:

image.png

image.png

L共计有四种旋转状态,在L无参构造方法中初始化四种状态的相对坐标,具体代码如下:

image.png

image.png

J共计有四种旋转状态,在J无参构造方法中初始化四种状态的相对坐标,具体代码如下:

image.png

image.png

S共计有两种旋转状态,在S无参构造方法中初始化两种状态的相对坐标,具体代码如下:

image.png

image.png

Z共计有两种旋转状态,在Z无参构造方法中初始化两种状态的相对坐标,具体代码如下:

image.png

image.png

O共计有零种旋转状态

image.png

image.png

7、编写顺时针旋转四方格方法

在四方格父类Tetromino类中创建顺时针旋转四方格方法rotateRight,具体代码如下:

image.png

8、判断游戏是否结束

也就是:判断下一个将要出现方块的位置是否有方块,具体代码如下:

image.png

9、消行并计分

当四个方块嵌入墙中,使得行满时则消除满行并将消除行以上的方块下落到对应行数同时计分

1. 创建一个判断当前行是否已满的方法isFullLine,具体代码如下:

image.png

2. 再创建消行方法destroyLine,具体代码如下:

image.png

10、判断四方格能否下落

image.png

11、按键一次四方格下落一个

首先判断能否下落,如果能下落就下移,否则将四方格嵌入墙中,同时判断是否消行,并且还要判断游戏是否结束,如果没有结束,则继续生成四方格,具体代码如下:

image.png

image.png

12、瞬间下落

按一个键四方格瞬间到底,原理同缓慢下落,具体代码如下:

image.png

13、编写逆时针旋转四方格方法

在四方格父类Tetromino类中创建逆时针旋转四方格方法rotateLeft,具体代码如下:

image.png

14、创建顺时针旋转

顺时针旋转也就是向右旋转,当四方格越界或者重合则不需要旋转,具体代码如下:

image.png

17、调用游戏逻辑完成游戏操作

编写一个start方法,用于调用游戏操作逻辑并监听键盘和描述游戏主要逻辑。

1、开启键盘监听事件

通过调用匿名内部类重写keyPressed方法实现按键的响应,具体代码如下:

image.png

根据获取到的按键调用相应的方法做出对应的操作,具体代码如下:

image.png

image.png

必须将俄罗斯方块窗口设置为焦点,具体代码如下:

image.png

2、编写四方格自动下落

当在游戏中时,四方格每隔0.5秒下落一次,直到不能下落,则将四方格嵌入墙中,并且判断消行和游戏是否结束,每次下落都需要重绘一次游戏画面。具体代码如下:

image.png

3、将start方法添加到main方法中

image.png

不懂也可以看相关的视频教程来巩固学习Java基础项目。