JAVA课程设计俄罗斯方块.doc

上传人:文库蛋蛋多 文档编号:2386988 上传时间:2023-02-17 格式:DOC 页数:22 大小:477.50KB
返回 下载 相关 举报
JAVA课程设计俄罗斯方块.doc_第1页
第1页 / 共22页
JAVA课程设计俄罗斯方块.doc_第2页
第2页 / 共22页
JAVA课程设计俄罗斯方块.doc_第3页
第3页 / 共22页
JAVA课程设计俄罗斯方块.doc_第4页
第4页 / 共22页
JAVA课程设计俄罗斯方块.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《JAVA课程设计俄罗斯方块.doc》由会员分享,可在线阅读,更多相关《JAVA课程设计俄罗斯方块.doc(22页珍藏版)》请在三一办公上搜索。

1、Java程序设计课程设计说明书俄罗斯方块小游戏起止日期: 2010年12月6日 至 2011年 1月 4日学生姓名潘顺娥班级软件工程081班学号08408300132成绩指导教师满君丰计算机与通信学院2010年 12 月6日目 录1绪论11.1 课题背景11.2 开发平台相关介绍12系统分析22.1 需求分析22.2 工作流程23系统设计33.1 系统结构图33.2 系统功能分析44系统实现114.1 系统界面的实现114.2 系统主要功能实现114.2.1游戏面板GamePanel:114.2.2游戏设置项面板GameOptionPanel:144.2.3游戏主面板MainFrame:165

2、总结和展望195.1 收获与体会195.2 未来的展望19参考文献20致 谢21课程设计检查表221 绪论1.1 课题背景随着网络技术的发展,人们的生活日益离不开网络,网络给人们带来了各种各样的信息和更多更新的娱乐。据统计,每天上网的人中有75%利用网络来丰富娱乐自己的生活。其中游戏最为常见和普遍。所以,这次课程设计,我想实现一个小游戏:俄罗斯方块,为将来步入游戏编程领域打下基础。本游戏功能:通过键盘控制小俄罗斯方块,来将这些方块拼凑成一个个完整的行,来实现整行的消除,图形颜色,下落速度及初始障碍物多少可自行设置,增加了游戏的趣味性。1.2 开发平台相关介绍Eclipse 是一个开放源代码的、

3、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse 还包括插件开发环境,这个组件可扩展 Eclipse,它允许构建与 Eclipse 环境无缝集成的工具。 Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platfor

4、m则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。2 系统分析2.1 需求分析(1) 游戏显示面板GamePanel类,完成游戏显示;(2) 方块Shape类,图形工厂ShapeFactory类生产各样的图形及障碍物Ground类;(3) 监听接口类分别为游戏监听器,地面监听器,图形监听器Ground事件适配器;(4) 控制器Controller类控制其他类,并负责游戏逻辑,处理案件事件;(5) 主界

5、面实现游戏开始,结束,暂停,继续功能以及图形界面排版;(6) 可以通过主界面的按键选择配置游戏各个对象的颜色,游戏的初始障碍物量;(7) 通过键盘按键实现游戏,并且可以调节游戏速度。2.2 工作流程运行游戏可在控制主界面设置各参数,如设置游戏的背景颜色,鼠标点击button事件:弹出色彩列表框,选择自己喜欢的颜色作为背景颜色。也可用同样的方法设置产生的图形的颜色,障碍物及网格的颜色,也可关闭图形和障碍物的颜色,此时默认为灰色,同样的也可以不显示网格。游戏开始可以设置随机生成障碍行数及数目,还可设置满行效果时间和颜色。开始游戏按钮开始游戏,“停止游戏”按钮和“暂停/继续”按钮分别停止游戏和暂停/

6、继续游戏,同样也可以用键盘上的“Y”重新开始游戏,“Enter”键来实现暂停/继续。“PageUp”和“PageDown”键分别实现加速和减速。“Space”实现一键下落。方向键控制方向,其中向上键为旋转。3 系统设计3.1 系统结构图ShapeFactory图形工厂Shape定时下落GroundGamePanel显示Controllor处理按键事件处理逻辑生产触发按键事件图3.1 程序结构图 3.2 系统功能分析1) 开始游戏点击开始后游戏开始。2) 显示方块游戏开始后不断随机产生下落的方块。3) 方块的下落在游戏面板中出现的活动方块持续下落,要求方块能够自动持续下落。4) 方块的左移玩家点

7、击左方向键后活动的方块向左移动,一次按键移动一个单位。5) 方块的右移玩家点击右方向键后活动的方块向右移动。6) 方块的变形玩家点击上方向键后活动的方块变形,同一方块的旋转,即系统中一个方块的四个状态。7) 方块的撤销 新产生的方块若是不好安放,游戏者可以在它变成障碍物之前撤销它,重新产生另一个方块。8) 方块销行当一行满方块后销去该行方块,系统打印显示已销行数,销行时方块颜色以及销行的延时时间可以另行设定。9) 游戏暂停游戏可以暂停,通过点击鼠标事件,也可以通过键盘事件处理。10) 游戏继续暂停后的游戏继续进行,处理方式同游戏暂停,所以可以将其与游戏暂停按键设置为同一处理形式的不同事件。11

8、) 游戏速度调节调节方块下落的速度,在游戏进行过程中实现。11) 颜色的设置设置方块,障碍物,背景的颜色,初始默认为灰色,颜色的调配可以调用同一数组来实现。12) 网格显示画出网格,根据用户勾选判断是否显示网格,初始默认为不显示。13) 难度设置 游戏开始前或游戏暂停中可以设置随机在底部添加几行已有的非整行的障碍物,行数及障碍物的数量自行设置。4 系统实现根据整个系统的总体设计以及相关模块功能的设计,我们进行了系统的软件开发。详细设计和功能展示如下:4.1 系统主要功能实现有游戏的操作,作通过线程不断执行类Shape中的内部类ShapeDriver驱动来一个俄罗斯方块的定时下落,其中Shape

9、Driver重写了Runnable接口的Run()方法来触发下落事件。并用drawMe()方法重现显示下落后的状态信息,同时清除前一时刻显示在“半空中”的俄罗斯方块。当该方块停止时,就判断是否有删除行。然后图形工厂判断是否再产生一个俄罗斯小方块,同样的步骤,这样循环执行,就可以实现游戏的持续进行。键盘事件:键码:VK_ENTER: 暂停游戏,即将游戏线程悬挂起来。VK_PGUP:给现游戏下落加速,即按键一次PGUP时加速现在方块的下落速度,设置速度的方法另行设计。VK_PGDN:给现游戏下落j减速,即按键一次PGUP时减速现在方块的下落速度。VK_LEFT :控制正在下落的俄罗斯方块向左移动,

10、即当按一次VK_LEFT键时,将该方块对应的游戏区显示数组a中的数据逐个向左一列赋值。VK_RIGHT:控制正在下落的俄罗斯方块向右移动,即当按一次VK_RIGHT键时,将方块对应的游戏区显示数组a中的数据逐个向左右一列赋值。VK_UP:控制正在下落的俄罗斯方块的旋转,即当按下一次该键时,俄罗斯小方块就旋转90度显示。它是通过预定义每种俄罗斯小方块的每种旋转可能的数据,并根据具体条件将这些对应数据赋值给游戏显示数组中的对应位置。VK_SPACE:控制俄罗斯小方块一键下落到底。VK_Y:游戏结束后按键“Y”可以重新开始新游戏。颜色设置:利用Lis载入tloadColors可选择的颜色列表框,可对

11、网格,障碍物,新产生方块,消除行方块颜色进行不同设置。消行控制:每次下落一个方块变成障碍物,判断是否存在满行,如果存在满行,就执行方法deleteLine()删除行,并根据所删除的行数打印已消除行数,然后将行数显示在console上,最后重绘游戏区,即消除行的以上行整体下移一行,只需将数组中上一行的内容赋给下一行。系统主要类及其功能实现:1)class Controller extends KeyAdapter implements ShapeListener,GroundListener控制器,控制Ground, Snake, Food;负责游戏的逻辑;处理按键事件。2)class Grou

12、nd可以叫做地形, 或障碍物维护障碍物的信息,可以使用提供的addStubbornObstacle(int ,int)和addObstacle(int, int)方法添加障碍物;可以通过setObstacleColor(), setStubbornObstacleColor() 或setGriddingColor()方法更改障碍物或网格的颜色; 通过setDrawGridding() 方法设置是否画空白(网格);用 setColorfulSupport() 方法设置是否支持彩色显示;覆盖 drawObstacle(Graphics, int, int, int, int) 方法可以改变障碍物的

13、显示方式;覆盖 drawStubbornObstacle(Graphics, int, int, int, int) 方法可以改变不可消除的障碍物的显示方式。3)class Shape维护一个图形, 一个图形可以有一种或多种状态;可以通过 setColor() 方法改变图形的颜色;可以通过覆盖 drawUnit(Graphics, int, int, int, int) 方法改变图形的显示; 用内部类 ShapeDriver 驱动图形定时向下移动;使用时一定要给实例注册监听器, 否则不能正常运行。4)class ShapeFactory图形工厂可以产生多种形状, 多种颜色的图形; setDef

14、aultShapeColor() 方法可以设置默认产生的图形的颜色;也可以通过 setColorfulShape() 方法设置是否产生彩色图形。5)class UnitType implements Cloneable可以表示地面里面的障碍物, 不可消除的障碍物, 空白, 外部不可以直接new 一个实例, 而应该用 clone() 方法产生实例(防止产生不能识别的类型。6)class CommonShapeFactory extends ShapeFactory为了扩展一些功能,可用配置文件配置这个工厂用的颜色。7)class GameOptionPanel extends JPanel游戏的

15、设置项面板。8)class MainFrame extends JFrame implements GameListener主界面, 实现了 GameListener 接口。9)class MyGroundListener extends GroundAdapter自己用的一个GroundListener, 处理不可消的障碍物, 增加趣味性。10)class Global工具类,此类中存放了其他类中用到的一些常量,并且支持配置文件, 配置文件的路径为游戏运行的目录, 文件名,配置文件的写法请参见字段的注释, 配置文件中设置项可以只写需要配置的, 没有写的设置项默认为缺省值,各配置项的缺省值请参

16、见字段的注释,每个配置项都有设置值范围, 超出范围(无效)的设置值将不起作用, 设置值的范围请参见字段的注释。11)class GamePanel extends JPanel游戏的显示界面,可以用 setBackgroundColor() 设置游戏的背景色。12)接口:GameListener,游戏监听器。游戏开始暂停继续与结束判断。GroundListener,地面监听器。满行事件处理。ShapeListener,图形监听器。监听图形是否可以下落。13)适配器类class GroundAdapter implements GroundListener,Ground 事件适配器。4.2 系统

17、界面的实现 界面是保证系统正常运行的一个重要因素,它影响到用户应用系统时的态度,影响到用户对产的品的评价,影响到产品的竞争力和寿命,进而影响到系统功能的发挥,所以必需对界面设计给予足够重视。 4.2.1游戏面板GamePanel:GamePanel游戏面板主要实现游戏界面的显示,其继承自JPanel类。主要设计因素就是尺寸大小,方块及下落障碍物的显示,默认背景颜色灰色,障碍物颜色灰色,方块红色。在游戏面板也会提示当前游戏速度。图1 GamePanel默认设置图GamePanel的部分代码如下,主要用于设置Panel大小和重新显示游戏板面:public GamePanel() /设置大小和布局

18、this.setSize(Global.WIDTH * Global.CELL_WIDTH, Global.HEIGHT* Global.CELL_HEIGHT);this.setBorder(new EtchedBorder(EtchedBorder.LOWERED);this.setFocusable(true);/ 重新显示 Ground, Shapepublic synchronized void redisplay(Ground ground, Shape shape) if (og = null) oimg = createImage(getSize().width, getSiz

19、e().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.

20、drawImage(oimg, 0, 0, this);/ 得到当前的背景颜色public Color getBackgroundColor() return backgroundColor;/设置当前的背景颜色public void setBackgroundColor(Color backgroundColor) this.backgroundColor = backgroundColor; 4.2.2游戏设置项面板GameOptionPanel:GameOptionPanel游戏设置项面板主要用于显示设置游戏参数,比如check控件选择是否显示网格,是否关闭彩色设置,以及游戏难度中在底部

21、随机生成障碍物行数设置。游戏的开始暂停按键,游戏简单说明也在此面板中显示。GameOptionPanel面板主要知识显示用户可见的按钮选择,具体Button的功能在主面板中进一步扩充。其中随机生成障碍物个数行数和满行效果时间必须根据用户输入在此类中需要两个方法分别实现获得这两个输入数据,个数行数和时间。图2 GameOptionPanel图GameOptionPanel类部分代码如下,主要是设置功能部分的代码,如返回程序用户选择的颜色及设置的其他参数,可视化可以完成的部分已经省略:public JFrame getFrame() /获得一个Framereturn frame;public vo

22、id 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 (NumberFo

23、rmatException 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 s

24、etTextField_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_

25、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();p

26、ublic 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() retu

27、rn 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;p

28、ublic JButton getButtonBackgroundColor() return buttonBackgroundColor;public JButton getButton_default() return button_default; 4.2.3游戏主面板MainFrame:1)MainFrame面板通过继承JFrame类和实现GameListener接口完成了总的游戏界面设计。本设计中,MainFrame是最重要也是比较复杂的一个类,main()方法也在其中,运行程序时运行main()方法开始,通过main()方法调用其他的类和其他类中的方法来实现整个游戏。图3 Main

29、Frame图图中设置背景颜色设置为浅蓝色;显示网格,网格颜色设置为黑色;图形设置颜色为红色,上面的图片看不出来,因为在消行时间点上还没有产生新的图形;障碍物设置为蓝色,也就是红色图形下落后就变成了蓝色。本轮游戏设置了随机生成了50个5行障碍物在游戏最开始游戏面板的底部,障碍物是随机生成的小格,位置随机,颜色也随机,设置障碍物越少排列行越多障碍物排列得越稀散,等于是游戏难度越大。而满行时间效果是300,单位是毫秒,消行时满行瞬时颜色设置为了黄色。在图3中可以看到捕捉到的300毫秒的消行时颜色。MainFrame部分代码如下:public static void main(String args)

30、 /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毫秒/格”,这已经是最

31、大速度,对比图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_ST

32、EP;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 中各个颜色设置按钮都能弹出颜色选择框,“请

33、选择背景颜色”,“请选择图形的颜色”,“请选择网格的颜色”,“请选择障碍物的颜色”“,请选择满行的效果的颜色”。MainFrame中图形颜色部分选择代码如下:gameOptionPanel.getButton_shapeColor().addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) Color shapeColor = JColorChooser.showDialog(MainFrame.this, 请选择图形的颜色,new Color(0xFF4500);if (shap

34、eColor != 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 !

35、= 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.s

36、etObstacleColor(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.setFullLineCo

37、lor(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(

38、backgroundColor););另外,颜色框的代码部分在Global类中:private static List loadColors() List l = new ArrayList(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(k

39、ey);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.

40、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 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() = 8 ? 8 : s

41、tr.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提示图5 总结和展望 5.1 收获与体会在这次课程设计我们认识和掌握了到很多东西有关Elcipse的相关知识。整个系统对JAVA进行了

42、全面细致的应用设计,遵循了JAVA面向对象的原则。准来开发系统是很有必要的,这样可以避免事后对系统进行大量的维护。但由于时间关系,该系统的部分功能并未能完全实现,部分功能的实现也过于简单。我这次实验做的是俄罗斯方块,之所以选这个题目是因为,我想体验一下用java编写游戏的乐趣,可以自己编写自己玩,很有意思。大家可能会认为这个题目很简单,没什么难度,本来我也是这么想的;可是当真正着手做时,发现很多东西并不容易实现。比如:如何显示每一个俄罗斯小方块,如何预测下一个俄罗斯小方块,如何控制每一个方块的下落速度,如何判断俄罗斯方块是否可以停止,如何通过键盘控制俄罗斯方块的位置和方向等。如果有一行或多行满行,如何删除这些行,并重新绘制游戏区界面,同时分数如何计算并显示等等,都要一一实现。感觉真是难上加难。不过,是事情总会有解决办法,是问题总有突破口,于是我找来相关书籍仔细研究其算法,最后终于一切明了于心。当然,在这次课程设计中,也出现

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号