java课程设计实验报告俄罗斯方块
成绩评定表
课程设计任务书
目录
1.课设软件主要功能 (1)
2.类总体设 (1)
2.1类组合关系图 (1)
2.2主类 (2)
2.3其它类 (2)
3.类详细设计 (2)
3.1 ERS_Block主类 (2)
3.2 Command处理控制类 (4)
3.3 GameCanvas游戏画布类 (4)
3.4 Block方块类 (6)
4.关键类成员函数流程图及代码 (7)
5.软件运行结果 (17)
结论 (20)
参考文献 (20)
1.课设软件主要功能
本系统是一个俄罗斯方块游戏的系统设计[1],实现的基本功能就是能实现经典俄罗斯方块游戏的基本功能。如用键盘上的空格下左右键来控制方块的变形,移动等功能。点击控制面板上的开始游戏,游戏暂停,提高级数,降低级数退出游戏等按钮来实现游戏的开始,暂停,停止游戏,增加难度,降低难度等功能。
图1.1功能图
2.类总体设计
2.1类组合关系图
图2.1. 类组合关系图
2.2主类
ERS_Block继承Frame类负责游戏全局的控制[2]。对开始游戏、暂停/继续游戏、结束游戏、等级设置。玩家可自行设定游戏等级,主要提供10种级别,级别越高,游戏速度越快,难度越大
2.3其他类
1.Mypanel继承Panel类。
2.Block是方块类控制块的移动,下落变形功能。七种类型方块的父类,定义了所有类型方块的共同特征和行为。
3.GameCanvas是游戏画布类,继承Canvas类,界面设计应遵循简介美观方便易用的基本原则在游戏区显示方块。
https://www.360docs.net/doc/b111173211.html,mand类是控制按钮类。
5.MyTimer类继承自线程类Thead。包含run()方法,sleep()方法,控制游戏的速度。
6.WinListener类继承WindowAdapter类。
3.类详细设计
3.1ERS_Block主类
图3.1主类数据透视图
定义成员变量[3]
①右边信息窗体的布局
MyPanel infoScr = new MyPanel();
infoScr.setLayout(new GridLayout(4,1,0,5));
infoScr.setSize(120,300);
②定义标签和初始值
Label scorep = new Label("分数:",Label.LEFT);
Label levelp = new Label("级数:",Label.LEFT);
③右边控制按钮窗体的布局
MyPanel controlScr = new MyPanel();
controlScr.setLayout(new GridLayout(5,1,0,5));
rightScr.add(controlScr);
④定义按钮play
Button play_b = new Button("开始游戏");
play_b.setSize(new Dimension(50,200));
定义按钮Level UP
Button level_up_b = new Button("提高级数");
level_up_b.setSize(new Dimension(50,200));
⑤定义按钮Level Down
Button level_down_b =new Button("降低级数");
level_down_b.setSize(new Dimension(50,200));
⑥定义按钮Level Pause
Button pause_b =new Button("游戏暂停");
pause_b.setSize(new Dimension(50,200));
⑦定义按钮Quit
Button quit_b = new Button("退出游戏");
quit_b.setSize(new Dimension(50,200)); ;
成员方法
①俄罗斯方块类的构造方法
方法定义:ERS_Block(String title)
②isGameOver方法
方法定义:private boolean isGameOver()
功能描述:该方法是判断游戏是否该结束了,只需要判断窗口中的最顶端那一行中是否有方块,同时也要判断最底端的是否也有,如果都有即结束。
3.2Command处理控制类
图3.2Command类数据透视图
成员变量[4]:
给按钮编号
int button_play
int button_levelup
int button_leveldown
int button_quit ;
int button_pause
int curButton;
GameCanvas scr;
成员方法:
①控制按钮类的构造方法
方法定义:Command(int button,GameCanvas scr)
②按钮执行方法
方法定义:public void actionPerformed (ActionEvent e) 功能:点击按钮实现游戏的开始,结束,升级,降级,暂停[5]。
3.3GameCanvas游戏画布类
图3.3GameCanvas类数据透视图
成员变量:
小方块边长:final int 0unitSize = 30
正方格的行数: int rowNum
方格的列数:int columnNum
允许有多少行未削:int maxAllowRowNum
新出现块的起始行坐标:int blockInitRow
出现块的起始列坐标: int blockInitCol
屏幕数组: int [][] scrArr
对方快的引用:Block b
2.画布类的构造方法
成员方法[5]:
①初始化屏幕,并将屏幕数组清零的方法
方法定义:void initScr()
②重新刷新画布方法
方法定义:public void paint(Graphics g)
③画方块的方法
方法定义: public void drawUnit(int row,int col,int type)
功能:以背景为颜色画,画正在下落的方块,画已经落下的方块。
④块的初始v行坐标方法
方法定义: public int getInitRow()
返回新块的初始行坐标:return(blockInitRow)
⑤返回新块的初始列坐标方法
方法定义:public int getInitCol()
返回新块的初始列坐标:return(blockInitCol)
⑥满行删除方法
方法定义:void deleteFullLine()
功能:这个就是实现如何将行消除的,其实就是在判断了该行该消除时候将上面的方块都向下平移一格,这样在实现程序界面也就给玩家是消一行的视觉效果[6]。
3.3Block方块类
图3.3Block类数据透视图
成员变量:
块的模式编号:int blockType;
块的翻转状态:int turnState;
块的下落状态:int blockState;
块在画布上的坐标:int row,col;
GameCanvas scr;
成员方法:
1)fallDown方法
方法定义:public void fallDown ()
功能描述:实现方块的运行,下落。
2)leftMove()
方法方法定义:public synchronized boolean leftMove() 功能描述:将当前画移动到所左面的位置。
3)rightMove()方法
方法定义:private boolean rightMove ()
功能描述:将方块想右边移动。
4)方法
方法定义:public void turnNext()
功能描述:实现方块的旋转。
5)leftturn方法
方法定义:private synchronized boolean leftturn()
功能描述:将当前块实现翻转。
6)deleteFullLine方法
方法定义:private boolean deleteFullLine()
功能描述:实现满行删除的方法。
7)erase方法
方法定义:private void erase()
功能描述:将当前块从画布的对应位置移除。
8)display方法
方法定义:private void display()
功能描述:实现重画画布的时候显示当前块
4.关键类成员函数流程图及代码
4.1系统流程图
图4.1系统流程图[7]
4.2源代码[7]
import java.awt.*;
import java.awt.event.*; //俄罗斯方块类
class ERS_Block extends Frame{
public static boolean isPlay=false;
public static int level=1,score=0;
public static TextField scoreField,levelField; public static MyTimer timer;
GameCanvas gameScr;
public static void main(String[] argus){
ERS_Block ers = new ERS_Block("俄罗斯方块游戏 "); WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener);
}
//俄罗斯方块类的构造方法
ERS_Block(String title){
super(title);
setSize(600,480);
setLayout(new GridLayout(1,2));
gameScr = new GameCanvas();
gameScr.addKeyListener(gameScr);
timer = new MyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
Panel rightScr = new Panel();
rightScr.setLayout(new GridLayout(2,1,0,30)); rightScr.setSize(120,500);
add(rightScr); //右边信息窗体的布局
MyPanel infoScr = new MyPanel();
infoScr.setLayout(new GridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr); //定义标签和初始值
Label scorep = new Label("分数:",Label.LEFT);
Label levelp = new Label("级数:",Label.LEFT);
scoreField = new TextField(8);
levelField = new TextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(new Dimension(20,60));
scoreField.setSize(new Dimension(20,60));
levelp.setSize(new Dimension(20,60));
levelField.setSize(new Dimension(20,60));
scoreField.setText("0");
levelField.setText("1"); //右边控制按钮窗体的布局
MyPanel controlScr = new MyPanel();
controlScr.setLayout(new GridLayout(5,1,0,5));
rightScr.add(controlScr); //定义按钮play
Button play_b = new Button("开始游戏");
play_b.setSize(new Dimension(50,200));
play_b.addActionListener(new Command(Command.button_play,gameScr)); //定义按钮Level UP Button level_up_b = new Button("提高级数");
level_up_b.setSize(new Dimension(50,200));
level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));
Button level_down_b =new Button("降低级数");
level_down_b.setSize(new Dimension(50,200));
level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr));
Button pause_b =new Button("游戏暂停");
pause_b.setSize(new Dimension(50,200));
pause_b.addActionListener(new Command(Command.button_pause,gameScr)); Button quit_b = new Button("退出游戏");
quit_b.setSize(new Dimension(50,200));
quit_b.addActionListener(new Command(Command.button_quit,gameScr)); controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
//游戏画布类
class GameCanvas extends Canvas implements KeyListener{
final int unitSize = 30; //小方块边长
int rowNum; //正方格的行数
int columnNum; //正方格的列数
int maxAllowRowNum; //允许有多少行未削
int blockInitRow; //新出现块的起始行坐标
int blockInitCol; //新出现块的起始列坐标
int [][] scrArr; //屏幕数组
Block b; //对方快的引用 //画布类的构造方法
GameCanvas(){
rowNum = 15;
columnNum = 10;
maxAllowRowNum = rowNum - 2;
b = new Block(this);
blockInitRow = rowNum - 1;
blockInitCol = columnNum/2 - 2;
scrArr = new int [32][32];
}
}
//画方块的方法
public void drawUnit(int row,int col,int type){
scrArr[row][col] = type;
Graphics g = getGraphics();
switch(type){ //表示画方快的方法
case 0: g.setColor(Color.black);break; //以背景为颜色画
case 1: g.setColor(Color.blue);break; //画正在下落的方块
case 2: g.setColor(Color.magenta);break; //画已经落下的方法
}
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);
g.dispose();
}
public Block getBlock(){
return b; //返回block实例的引用
}
}
//满行删除方法
void deleteFullLine(){
int full_line_num = 0;
int k = 0;
for (int i=0;i boolean isfull = true; L1:for(int j=0;j if(scrArr[i][j] == 0){ k++; isfull = false; break L1; }