俄罗斯方块Java程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
俄罗斯方块游戏
一、课题内容和要求
课题内容:俄罗斯方块游戏(Tetris)是一款经典单机游戏,早期常见于各个平台。设计一个俄罗斯方块,玩家根据下落的不同方块形状,通过上、下、左、右四个键实现对方块的左右移动、旋转、下落等控制。游戏中,一共有7种不同的方块形状、每种方块以1/7的概率随机出现,一旦方块到达顶部,游戏结束。当某一个行布满方块时,改行消除。
基本要求:通过图形界面实现俄罗斯方块游戏;能以图形显示游戏运行的过程;实现相应四个键游戏玩家的控制;记录消除的行数。
扩展要求:在上述功能要求的基础上,为了提高成绩,可以添加一些额外的功能;变量、方法命名符合规范;注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释;程序的层次清晰,可读性强。
系统功能要求:
(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 java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import javax.swing.Timer;
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();
//添加菜单条
frame.setJMenuBar(menu);
//菜单
JMenu game = new JMenu("游戏");
//菜单项
JMenuItem newgame = game.add("新游戏");
JMenuItem pause = game.add("暂停");
JMenuItem goon = game.add("继续");
JMenuItem exit = game.add("退出");
//菜单
JMenu help = new JMenu("帮助");
JMenuItem about = help.add("关于");
//添加菜单至菜单条
menu.add(game);
menu.add(help);
//对窗口设置
//居中
frame.setLocationRelativeTo(null);
//关闭程序
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//大小
frame.setSize(220, 275);
//标题
frame.setTitle("俄罗斯方块");
//可见性
frame.setVisible(true);
//不可更改大小
frame.setResizable(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 },