1、 关于设计文档详细说明书-俄罗斯方块的实现一、实现此游戏的软件,即开发环境:JCreator;二、目 的:为游戏爱好者设计的一套娱乐软件。三、开发人员:四、具体模块划分如下(功能简要说明 ):1、ErsBlocksGame.java:游戏主类,继承自 JFrame 类,负责游戏的全局控制。内含:1、一个 GameCanvas 画布类的实例引用,2、一个保存当前活动块(ErsBlock)实例的引用,3、一个保存当前控制面板(ControlPanel)实例的引用ErsBox.java:方格类,是组成块的基本元素,用自己的颜色来表示块的外观。2、ControlPanel.java:控制面板类,继承自
2、 JPanel.上边安放预显窗口、等级、得分、控制按钮主要用来控制游戏进程。3、ErsBlock.java:块类,继承自线程类(Thread),由 4 * 4 个方格( ErsBox)构成一个块控制块的移动、下落、变形等4、GameCanvas.java:画布类,内有 * 个方格类实例。继承自 JPanel 类。ErsBlock 线程类动态改变画布类的方格颜色,画布类通过检查方格颜色来体现 ErsBlock 块的移动情况。五、具体模块功能的实现:(1)、ErsBlockGame 类说明( 游戏主类,继承自 JFrame 类,负责游戏的全局控制):import java.awt.*;import
3、 javax.swing.*;import java.awt.event.*;ErsBlockGame 中用到的方法具体说明如下 :1、main() -程序入口函数;2、ErsBlockGame() -构造函数,初始化窗体界面;a、setSize() -窗口大小b、setLocation()-利用屏幕和主窗体的大小差值,使窗口居中;c、createMenu()- 建立并设置窗口菜单;依次添加:菜单栏-bar菜单项-mGame,mControl,mWindowStyle子菜单- mGame-miNewGame,miSetBlockColor,miSetBackColor,miTurnHarder
4、,miTurnEasier,miExit;mControl-miPlay,miPause,miResume,miStop;mWindowStyle-miAsWindows,miAsMotif,miAsMetal依次添加各子菜单的事件监听器:miNewGame-新游戏a、stopGame()- 先停止原来的游戏 (判断 ErsBlock 类对象 Block 是否为空,如不为空,即调用它的 pauseMove()方法,即 stoping 为 ture);b、reset() -重新还原状态(分别调用 ctrlPanel.reset()控制面板复位和 canvas.reset()画布复位);c、set
5、Level() -设置级别为初始值为 5miSetBlockColor-设置活动的方块的色(JColorChooser.showDialog 选择颜色对话框)miSetBackColor-设置画布的背景色(同上)miTurnHarder-设置高一级的级别(getLevel()与 MAX_LEVEL 的比较,再调用setLevel()miTurnEasier-设低一级的级别(getLevel() 与 Min_LEVEL 的比较,再调用setLevel()miExit -退出miPlay-开始游戏( 调用 playGame()=this.play()=this.reset()=新建线程并启动sta
6、rt()=调用 Game(此类实现 Runnable 接口)的 run()方法 =判断 block 是否为空,判断checkFullLine()是否有满行,判断游戏是否结束;随机产生画布类的方块类型和控制面板类的方块类型)miPause-停止游戏(调用 pauseGame()miResume-唤醒游戏 (调用 resumeGame()=判断 ErsBlock 类对象 Block 是否为空,如不为空,即调用它的 resumeMove()方法,即 stoping 为 false)miStop-停止游戏( 调用 stopGame()=判断 ErsBlock 类对象 Block 是否为空,如不为空,即
7、调用它的 stopMove()方法,即 moving 为 false)miAsWindows-设置为 windows 界面(调用 this.setWindowStyle(),再调用canvas,ctrlPanel 的 fanning()miAsMotif -设置为 motif 界面(同上)miAsMetal -设置为 metal 界面(同上)mguanyu -关于对话框;d、canvas -创建画布类对象(调用 canvas 的构造函数);e、ctrlPanel -创建控制面板类对象( 调用 ctrlPanel 的构造函数);f、addWindowListener- 添加窗口适配器( 调用 s
8、topGame();g、addComponentListener-添加组件适配器(调用 canvas.fanning();h、show() -显示窗体 ;i、canvas.fanning() -根据窗口的大小,自动调整方格的尺寸;j、以下为外部类调用的方法 :isPlaying()-判断游戏是否还在进行;getCurBlock()-得到当前活动的块;getCanvas()-得到当前画布 ;getScore()-得到游戏积分;getScoreForLevelUpdate()-得到自上次升级以来的游戏积分,升级以后,此积分清零;levelUpdate()-当分数累计到一定的数量时,升一次级;rep
9、ortGameOver()-报告游戏结束了;2、内部类:GameMethord: checkFullLine()-检查是否有全填满的行;run() -游戏启动之处;isGameOver() -判断游戏是否已经结束;a、reportGameOver()-报告游戏结束了;3、内部类:AboutDialog-显示关于对话框;(2)、ErsBox 类的说明:(方格类,是组成块的基本元素,用自己的颜色来表示块的外观 )ErsBox 中用到的方法具体说明如下:1、ErsBox()-方格类的构造函数,接受一个布尔值,判断是否用前景色来添丛方块2、clone() -Cloneable 接口的抽象方法在此实现3
10、、setSize()-设置方格的尺寸4、getSize()-得到此方格的尺寸5、isColorBox()-判断是否用前景色来表现此方块6、setColor-设置方格的颜色(3)、ControlPanel 类:import javaz.swing.*;import javax.swing.border.Border;import javax.swing.border.EtchedBorder;import java.awt.*;import java.awt.event.*;包含的参数:private JTextField tfLevel = new JTextField(“ + ErsBloc
11、ksGame.DEFAULT_LEVEL),tfScore = new JTextField(“0“);定义两个文本域分别用来显示游戏级别和得分。private JButton btPlay = new JButton(“Play“), btPause = new JButton(“Pause“),btStop = new JButton(“Stop“), btTurnLevelUp = new JButton(“Turn hard“),btTurnLevelDown = new JButton(“Turn easy“); 定义五个按钮private JPanel plTip = new JP
12、anel(new BorderLayout(); 定义预制窗口面版()private TipPanel plTipBlock = new TipPanel(); 定义预制窗口类的一个实例private JPanel plInfo = new JPanel(new GridLayout(4, 1);定义游戏级别和得分的面版(4行 1 列)private JPanel plButton = new JPanel(new GridLayout(5, 1);定义按钮面版(5 行 1 列)private Timer timer;定义 Timer 类的一个对象。private ErsBlocksGame
13、game;定义 ErsBlocksGame 类的一个实例。private Border border = new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(148, 145, 140);定义面版的边框。包含的方法:A、ControlPanel:类的构造函数继承面版类(布局方式为网格布局 3 行 1 列)用来摆放:按钮(btPlay、 btPause、btStop、btTurnLevelUp、btTurnLevelDown)、文本域(tfLevel、 tfScore)、预显框(border)及按钮的监听事件。按钮的监听事件包
14、括:addKeyListener(new ControlKeyListener():调用内部类ontrolKeyListenerbtPlay.addActionListener:btPlay 按钮的监听事件,调用ErsBlocksGame 类的 playGame 方法。开始一个游戏。btPause.addActionListener:btPause 按钮的监听事件,调用ErsBlocksGame 类的 pauseGame 方法。通过判断按钮的文字实现游戏暂停和游戏继续。btStop.addActionListener:btStop 按钮的监听事件,调用 ErsBlocksGame 类的stop
15、Game 方法btTurnLevelUp.addActionListener:提高级别按钮的监听事件,通过 tfLevel文本域显示的级别与 ErsBlocksGame 类的变量 MAX_LEVEL 比较,小于则加 1btTurnLevelDown.addActionListener:降低级别按钮的监听事件,通过tfLevel 文本域显示的级别判断 level 是否大于 1,大于 1 则减 1。addComponentListener(new ComponentAdapter():组建监听事件。当预显窗口改变大小时调用 TipPanel 类的 fanning()方法。初始化 timer:B、s
16、etTipStyle(int style):设置预显窗口中方块的样式,对应 ErsBlock 类的 STYLES 中的 28 个值。调用 TipPanel 类的 setStyle(style)方法。将 style 参数传递给 setStyle.C、unsetTipStyle():清空预制面版。调用 TipPanel 类的 unsetStyle()方法。D、getLevel():取得用户设置的游戏等级 (level)。返回 level 得值。(被主函数调用)E、setLevel(int level):让用户修改游戏难度等级。(被主函数调用)F、setPalyNuttonEnable(boolea
17、n enable):设置开始按钮的状态。Ture 为可用 ,False 为不可用。G、setPauseButtonLable(boolean pause):设置暂停按钮的状态。(被主函数调用)H、setBtTurnLevelUpEnable(boolean enable):设置“选择级别”按钮的状态。Ture 为可用 ,False 为不可用。(被主函数调用 )I、setBtTurnLevelDownEnable(boolean enable):设置“选择级别”按钮的状态。Ture 为可用 ,False 为不可用。(被主函数调用 )J、reset():重置控制面版,将游戏积分清零,预显窗口清空。
18、K、fanning():重新计算 TipPanel 里的 boxes里的小框的大小 ,调用 TipPanel 类的fanning()方法。当游戏的窗体改变大小及风格时调用次方法。TipPanel 为内部类,继承面版类。包含的参数:private Color backColor = Color.darkGray, frontColor = Color.lightGray; 定义两种颜色,backColor 为背景色(暗黑色),frontColor 为前景色(亮色) 。private ErsBox boxes =new ErsBoxErsBlock.BOXES_ROWSErsBlock.BOXES
19、_COLS;定义一个ErsBox 类的对象数组 boxes,初始化为 4 行 4 列private int style, boxWidth, boxHeight;定义三个整型变量(style:表示方块的类型;boxWidth: 表示小方格的宽度;boxHeight:表示小方格的高度)private boolean isTiled = false;包含的方法:A、TipPanel():预显窗口类构造函数 .初始化预显窗口,设置预显窗口的行数和列数。B、TipPanel(Color backColor,Color frontColor):预显窗口类构造函数,backColor 为窗口的被景色 ,f
20、rontColor 为窗口的前景色(方块的颜色) 。C、setStyle(int style):设置预显窗口的方块式样。接收 ControlPanel 类的setTipStyle(style)方法 传递过来的 style 的值。D、paintComponent(Graphics g):覆盖 JComponent 类的函数,画组建。E、fanning():根据窗口的大小,自动调整方格的尺寸。boxWidth 值为预显窗口的大小除以列数, boxHeight 值为预显窗口的大小除以行数。内部类:ControlKeyListener 继承 KeyAdapter实现方块的移动及变形。首先判断 ErsB
21、locksGame 类的 isPlaying ()方法的值 Ture 继续执行,False 返回。当 isPlaying()的值为 True 时用 switchcase 方法检查玩家按下的是哪个键:VK_DOWN:下键为向下移动,调用 ErsBlock 类的 moveDown 方法。VK_LEFT:左键为向左移动,调用 ErsBlock 类的 moveLeft 方法。VK_RIGHT:右键为向右移动,调用 ErsBlock 类的 moveRight 方法。VK_UP:上键为方块变形,调用 ErsBlock 类的 turnNext 方法。(4)、ErsBlock-块类final static i
22、nt BOXES_ROWS = 4/设置静态变量 BOXES_ROWS=4-方格所占行数final static int BOXES_COLS = 4/设置静态变量 BOXES_ROWS=4-方格所占列数final static int LEVEL_FLATNESS_GENE = 3/设置各级之间速度的差额final static int BETWEEN_LEVELS_DEGRESS_TIME = 50/相近的两级之间,块每下落一行的时间差别为多少(毫秒)final static int BLOCK_KIND_NUMBER = 7/方块的样式数目为 7final static int BLOC
23、K_STATUS_NUMBER = 4/每一个样式的方块的反转状态种类为 4final static int STYLES = / 共 28 种状态0x0f00, 0x4444, 0x0f00, 0x4444, / 长条型的四种状态0x04e0, 0x0464, 0x00e4, 0x04c4, / T型的四种状态0x4620, 0x6c00, 0x4620, 0x6c00, / 反Z 型的四种状态0x2640, 0xc600, 0x2640, 0xc600, / Z型的四种状态0x6220, 0x1700, 0x2230, 0x0740, / 7型的四种状态0x6440, 0x0e20, 0x
24、44c0, 0x8e00, / 反7型的四种状态0x0660, 0x0660, 0x0660, 0x0660, / 方块的四种状态建立对象GameCanvas canvasErsBox boxes = new ErsBoxBOXES_ROWSBOXES_COLS;设置参数style x y level构造函数,产生一个特定的块style 块的样式,对应 STYLES 的 28 个值中的一个y 起始位置,左上角在 canvas 中的坐标行x 起始位置,左上角在 canvas 中的坐标列level 游戏等级,控制块的下落速度canvas 画板构造函数 ErsBlock()/用于改变位置时设定方格变
25、换方块颜色的位置线程类的 run()函数覆盖,下落块,直到块不能再下落moveLeft()/块向左移动一格moveRight()/块向右移动一格moveDown()/块向下落一格turnNext()/改变方格形状pauseMove()/暂停块的下落,对应游戏暂停resumeMove()/继续块的下落,对应游戏继earse()/将当前块从画布的对应位置移除,要等到下次重画画布时才能反映出来display()/让当前块放置在画布的对应位置上,要等到下次重画画布时才能看见isMoveAble/当前块能否移动到 newRow/newCol 所指定的位置newRow int, 目的地所在行newCol
26、int, 目的地所在列boolean, true-能移动, false-不能isTurnAble(int newStyle)/前块能否变成 newStyle 所指定的块样式,主要是要考虑边界以及被其它块挡住、不能移动的情况newStyle int,希望改变的块样式,对应 STYLES 的 28 个值中的一个boolean,true-能改变, false-不能改变turnTo(int newStyle)/将当前块变成 newStyle 所指定的块样式newStyle int,将要改变成的块样式,对应 STYLES 的 28 个值中的一个boolean,true-改变成功, false-改变失败(
27、5)、类:GameCanvas;包:swing,awt,swing.border.EtchedBorder;构造函数:GameCanvas(int rows, int cols)GameCanvas(int rows, int cols,backcolor,frontcolor)定义一个整型的行和整型的列作为数组 ErsBox的参数,用于得到整个画布。里面的 setBorder(new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)用于设置画布的边框设置画布的前景色和背景色成员函数:fanning(
28、) - 根据窗口大小自动调整方格尺寸,将值赋给 boxHeight,boxWidth在主函数里调用getBackgroundColor() - 得到背景颜色,返回 backColorgetBlockColor() - 设置方块颜色,返回 frontColorgetBox(int row, int col) - 得到某一行某一列的方格引用getCols() - 得到方格列数getRows() - 得到方格行数getScore() - 得到成绩getScoreForLevelUpdate() - 得到上一次升级后的积分在主函数public int getScoreForLevelUpdate()
29、if (canvas != null) return canvas.getScoreForLevelUpdate();return 0;调用paintCompontent(Graphics g) - 覆盖 JComponent 类的函数,画组件。 removeLine(int row) - 清除填满的行,由主函数调用reset() - 重置画布: 积分清零,升级后的积分清零将方块的颜色设为假在主函数里调用resetScoreForLevelUpdate( ) - 升级后将上一次升级以来的积分清零“scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SC
30、ORE;“这句话利用主函数里的 public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;给 scoreForLevelUpdate 重新赋值setBackgroundColor(Color backColor) - 设置背景颜色变量:backColor - 设置背景色,返回给 getBackgroundColor() boxHeight - 方块的高度boxWidth - 方块的宽度boxes - 数组变量得到画布的行和列cols - 画布的列frontColor - 设置前景色rows - 画布的行score - 成绩积分s
31、coreForLevelUpdate - 每次升级后的积分类流程:首先导入 swing,awt,swing.border.EtchedBorder 这几个包.创建一个类 GameCanvas,继承自 JPanel 类.写出画布的构造函数 GameCanvas(int rows, int cols)定义一个数组 ErsBox得到行和列用 etBorder(new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)设置边框然后设置背景色public void setBackgroundColor(Color
32、 backColor)this.backColor = backColor;取得背景色public Color getBackgroundColor() return backColor设置前景色(方块颜色)public void setBlockColor(Color frontColor)this.frontColor = frontColor;取得前景色(方块颜色 )public Color getBlockColor()return frontColor;取得画布中方格的行数public int getRows()return rows;取得画布中方格的列数public int get
33、Cols() return cols;取得游戏成绩public int getScore()return score;取得自上一次升级后的积分用于计算什么时候升级public int getScoreForLevelUpdate()return scoreForLevelUpdate;计算上一次升级后的积分,给 scoreForLevelUpdate 重新赋值public void resetScoreForLevelUpdate()scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SCORE; 本类里最关键的一个成员函数 removeLine(int row)检查被填满的行,将此行清除,并为游戏者加分,最后再逐行重新克隆此函数被主函数调用score 积分以每 100 分累加scoreForLevelUpdate 升级后的积分以每 100 分累加由主函数调用