首页 > 代码库 > 团队作业(二)
团队作业(二)
1 概述
1.1 开发背景
随着网络技术的发展,人们的生活日益离不开网络,网络给人们带来了各种各样的信息和更多更新的娱乐。据统计,每天上网的人中有75%利用网络来丰富娱乐自己的生活。其中游戏最为常见和普遍。所以,这次软件作业,我想实现一个小游戏:俄罗斯方块,为将来步入游戏编程领域打下基础。
1.2 开发目标
通过键盘控制小俄罗斯方块,来将这些方块拼凑成一个个完整的行,来实现整行的消除,图形颜色,下落速度及初始障碍物多少可自行设置,增加了游戏的趣味性。
1.3 参考资料
1]郑阿奇.Java实用教程(第2版)[M].北京:电子工业出版社,2009年6月;
[2]印旻.《Java语言与面向对象程序设计》[M].北京:清华大学出版社,2007年11月;
[3]朱站立,沈伟.《Java程序设计实用教程》[M].北京:电子工业出版社;
[4]朱福喜,尹为民,余振坤.《Java语言与面向对象程序设计》[M].武汉:武汉大学;
[5]Bruce Eckel.《Java编程思想》[M].北京:机械工业出版社;
[6]阎宏.《Java与模式》[M].北京:电子工业出版社;
[7]Nicholas C.Zakas.《JavaScript高级程序设计》[M].北京:人民邮电出版社。
1.4 设计原则
2 需求分析
2.1 需求陈述
运行游戏可在控制主界面设置各参数,如设置游戏的背景颜色,鼠标点击button事件:弹出色彩列表框,选择自己喜欢的颜色作为背景颜色。也可用同样的方法设置产生的图形的颜色,障碍物及网格的颜色,也可关闭图形和障碍物的颜色,此时默认为灰色,同样的也可以不显示网格。游戏开始可以设置随机生成障碍行数及数目,还可设置满行效果时间和颜色。
开始游戏按钮开始游戏,“停止游戏”按钮和“暂停/继续”按钮分别停止游戏和暂停/继续游戏,同样也可以用键盘上的“Y”重新开始游戏,“Enter”键来实现暂停/继续。“PageUp”和“PageDown”键分别实现加速和减速。“Space”实现一键下落。方向键控制方向,其中向上键为旋转。
细节:
(1) 游戏显示面板GamePanel类,完成游戏显示;
(2) 方块Shape类,图形工厂ShapeFactory类生产各样的图形及障碍物Ground类;
(3) 监听接口类分别为游戏监听器,地面监听器,图形监听器Ground事件适配器;
(4) 控制器Controller类控制其他类,并负责游戏逻辑,处理案件事件;
(5) 主界面实现游戏开始,结束,暂停,继续功能以及图形界面排版;
(6) 可以通过主界面的按键选择配置游戏各个对象的颜色,游戏的初始障碍物量;
(7) 通过键盘按键实现游戏,并且可以调节游戏速度。
2.2 操作用例
1) 开始游戏
点击开始后游戏开始。
2) 显示方块
游戏开始后不断随机产生下落的方块。
3) 方块的下落
在游戏面板中出现的活动方块持续下落,要求方块能够自动持续下落。
4) 方块的左移
玩家点击左方向键后活动的方块向左移动,一次按键移动一个单位。
5) 方块的右移
玩家点击右方向键后活动的方块向右移动。
6) 方块的变形
玩家点击上方向键后活动的方块变形,同一方块的旋转,即系统中一个方块的四个状态。
7) 方块的撤销
新产生的方块若是不好安放,游戏者可以在它变成障碍物之前撤销它,重新产生另一个方块。
8) 方块销行
当一行满方块后销去该行方块,系统打印显示已销行数,销行时方块颜色以及销行的延时时间可以另行设定。
9) 游戏暂停
游戏可以暂停,通过点击鼠标事件,也可以通过键盘事件处理。
10) 游戏继续
暂停后的游戏继续进行,处理方式同游戏暂停,所以可以将其与游戏暂停按键设置为同一处理形式的不同事件。
11) 游戏速度调节
调节方块下落的速度,在游戏进行过程中实现。
11) 颜色的设置
设置方块,障碍物,背景的颜色,初始默认为灰色,颜色的调配可以调用同一数组来实现。
12) 网格显示
画出网格,根据用户勾选判断是否显示网格,初始默认为不显示。
13)难度设置
游戏开始前或游戏暂停中可以设置随机在底部添加几行已有的非整行的障碍物,行数及障碍物的数量自行设置。
2.3 功能分析划分
有游戏的操作,作通过线程不断执行类Shape中的内部类ShapeDriver驱动来一个俄罗斯方块的定时下落,其中ShapeDriver重写了Runnable接口的Run()方法来触发下落事件。并用drawMe()方法重现显示下落后的状态信息,同时清除前一时刻显示在“半空中”的俄罗斯方块。当该方块停止时,就判断是否有删除行。然后图形工厂判断是否再产生一个俄罗斯小方块,同样的步骤,这样循环执行,就可以实现游戏的持续进行。
键盘事件:
键码:
VK_ENTER: 暂停游戏,即将游戏线程悬挂起来。
VK_PGUP:给现游戏下落加速,即按键一次PGUP时加速现在方块的下落速度,设置速度的方法另行设计。
VK_PGDN:给现游戏下落j减速,即按键一次PGUP时减速现在方块的下落速度。
VK_LEFT :控制正在下落的俄罗斯方块向左移动,即当按一次VK_LEFT键时,将该方块对应的游戏区显示数组a中的数据逐个向左一列赋值。
VK_RIGHT:控制正在下落的俄罗斯方块向右移动,即当按一次VK_RIGHT键时,将方块对应的游戏区显示数组a中的数据逐个向左右一列赋值。
VK_UP:控制正在下落的俄罗斯方块的旋转,即当按下一次该键时,俄罗斯小方块就旋转90度显示。它是通过预定义每种俄罗斯小方块的每种旋转可能的数据,并根据具体条件将这些对应数据赋值给游戏显示数组中的对应位置。
VK_SPACE:控制俄罗斯小方块一键下落到底。
VK_Y:游戏结束后按键“Y”可以重新开始新游戏。
颜色设置:利用Lis载入tloadColors可选择的颜色列表框,可对网格,障碍物,新产生方块,消除行方块颜色进行不同设置。
消行控制:
每次下落一个方块变成障碍物,判断是否存在满行,如果存在满行,就执行方法deleteLine()删除行,并根据所删除的行数打印已消除行数,然后将行数显示在console上,最后重绘游戏区,即消除行的以上行整体下移一行,只需将数组中上一行的内容赋给下一行。
系统主要类及其功能实现:
1)class Controller extends KeyAdapter implements ShapeListener,GroundListener
控制器,控制Ground, Snake, Food;负责游戏的逻辑;处理按键事件。
2)class Ground可以叫做地形, 或障碍物维护障碍物的信息,可以使用提供的addStubbornObstacle(int ,int)和addObstacle(int, int)方法添加障碍物;可以通过setObstacleColor(), setStubbornObstacleColor() 或setGriddingColor()方法更改障碍物或网格的颜色; 通过setDrawGridding() 方法设置是否画空白(网格);用 setColorfulSupport() 方法设置是否支持彩色显示;覆盖 drawObstacle(Graphics, int, int, int, int) 方法可以改变障碍物的显示方式;覆盖 drawStubbornObstacle(Graphics, int, int, int, int) 方法可以改变不可消除的障碍物的显示方式。
3)class Shape
维护一个图形, 一个图形可以有一种或多种状态;可以通过 setColor() 方法改变图形的颜色;可以通过覆盖 drawUnit(Graphics, int, int, int, int) 方法改变图形的显示; 用内部类 ShapeDriver 驱动图形定时向下移动;使用时一定要给实例注册监听器, 否则不能正常运行。
4)class ShapeFactory
图形工厂可以产生多种形状, 多种颜色的图形; setDefaultShapeColor() 方法可以设置默认产生的图形的颜色;也可以通过 setColorfulShape() 方法设置是否产生彩色图形。
5)class UnitType implements Cloneable可以表示地面里面的障碍物, 不可消除的障碍物, 空白, 外部不可以直接new 一个实例, 而应该用 clone() 方法产生实例(防止产生不能识别的类型。
6)class CommonShapeFactory extends ShapeFactory
为了扩展一些功能,可用配置文件配置这个工厂用的颜色。
7)class GameOptionPanel extends JPanel
游戏的设置项面板。
8)class MainFrame extends JFrame implements GameListener
主界面, 实现了 GameListener 接口。
9)class MyGroundListener extends GroundAdapter
自己用的一个GroundListener, 处理不可消的障碍物, 增加趣味性。
10)class Global工具类,此类中存放了其他类中用到的一些常量,并且支持配置文件, 配置文件的路径为游戏运行的目录, 文件名,配置文件的写法请参见字段的注释, 配置文件中设置项可以只写需要配置的, 没有写的设置项默认为缺省值,各配置项的缺省值请参见字段的注释,每个配置项都有设置值范围, 超出范围(无效)的设置值将不起作用, 设置值的范围请参见字段的注释。
11)class GamePanel extends JPanel
游戏的显示界面,可以用 setBackgroundColor() 设置游戏的背景色。
12)接口:
GameListener,游戏监听器。游戏开始暂停继续与结束判断。
GroundListener,地面监听器。满行事件处理。
ShapeListener,图形监听器。监听图形是否可以下落。
13)适配器类
class GroundAdapter implements GroundListener,Ground 事件适配器。
2.3.1 系统登录与用户管理
GamePanel游戏面板主要实现游戏界面的显示,其继承自JPanel类。
主要设计因素就是尺寸大小,方块及下落障碍物的显示,默认背景颜色障碍物颜色灰色,方块红色。在游戏面板也会提示当前游戏速度。
图1 GamePanel默认设置图
GamePanel的部分代码如下,主要用于设置Panel大小和重新显示游戏板面:
public GamePanel() {
//设置大小和布局
this.setSize(Global.WIDTH * Global.CELL_WIDTH, Global.HEIGHT
* Global.CELL_HEIGHT);
this.setBorder(new EtchedBorder(EtchedBorder.LOWERED));
this.setFocusable(true);
}
// 重新显示 Ground, Shape
public synchronized void redisplay(Ground ground, Shape shape) {
if (og == null) {
oimg = createImage(getSize().width, getSize().height);
if (oimg != null)
og = oimg.getGraphics();
}
if (og != null) {
og.setColor(backgroundColor);
og.fillRect(0, 0, Global.WIDTH * Global.CELL_WIDTH, Global.HEIGHT
* Global.CELL_HEIGHT);
ground.drawMe(og);
if (shape != null)
shape.drawMe(og);
this.paint(this.getGraphics());
}
}
public void paint(Graphics g) {
g.drawImage(oimg, 0, 0, this);
}
// 得到当前的背景颜色
public Color getBackgroundColor() {
return backgroundColor;
}
//设置当前的背景颜色
public void setBackgroundColor(Color backgroundColor) {
this.backgroundColor = backgroundColor;
}
}
GameOptionPanel游戏设置项面板主要用于显示设置游戏参数,比如check控件选择是否显示网格,是否关闭彩色设置,以及游戏难度中在底部随机生成障碍物行数设置。游戏的开始暂停按键,游戏简单说明也在此面板中显示。GameOptionPanel面板主要知识显示用户可见的按钮选择,具体Button的功能在主面板中进一步扩充。其中随机生成障碍物个数行数和满行效果时间必须根据用户输入在此类中需要两个方法分别实现获得这两个输入数据,个数行数和时间。
图2 GameOptionPanel图
GameOptionPanel类部分代码如下,主要是设置功能部分的代码,如返回程序用户选择的颜色及设置的其他参数,可视化可以完成的部分已经省略:
public JFrame getFrame() {//获得一个Frame
return frame;
}
public void setFrame(JFrame frame) {
this.frame = frame;
}
public int getObstacleNum() {//获得用户输入的障碍物数量
try {
return Integer.parseInt(textField_obstacleNum.getText());
} catch (NumberFormatException e) {
return 0;
}
}
public int getStayTime() {//获得用户输入的满行效果时间
try {
return Integer.parseInt(textField_stayTime.getText());
} catch (NumberFormatException e) {
return 0;
}
}
public JButton getNewGameButton() {//新游戏开始按键
return newGameButton;
}
public JButton getStopGameButton() {//停止游戏
return stopGameButton;
}
public int getLineNum() {//获得用户输入障碍物初置行数
try {
return Integer.parseInt(textField_lineNum.getText());
} catch (NumberFormatException e) {
return 0;
}
}
public void setTextField_lineNum(JTextField textField_lineNum) {
this.textField_lineNum = textField_lineNum;
}
public JCheckBox getCheckBox_colorfulShape() {
return checkBox_colorfulShape;
}
public JCheckBox getCheckBox_drawGridding() {
return checkBox_drawGridding;
}
public JTextField getTextField_stayTime() {
return textField_stayTime;
}
public JTextField getTextField_obstacleNum() {
return textField_obstacleNum;
}
public JTextField getTextField_lineNum() {
return textField_lineNum;
}
public boolean isDrawGridding() {
return checkBox_drawGridding.isSelected();
}
public boolean isColorfulShape() {
return checkBox_colorfulShape.isSelected();
}
public boolean isColorfulObstacle() {
return checkBox_colorfulObstacle.isSelected();
}
public ImageIcon getCzbkIcon() {
return czbkIcon;
}
public void setCzbkIcon(ImageIcon czbkIcon) {
this.czbkIcon = czbkIcon;
}
public JButton getPauseButton() {
return pauseButton;
}
public JCheckBox getCheckBox_colorfulObstacle() {
return checkBox_colorfulObstacle;
}
public JButton getButton_obstacleColor() {
return button_obstacleColor;
}
public JButton getButton_griddingColor() {
return button_griddingColor;
}
public JButton getButton_shapeColor() {
return button_shapeColor;
}
public JButton getButton_fullLineColor() {
return button_fullLineColor;
}
public JButton getButtonBackgroundColor() {
return buttonBackgroundColor;
}
public JButton getButton_default() {
return button_default;
}
}
2.5 运行环境
1)MainFrame面板通过继承JFrame类和实现GameListener接口完成了总的游戏界面设计。本设计中,MainFrame是最重要也是比较复杂的一个类,main()方法也在其中,运行程序时运行main()方法开始,通过main()方法调用其他的类和其他类中的方法来实现整个游戏。
图3 MainFrame图
图中设置背景颜色设置为浅蓝色;显示网格,网格颜色设置为黑色;图形设置颜色为红色,上面的图片看不出来,因为在消行时间点上还没有产生新的图形;障碍物设置为蓝色,也就是红色图形下落后就变成了蓝色。本轮游戏设置了随机生成了50个5行障碍物在游戏最开始游戏面板的底部,障碍物是随机生成的小格,位置随机,颜色也随机,设置障碍物越少排列行越多障碍物排列得越稀散,等于是游戏难度越大。而满行时间效果是300,单位是毫秒,消行时满行瞬时颜色设置为了黄色。在图3中可以看到捕捉到的300毫秒的消行时颜色。
MainFrame部分代码如下:
public static void main(String args[]) {//main函数
try {
Controller controller = new Controller(new ShapeFactory(),
new Ground(), new GamePanel());
MainFrame frame = new MainFrame(controller);
frame.setVisible(true);// 显示窗口
} catch (Exception e) {
e.printStackTrace();
}
}
2)关于游戏的难度调节——速度设置:PageUp/PageDown。
图4 速度测试图
从图4中就可以可以看出图形的颜色是红色,还可以看到“提示:速度 25毫秒/格”,这已经是最大速度,对比图3的默认速度300毫秒/格难度大有增大。本游戏也正是通过按键PageUp/PageDown改变图形下落速度而调节游戏速度而改变游戏的难度。
速度的设置主要通过MainFrame类调用Shape类的speedSet()方法来实现。
Shape中关于速度设置的部分代码:
public void speedUp() {// 加速
if (speed > Global.SPEED_STEP)
speed -= Global.SPEED_STEP;
Global.CURRENT_SPEED = speed;
}
public void speedDown() {// 减速
speed += Global.SPEED_STEP;
Global.CURRENT_SPEED = speed;
}
public int getSpeed() {// 得到图形的下落速度
return speed;
}
public void setSpeed(int speed) {// 设置图形的下落速度
this.speed = speed;
}
public int getSwiftSpeed() {
return swiftSpeed;
}
public void setSwiftSpeed(int swiftSpeed) {
this.swiftSpeed = swiftSpeed;
}
3)关于颜色的设置。
图5 颜色设置图
图5 中各个颜色设置按钮都能弹出颜色选择框,“请选择背景颜色”,“请选择图形的颜色”,“请选择网格的颜色”,“请选择障碍物的颜色”“,请选择满行的效果的颜色”。
MainFrame中图形颜色部分选择代码如下:
gameOptionPanel.getButton_shapeColor().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Color shapeColor = JColorChooser
.showDialog(MainFrame.this, "请选择图形的颜色",
new Color(0xFF4500));
if (shapeColor != null)
shapeFactory.setDefaultShapeColor(shapeColor);
}
});
gameOptionPanel.getButton_griddingColor().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Color griddingColor = JColorChooser.showDialog(
MainFrame.this, "请选择网格的颜色", Color.LIGHT_GRAY);
if (griddingColor != null)
ground.setGriddingColor(griddingColor);
}
});
gameOptionPanel.getButton_obstacleColor().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Color obstacleColor = JColorChooser.showDialog(
MainFrame.this, "请选择障碍物的颜色", Color.DARK_GRAY);
if (obstacleColor != null)
ground.setObstacleColor(obstacleColor);
}
});
gameOptionPanel.getButton_fullLineColor().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Color fullLineColor = JColorChooser.showDialog(
MainFrame.this, "请选择满行的效果的颜色", Color.DARK_GRAY);
if (fullLineColor != null) {
ground.setFullLineColor(fullLineColor);
}
}
});
gameOptionPanel.getButtonBackgroundColor().addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Color backgroundColor = JColorChooser
.showDialog(MainFrame.this, "请选择背景的颜色",
new Color(0xcfcfcf));
if (backgroundColor != null)
gamePanel.setBackgroundColor(backgroundColor);
}
});
另外,颜色框的代码部分在Global类中:
private static List<Color> loadColors() {
List<Color> l = new ArrayList<Color>(7);
for (int i = 0; i < 7; i++)
l.add(null);
Set set = properties.keySet();
Iterator iter = set.iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
if ("1".equals(key.trim()))
addColor(l, 0, getValue(key));
else if ("2".equals(key.trim()))
addColor(l, 1, getValue(key));
else if ("3".equals(key.trim()))
addColor(l, 2, getValue(key));
else if ("4".equals(key.trim()))
addColor(l, 3, getValue(key));
else if ("5".equals(key.trim()))
addColor(l, 4, getValue(key));
else if ("6".equals(key.trim()))
addColor(l, 5, getValue(key));
else if ("7".equals(key.trim()))
addColor(l, 6, getValue(key));
}
for (int i = 0; i < 7; i++) {
l.remove(null);
}
if (l.size() < 1) {
for (int i = 0; i < DEFAULT_COLORS.length; i++) {
l.add(DEFAULT_COLORS[i]);
}
} else {
if (l.size() != 7)
System.out.println("您一共设置了 " + l.size() + " 种有效颜色, 建议设置七种");
return l.subList(0, l.size() > 7 ? 7 : l.size());
}
return l;
}
@SuppressWarnings("unchecked")
private static void addColor(List l, int index, String str) {
str = str.trim();
if (!str.startsWith("0x") || str.length() < 3) {
System.out.println("颜色设置有误,请检查 : " + str + " (key)");
return;
}
try {
String strRGB = str.substring(2, str.length() >= 8 ? 8 : str
.length());
int rgb = Integer.valueOf(strRGB, 16);
Color c = new Color(rgb);
if (c != null) {
l.add(index, c);
}
} catch (Exception e) {
System.out.println("(e)颜色设置有误,请检查:" + str + "(key)");
e.printStackTrace();
return;
}
}
}
4)消行记录:每消除一行方块系统都会有记录。
图6 Console提示图
3 总体设计
3.1 系统建模
3.1.1 层次方框图
3.1.3 类图设计
3.2 接口设计
3.2.1 内部接口设计
GameListener,游戏监听器。游戏开始暂停继续与结束判断。
GroundListener,地面监听器。满行事件处理。
ShapeListener,图形监听器。监听图形是否可以下落。
主界面, 实现了 GameListener 接口。
return button_obstacleColor;
}
public JButton getButton_griddingColor() {
return button_griddingColor;
}
public JButton getButton_shapeColor() {
return button_shapeColor;
}
public JButton getButton_fullLineColor() {
return button_fullLineColor;
}
public JButton getButtonBackgroundColor() {
return buttonBackgroundColor;
}
public JButton getButton_default() {
return button_default;
}
}
4 详细设计
4.1 程序流程图
4.2 伪代码编写
5 实现
5.1 编码
5.1.1 代码约定
1.文件编码
2.包名使用大小写字母
3.import不使用通配符
4.列长限制
一个项目可以选择一行80个字符或100个字符的列限制,超出列长限制时换行,换行时至少缩进4个空格,缩进不要用tab。
5.注释
注释应少而精,代码的关键处应有注释。
6.变量声明
每次只声明一个变量,不要使用组合声明,需要变量是再声明,并尽快进行初始化。
7.命名约定
见名知意、简洁,避免中英混用。
8.类成员顺序
每个类应该以某种逻辑排序成员,使维护者能解释这种排序逻辑。
9.慎用System.out.println()
10.使用大括号
11.减少代码嵌套
减少嵌套方法:(1)合并条件;(2)利用return以省略else;(3)使用子方法。
12.异常处理
捕获的异常不能忽视。
5.1.2 代码编写原则
1)Java注释尽可能全面
对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说明。
2)多次使用的相同变量最好归纳成常量
多处使用的相同值的变量应该尽量归纳为一个常量,方便日后的维护。
3)尽量少的在循环中执行方法调用
尽量在循环中少做一些可避免的方法调用,这样可以节省方法栈的创建。
4)常量的定义可以放到接口中
在Java中,接口里只允许存在常量,因此把常量放到接口中声明就可以省去public static final这几个关键词。
5)ArrayList和LinkedList的选择
6)String,StringBuffer和StringBuilder
7)包装类和基本类型的选择
如果使用基本数据类型来做局部变量类型,尽量使用基本数据类型,因为基本类型的变量是存放在栈中的,包装类的变量是在堆中,栈的操作速度比对快很多。
8)尽早的将不再使用的变量引用赋给NULL
如此可以帮助jvm更快的进行内存回收。
9)在finally块中对资源进行释放
10)在HashMap中使用一个Object作为key是要注意如何区分Object是否相同
5.1.2 代码编写原则
2. 采用适用于相关领域的术语
3. 采用大小写混合使名字可读
4. 尽量少用缩写,但如果用了,要明智地使用,且在整个工程中统一
5. 避免使用长的名字(小于 15 个字母是个好主意)
6. 避免使用类似的名字,或者仅仅是大小写不同的名字
7. 避免使用下划线(除静态常量等)
5.2 测试要点
5.2.1 登录测试要点
1、文本框的测试
如何对文本框进行测试:
a、输入正常的字母或数字;
b、输入已存在的文件的名称;
c、输入超长字符。例如在“名称”框中输入超过允许边界个数的字符,假设最多255个字符,尝试输入256个字符,检查程序能否正确处理;
d、输入默认值,空白,空格;
e、若只允许输入字母,尝试输入数字;反之,尝试输入字母;
f、利用复制,粘贴等操作强制输入程序不允许的输入数据;
g、输入特殊字符集,例如,NUL及\n等;
h、输入超过文本框长度的字符或文本,检查所输入的内容是否正常显示;
5.2.2 主界面测试要点
测试方法:
a、点击按钮正确响应操作。如单击确定,正确执行操作;单击取消,退出窗口;
b、对非法的输入或操作给出足够的提示说明
c、对可能造成数据无法恢复的操作必须给出确认信息,给用户放弃选择的机会;
5.3 测试结果和总结
我这次实验做的是俄罗斯方块,之所以选这个题目是因为,我想体验一下用java编写游戏的乐趣,可以自己编写自己玩,很有意思。大家可能会认为这个题目很简单,没什么难度,本来我也是这么想的;可是当真正着手做时,发现很多东西并不容易实现。比如:如何显示每一个俄罗斯小方块,如何预测下一个俄罗斯小方块,如何控制每一个方块的下落速度,如何判断俄罗斯方块是否可以停止,如何通过键盘控制俄罗斯方块的位置和方向等。如果有一行或多行满行,如何删除这些行,并重新绘制游戏区界面,同时分数如何计算并显示等等,都要一一实现。感觉真是难上加难。
不过,是事情总会有解决办法,是问题总有突破口,于是我找来相关书籍仔细研究其算法,最后终于一切明了于心。
当然,在这次课程设计中,也出现了许多错误或麻烦。主要有一些判断条件的制定和线程控制。有些判断条件没有想全,当执行某些操作时就出现异常,比如:俄罗斯方块的停止条件的判断,如果判断条件不完整就会出现下落的方块遇到已经存在的方块后还继续下落。还有线程的控制中,如果不循环执行线程中的方法,就会出现游戏只显示第一个静止的俄罗斯方块而不继续显示其他方块。
6 维护
6.1 维护方法
定期检查,有专门的人员进行维护。
6.2 维护文档
维护文档内容,应当全面详细地记录好相关信息,相关信息包括:程序名称、源程序语句条数、所用的程序设计语言、程序安装的日期、修改程序所增加的语句数、修改程序所减少的语句数、每次修改所付出的“人时”数、修改时的详细日期、维护人员的详细信息、维护类型、维护开始时间和结束时间、修改维护的原因等。
6.3 功能拓展方法
在软件维护过后,有些用户可能需要更多的软件功能,这样我们就需要给软件功能进行拓展。为了估计软件维护的有效程度,确定软件产品的质量,并且确定在维护中的实际开销,所以在功能拓展中应当做好事先的拓展方案以及市场调查。
团队成员:白晓琪,袁雅婷,张斌斌,曾春,郭晓乐
团队作业(二)