俄罗斯方块案例分析_第1页
俄罗斯方块案例分析_第2页
俄罗斯方块案例分析_第3页
俄罗斯方块案例分析_第4页
俄罗斯方块案例分析_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 俄罗斯方块案例分俄罗斯方块案例分析析1.俄罗斯方块的基本规则以及业务需俄罗斯方块的基本规则以及业务需求求1.1一个用于摆放七种方块的一面墙(面板)其标准大小:行宽为10,列高为20,以每个小正方形为单位。 1.2一组由4个小型正方形组成的规则图形,英文称为Tetromino.中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的1.3具体功能(1)玩家操作有:旋转方块,以格子为单位左右移动方块,让方块加速落下。(2)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。(3)当区域中某一行横向格子全部由方块填满,则该列会消失并成为玩

2、家的得分。同时删除的行数越多,得分指数上升。(4)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。(6)一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估要如何进行。由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。(7)预先设置的随机发生器不断地输出单个方块到场地顶部俄罗斯方块的案例演示俄罗斯方块的案例演示2.2.俄罗斯方块的业务分析俄罗斯方块的业务分析 根据俄罗斯方块的业务需求以及上面的演示图可以得知俄罗斯方块(tetris)案例中业务对象有:业务对象的命名以及意义: tetris(俄罗斯方块) (1)score: 统计

3、游戏中玩家的所得分数。 (2) lines :记录玩家的销毁行数。 (3) wall:(墙 20行X10列)即俄罗斯方块所要摆放和移动的场所。 ROWS:行20 COLS:列10 (4) tetromino :俄罗斯方块都是四个小格子组成的七种不同形态的对象,每次总有一个随机的正在下落的俄罗斯方块对象在墙上进行移动和变换。 (5)nextOne :每次当有这个俄罗斯方块进行下落的时候,总会有一个随机生成的下一次即将下落的俄罗斯方块对象供玩家参考。数据抽象:由于每个俄罗斯方块对象都要至于墙上的四个格子,而每个格子中都有自己的坐标位置即行数(row)和列数(col)以及格子的贴图(image)三种

4、数据属性3.3.俄罗斯方块的类的数据结构设俄罗斯方块的类的数据结构设计计 1)格子类(Cell),定义了每个小格子的具体属性: 格子的行数int row 格子的列数int col 格子的贴图Image image 类中的方法: 格子的下降drop() 格子的左移动moveLeft() 格子的右移动moveRight() 2)四格方块类(Tetromino),由于每个俄罗斯方块由四个格子按照不同的位置摆放构成,所以需要定义一个抽象的四格方块类,并在此类中定义七个继承于四格方块类的内部类实现I,L,Z,S,O,J,T这七种不同形态俄罗斯方块。由于后续还需实现俄罗方块的旋转,所以在每个内部类中还应该

5、加入俄罗斯方块的每个格子旋转状态,并在四格方块类中定义一个描述旋转状态的的内部类。 具体的属性有: 四格方块protected Cell cells = new Cell4 旋转状态protected State states 旋转状态下标private int index = 10000 类中的方法:类中的方法: 四格方块的向右旋转四格方块的向右旋转rotateRight() 四格方块的向左旋转rotateLeft() 四格方块的向下掉落softDrop() 四格方块的向左移动moveLeft() 四格方块的向右移动moveRight() 采用简单工厂法随机生成七种不同类型的俄罗斯方块ran

6、domOne() 3)俄罗斯方块(Tetris)类继承于Jpanel空白面板类作为图形界面,实现俄罗斯方块的具体功能。类中包含的属性有: 用户的得分int score 消除的行数int lines 贴图的创建public static Image J,I,Z,S,T,O,L,groundback 20行10列的格子类型(Cell)的墙Cell wall = new Cell2010 正在下落的俄罗斯方块Tetromino Tetromino 下一个要下降的方块, Tetromino nextOne 类中的方法: 图形界面的绘制paint(Graphics g),在此方法中包含了画墙,画分数,画

7、 正在 下落的方块,下一个下落的方块 启动软件action ()内部包含了键盘的 命令控制以及相应的算法调用 俄罗斯方块的的下落,左移,右移,左旋转,右旋转,检查边界,检查重合, 消除行数,降落到墙4.4.俄罗斯方块的方法流程俄罗斯方块的方法流程如下:图形界面绘制随机生成正在下落的俄罗斯方块俄罗斯方块的具体行为下落左移动右移动旋转检查出界检查满行检查重合检查满行随机生成下一个俄罗斯方块消除满行重复此流程用户操作自动调用5.5.俄罗斯方块的具体方法实现俄罗斯方块的具体方法实现1)图片加载)图片加载Class 类提供了一个方法 getResource() 可以找到package中的文件位置, 利用

8、这个位置可以读取图片文件到内存中的对象注意:tetris.png 文件 与 Tetris.class 在同一个包中静态的代码块只在类加载的时候执行,可以用来加载图片静态的代码块只在类加载的时候执行,可以用来加载图片statictryClass cls = Tetris.class; background = ImageIO.read(cls.getResource(tetris.png); I = ImageIO.read(cls.getResource(I.png); L = ImageIO.read(cls.getResource(L.png); T = ImageIO.read(cls.

9、getResource(T.png); S = ImageIO.read(cls.getResource(S.png); Z = ImageIO.read(cls.getResource(Z.png); O = ImageIO.read(cls.getResource(O.png); J = ImageIO.read(cls.getResource(J.png);catch(Exception e)e.printStackTrace();2)俄罗斯方块的自动掉落 要实现俄罗斯方块的自动掉落就必须要定义一个计时器对象,通过让计时器对象在指定的时间段内重复做俄罗斯方块的下降命令,就可以实现俄罗斯方

10、块的自动掉落。但必须注意的是必须在每次重复掉落的时候重绘一下面板,这样才能够在面板中清楚的观察到俄罗斯方块的下落行为。private Timer timer;/创建一个计时器对象创建一个计时器对象private int inteval = 800;/间隔时间间隔时间TimerTask task = new TimerTask()/创建一个新的计时器任务创建一个新的计时器任务public void run()softDropAction();repaint();timer = new Timer();/创建定时器创建定时器timer.schedule(task, inteval,inteval)

11、;3)俄罗斯方块的旋转在定义俄罗斯方块的时候,将每个俄罗斯方块在旋转时不动的小格子定义为旋转轴,则每个俄罗斯方块的每种旋转状态都可以用每个格子与旋转轴格子的行列相对位置作为其旋转状态,如图所示:对于T型俄罗斯方块的状态有四种,每种状态都包含八种属性,分别对应每个格子与轴格子的行,列相对位置。每次俄罗斯方块的旋转就相当于每种旋转状态的转换,每次从一种状态到另一种状态的转变就相当于与当前俄罗斯方块的旋转状态的八种行列相对属性分别与对应实际旋转轴格子的行列的和。列如:从S0(0,0,-1,0,0,1,1,0) S1(0,0,-1,0,1,0,0,-1)旋转轴O:的实际位置(3,2)转换(0,0)+(

12、3,2)(3,2) (-1,0)+(3,2)(2,2) (1,0)+(3,2)(4,2) (0,-1)+(3,2)(3,1) 由于要在每种俄罗斯方块中添加它的旋转状态,所以在Tetromino类中添加描述俄罗斯方块状态的内部类。 具体代码:protected class State下面的八个属性就表示每个格子与旋转轴格子的行,列的相对位置下面的八个属性就表示每个格子与旋转轴格子的行,列的相对位置int row0,col0, row1,col1, row2,col2, row3,col3;public State(int row0, int col0, int row1, int col1, i

13、nt row2,int col2, int row3, int col3) super();this.row0 = row0;this.col0 = col0;this.row1 = row1;this.col1 = col1;this.row2 = row2;this.col2 = col2;this.row3 = row3;this.col3 = col3;每次调用旋转算法的时候,先让每次调用旋转算法的时候,先让index旋转状态下标加一(右转)或减一(左转),旋转状态下标加一(右转)或减一(左转),然后用旋转状态下标对旋转状态数组取余,就可以得到下一个俄罗斯方块状态,然然后用旋转状态下标

14、对旋转状态数组取余,就可以得到下一个俄罗斯方块状态,然后分别用旋转轴的行列坐标与下一个俄罗斯方块状态中行列分别想加,即可以得到后分别用旋转轴的行列坐标与下一个俄罗斯方块状态中行列分别想加,即可以得到下一个状态的实际的俄罗斯方块的位置信息。下一个状态的实际的俄罗斯方块的位置信息。具体代码具体代码:public void rotateRight()index+;/10001State s = statesindex%states.length;/1,得到s = s1状态,取余运算,循环获取四种不同的状态Cell o = cells0;/获取轴的格子对象int row = o.getRow();int col = o.getCol();cells1.setRow(row+s.row1);cells1.setCol(col+s.col1);cells2.setRow(row+s.row2);cells2.setCol(col+s.col2);cells3.setRow(row+s.row3);cells3.setCol(col+s.col3);6.俄罗斯方块案例拓展 在俄罗斯方块案例的学习后,通过对案例的分析和重写,我将此案例的方法联系到了打飞机游戏与连连看看游戏中,并仿写了具体的代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论