毕业论文java俄罗斯方块游戏.docx
- 文档编号:29904059
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:11
- 大小:106.31KB
毕业论文java俄罗斯方块游戏.docx
《毕业论文java俄罗斯方块游戏.docx》由会员分享,可在线阅读,更多相关《毕业论文java俄罗斯方块游戏.docx(11页珍藏版)》请在冰豆网上搜索。
毕业论文java俄罗斯方块游戏
5.详细设计
5.1模型层(Model)设计
5.1.1图形的产生
通过图形工厂类ShapeFactory的getShape(ShapeListenerlistener)方法随机产生方块的某种状态,这里运用了工厂设计模式,这种设计模式是为了实现高内聚低耦合而存在的,这种设计模式的通俗解释就是:
你想要一个产品,你需要让工厂给你生产一个,你要告诉工厂你要生产什么产品,就把你需要生产的这个产品当做参数传给工厂类的生产产品的方法,然后根据你传进来的产品,而决定工厂人生产什么产品,产生出来产品后,最后要返回您要的这个东西。
5.1.2图形的数据结构
定义一个4x4方阵,共16个小格。
用“0”和“1”来表示每个方格是绘制还是空白,由此可以组合出多种图形,如图所示:
其中图一表示为{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}
其中图二表示为{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
其中图三表示为{0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0}
其中图四表示为{0,0,0,0,0,1,0,1,0,1,1,0,0,0,1,0}
方块的旋转是通过绘制4个方向的方块,在不同旋转角度显示不同方向的方块来完成的。
所以程序要控制方块的旋转方向,只要控制显示哪副图就可以了。
本游戏是用一个三维数组int[][][]shapes=newint[][][];作为存储方块的数据结构来保存方块的28种状态的。
5.1.3图形的移动
图形类Shape保存了自己的位置信息,用left表示图形到左边界的距离,top表示图形到上边界的距离,图形移动就是改变left和top的值。
向上移动:
top减1,向下移动:
top加1,向左移动:
left减1,向右移动:
left加1。
图形的移动分为图形的自动下落以及通过按键事件实现图形的左移、右移以及加速下移。
通过多线程ShapeDriver类来实现图形的自动下移,由于游戏中方块的动态性,每个方块有一定的生命周期,所以选用线程来实现方块。
一个方块用一个线程类对象实现,该类继承与Thread类,当一个方块出现时也就表示一个线程对象产生并开始运行。
通过对按键事件的响应,实现图形的左移、右移以及加速下移。
5.1.4图形的变形
通过inttype=newRandom().nextInt(shapes.length); shape.setBody(shapes[type]);
shape.setStatus(0);实现初始图形的初始化,通过status=(status+1)%body.length;实现图形的变形功能。
5.1.5存储和表示障碍物
用一个和显示区域的面板大小相对应的二维数组保存障碍物的位置信息,如果对应的位置是障碍物,则这个数组中相应的元素就为1,否则就为0。
如何把图形变成障碍物呢?
只要把属于图形的格子对应的位置都变成障碍物即可。
代码如下:
publicbooleanisMember(intx,inty,booleanrotate){
inttempStatus=status;
if(rotate){
tempStatus=(status+1)%body.length;
}
returnbody[tempStatus][y*4+x]==1;
}
publicvoidaccept(Shapeshape){
System.out.println("Ground'saccept");
for(intx=0;x<4;x++){
for(inty=0;y<4;y++){
if(shape.isMember(x,y,false)){
if((shape.getLeft()+x) zaw[shape.getLeft()+x][shape.getTop()+y]=1; } } } } 5.1.6判断满行及消行 如果某一行没有空白,则这一行就是满行。 满的那行上面所有的行整体下移一行就是消除这个满行。 代码如下: privatevoiddeleteFullLine(){ for(inty=Global.HEIGHT-1;y>=0;y--){ booleanfull=true; for(intx=0;x if(zaw[x][y]==0){ full=false; } } if(full){ deleteLine(y); } } } privatevoiddeleteLine(intlineNum){ for(inty=lineNum;y>0;y--){ for(intx=0;x zaw[x][y]=zaw[x][y-1]; } } for(intx=0;x zaw[x][0]=0; } deleteFullLine(); } 利用循环语句从屏幕最底行依次向上对有方块的每一行进行判断,判断某一行中是否有空白,如果没有空白的话,则将当前的行号传递给deleteLine(intlineNum)方法,由该方法实现消除当前行,并将上面的方块依次下移一行,最后再重新调用deleteFullLine()方法进行查找,直到所有行都检查一遍结束。 5.2视图层(View)设计 5.2.1方块的显示 通过视图层的GamePanel类的paint(Graphicsg)方法调用Shape类的drawMe(Graphicsg)方法,从而实现方块的绘制,代码如下: publicvoiddrawMe(Graphicsg){ g.setColor(Color.BLUE); for(intx=0;x<4;x++){ for(inty=0;y<4;y++) if(getFlagByPoint(x,y)){ g.setColor(newShape().shapeColor); g.fill3DRect((left+x)*Global.CELL_SIZE, (top+y)*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true); } } } 5.2.2障碍物的显示 通过视图层的GamePanel类的paint(Graphicsg)方法调用Ground的drawMe(Graphicsg)方法,从而实现障碍物的绘制,代码如下: publicvoiddrawMe(Graphicsg){ for(intx=0;x for(inty=0;y if(zaw[x][y]==1){ g.fill3DRect(x*Global.CELL_SIZE, y*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true); } } } } 5.3控制层(Controller)设计 控制层主要是实现图形工厂生产图形,图形按键事件的处理,方块、障碍物显示的控制,图形自动下落和障碍物生成的控制。 通过控制层这个大管家最终实现此俄罗斯方块的按键事件的处理以及各种逻辑的处理。 5.4游戏演示 5.4.1游戏界面显示 5.4.2开始和结束控制菜单 5.4.3 分数和等级查看菜单 5.4.4变换方块菜单 5.4.5帮助菜单 5.系统测试 5.1游戏界面菜单选项的功能测试 (1)“控制”菜单测试 ①点击“游戏”“开始” 输出: 游戏开始 结果: 正常 ②点击“游戏”“结束” 输出: 弹出游戏结束提示框 结果: 正常 (2)“查看”菜单测试 ①点击“查看”“分数” 输出: 在游戏面板中间跳出分数显示框 结果: 正常 ②点击“查看”“级别” 输出: 在游戏面板中间跳出级别显示框 结果: 正常 (3)“变换”菜单测试 ①点击“变换”“改变方块” 输出: 在游戏面板中显示随机产生的某种方块 结果: 正常 5.2按键事件的功能测试 (1)方块移动测试 游戏过程中,点击“左、右、下”方向键 输出: 方块正常移动,不会移出边界 结果: 正常 (2)方块反转测试 游戏过程中,点击向上方向键 输出: 方块无边界和障碍物阻挡的情况下可反转 结果: 正常 5.3方块堆砌与消行测试 (1)当方块下落到最底面或与障碍物接触时 输出: 方块成功堆砌在底部 结果: 正常 (2)当出现满行现象时 输出: 所有满行被消除,方块依次下移 结果: 正常 5.4测试结果分析 经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业论文 java 俄罗斯方块 游戏