2021年2月9日发(作者:pending)
俄罗斯方块游戏
一、
课
题内容和要求
课题内容:俄罗斯方块游戏(
Tetris
)是一款经典单
机游戏,早期常见于各
个平台。
设计一个俄罗斯方块,
玩家根据下落的不同方块形状,
通过上、
下、<
/p>
左、
右四个键实现对方块的左右移动、旋转、下落等控制。游戏中
,一共有
7
种不同
的方块形状、每种方
块以
1/7
的概率随机出现,一旦方块到达顶部,游戏结束。<
/p>
当某一个行布满方块时,改行消除。
基
本要求:
通过图形界面实现俄罗斯方块游戏;
能以图形显示游戏
运行的过
程;实现相应四个键游戏玩家的控制;记录消除的行数。
扩展要求:在上述功能要求的基础上,为了提高成绩,可以添加一些额外的功
能;变量、方法命名符合规范;注释详细:每个变量都要求有注释说明用途;函
数有注释说明功能,
对参数、
返回值也要以注释的形式
说明用途;
关键的语句段
要求有注释解释;程序的层次清晰,可
读性强。
系统功能要求:
(
1
)
界面设定
玩家可以在界面左侧的游戏
区中堆积方块,游戏区上面有“游戏”
“帮助”
两个选项,界面右侧为游戏得分,玩家在游戏过程中随时可以查看游戏得分。
(
2
)
游戏控制
不同的随机图形会从区域上方缓慢落下,
通过键盘的左、右、下键可以控
制方块以一格为单位左右移动,长按实现快速移动;
上键能以
90
度为单位旋转
每一方块;
区域中横向格子方块填满,则该行会自动消除并为玩家的得分
;当
固定的方块推到区域最上方,则游戏结束。
二、
需
求分析
1.
需求分析
图
-1
俄罗斯方块游戏需求分析
2.
任务及实现方式
(
1
)
绘制游戏区域
通过绘制地图方块、已经固定的方块和运动中的方块来实现
(
2
)
实现键盘对方块的实时控制
添加键盘监听者和方块位置移动的函数
(
3
)
记录消除行数
添加记分函数和
Graphics
类的
drawString
函数实现
(
4
)
游戏结束
添加判断游戏结束函数并给出提示
3.
预期效果
(
1
)
实现俄罗斯方块游戏的动态显示
(
2
)
实现键盘对方块各种操作
(
3
)
实现消行、记分
(
4
)
游戏能够正确结束
三、
概
要设计
1.
主要功能流程图
说明:游戏流程较为复杂,流程图粗略显示部分流程
图
-2
主要功能流程图
2.
主要类及类之间的关系的
UML
图
图
-3
Class Tetris
图
-4
Class Tetrisblok
图
-5
RelationShip
四、源程序代码
import
.*;
import Event;
import
Listener;
import nt;
import
tener;
import .*;
import
public class Tetris extends
JFrame {
public Tetris() {
Tetrisblok a =
new Tetrisblok();
addKeyListener(a);
add(a);
}
public static void main(String[] args)
{
Tetris frame
= new Tetris();
//
菜单条
JMenuBar menu = new JMenuBar();
//
添加菜单条
nuBar(menu);
//
菜单
JMenu game = new
JMenu(
游戏
//
菜单项
JMenuItem newgame =
(
新游戏
JMenuItem
pause =
(
暂停
JMenuItem goon
= (
继续
JMenuItem
exit = (
退出
//
菜单
JMenu help = new
JMenu(
帮助
JMenuItem
about = (
关于
//
添加菜单至菜单条
}
}
(game);
(help);
//
对窗口设置
//
居中
ationRelativeTo(null);
//
关闭程序
aultCloseOperation(_ON_CLOSE);
//
大小
e(220, 275);
//
标题
l
e(
俄罗斯方块
//
可见性
ible(true);
//
不可更改大小
izable(false);
//
创建俄罗斯方块类
class
Tetrisblok extends JPanel implements KeyListener {
// blockType
代表方块类型
//
turnState
代表方块状态
private int blockType;
private int turnState;
private int score = 0;
private int x;
private int y;
private int i
= 0;
int j = 0;
int flag = 0;
//
定义已经放下的方块
x=0-11,y=0-21;
int[][] map = new int[13][23];
// 7
种方块类型,每一个方块有
4
种旋转状态,使用
16
位数字表示一种
旋转状态
private final int
shapes[][][] = new int[][][] {
// i
{ { 0, 0, 0, 0, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{
0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0 } },
// s
{ { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 1, 0,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{
1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }
},
// z
{ { 1, 1, 0, 0,
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{
0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 1, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0 } },
// j
{ { 0, 1, 0, 0, 0, 1, 0, 0,
1, 1, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0,
1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{
1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0 } },
// o
{ { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0 },
{ 1, 1, 0, 0, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 0, 0,
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{
1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
},
// l