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;

}

相关文档
最新文档