俄罗斯方块游戏的设计-java课设-含可运行程序_第1页
俄罗斯方块游戏的设计-java课设-含可运行程序_第2页
俄罗斯方块游戏的设计-java课设-含可运行程序_第3页
俄罗斯方块游戏的设计-java课设-含可运行程序_第4页
俄罗斯方块游戏的设计-java课设-含可运行程序_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

课程设计说明书 NO.42俄罗斯方块游戏的设计1. 课程设计的目的 在工作压力及其巨大的今天,游戏成了众多上班一族和学生朋友学习放松的工具,所以设计了一个俄罗斯方块的游戏程序,游戏功能齐全,随进随出,根据自己的能力设置游戏的难度系数。通过此次课程设计,巩固了所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Eclipse等开发工具的运用,拓宽常用类库的应用。通过该教学环节与手段,把所学课程及相关知识加以融会贯通,理论与实际的结合,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。2.设计方案论证2.1设计思路本课程设计的目标是做一个俄罗斯方块的游戏软件,实现界面初始化,游戏背景颜色和不同方块类型的初始化,程序正常运行,对游戏难度不同程度的设置,游戏的从新开始,正常退出和相应的数据计算功能。类似下落、转向、平移、得分累加和计数等。在设计过程中,充分的利用平时课堂所学知识。在游戏里,设置了7种不同形状的方块分别为条形、T型、田型、正反Z型、正反L型。各种类的实现,分数面板类,用来显示分数和关数。添加三个标签,并设置字体格式,定义控制面板类,新建并添加控制按钮。定义预览面板类,显示下一个。在预览框内实现随机产生不同颜色和种类的小方块。联合类,新建三个面板对象,将以上产生的三个面板添加到总的控制面板上。俄罗斯游戏方块面板类,它起的就是显示屏的作用,各种方块的运行状况,都由其控制。主框架类,将显示类面板和控制类面板按边界布局添加到主类当中。从而实现游戏界面整体的融合和功能的实现。2.2设计方法俄罗斯方块的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDLET后,就立即生成一个重绘线程,该线程每隔100MS绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的下坠物(下坠物一共有7种,由4种小砖块组成,每种下坠物颜色固定为灰白色,可以上下左右旋转)就不需要重绘。游戏画布是一个COMMANDLISTENER,可以接受用户键盘命令,控制下坠物的左移,右移,下移,旋转动作。整个游戏的流程控制体现在游戏画布对象的PAINT()方法里。PAINT()根据当前的游戏状态,绘制出当时的游戏画面。对于游戏处于运行状态的画面的绘制,则需要在下坠物的当前位置,绘制下坠物。在绘制下坠物之前,判断下坠物是否还能下坠,如果能下坠的话,就让它下落一格,再进行绘制,如果下坠物已无法下坠,则判断游戏是否处于游戏结束状态,如果是处于游戏结束状态的话,则设置游戏状态为游戏结束状态。如果游戏不是处于游戏结束状态,则把下坠物固定下来,同时检查游戏画布上下坠物当前行下面的所有行,看是否需要进行行删除动作,如果需要行删除,则清除游戏地图上被删行的数据,再把被删行绘制成背景色。然后初始化一个新的下坠物,绘制这个新的下坠物。根据需求分析要实现的系统功能,可以得出系统的模块图:俄罗斯方块游戏画布游戏界面游戏操作处理面板类处理初始化问 题主框架类构建画布7种游戏方块类键盘事件command控制按钮监听事件多线程处理方法模块 图1 系统模块图主程序的流程图为开始 判定是否满格绘制方块下落游戏结束是否能旋转调节难度NoYes正常下落旋转方块消除满格的行时钟等待时间超100游戏随机绘制方块YesNo固定方块绘制游戏结束界面NoYes图2 主程序流程图 得分模块的流程图为开始 设计游戏难度自动生成任意方块方块落底,变成蓝色判断是否格满Showscore加分显示面板上显示分数结束调用退出程序YesNo图3 得分模块流程图2.3 设计中的成员变量和方法表1 主框架中的成员变量成员变量描述变量类型名称是否可以控制标志变量booleancontrol游戏是否结束变量 booleanGameOver是否允许改变变量 booleanturn时间计时变量Timertimer 得分变量intShowScore表2 主框架中的主要方法方法名功能paintComponent(Graphics)绘制整体游戏所需界面down(block)判断并执行下落方块full()判断一行是否为满方法Creat()创造下一个随机方块的方法trychange() 判断当前方块是否并执行改变2.4 设计中的主要类RussiaGame02 主框架类 主框架类,将显示类面板和控制类面板按边界布局添加到RussiaGame02,该类含有main方法,是程序的入口,该方法是吧所有模块联系在一起的关键,设置了此容器为边界布局,将显示面板放在中央,控制面板放在右侧,并为显示面板控制面板添加监听器。Control控制面板类是Jpanel类的子类,可以按网格布局添加控制按钮,添加边框。设置六个控制按钮。开始游戏、退出游戏、提高速度、降低速度、提高关数、降低关数。setLayout(new GridLayout(6,1,0,5)定义布局GridLayout,使按钮竖向排列。show定义分数面板类用来显示分数速、度和关数。添加四个标签,并设置字体格式按网格布局添加四个标签,设置标签格式Show(),加边框。四个标签分别当前得分、当前速度、当前闯关、勇往直前。setLayout(new GridLayout(4,1); this.setBorder(c); s1.setFont(b); s3.setFont(b); s2.setFont(b); s4.setFont(b);Unit联合类 新建三个面板对象,将以上产生的三个面板添加到总的控制面板上。可构造函数,格式为setLayout(new GridLayout(3,1),按网格布局添加三个面板对象到总的控制面板上,add (control);add (show);add (shownext);Main函数的代码如下public class RussiaGame02 extends JFrame implements ActionListener,ItemListener RussiaPanel p; Unit u = new Unit(); public RussiaGame02() p=new RussiaPanel(u); Container con = this.getContentPane(); con.setLayout(new BorderLayout();/设置此容器为边界布局 con.add(p,BorderLayout.CENTER);/将显示面板放在中间 con.add(u,BorderLayout.EAST);/控制面板放在右侧 this.addKeyListener(p);/为显示面板添加监听器 JOptionPane.showMessageDialog(this, 寒涛工作室欢迎进入俄罗斯方块游戏 !);/显示欢迎对话框 MenuBar myB=new MenuBar();/新建控制菜单 setMenuBar(myB); Menu m1=new Menu(游戏);/新建标题菜单 MenuItem m11=new MenuItem(新游戏,new MenuShortcut(KeyEvent.VK_N);/新建菜单选项 m1.add(m11); MenuItem m14=new MenuItem(退出,new MenuShortcut(KeyEvent.VK_X); m1.add(m14); m1.addActionListener(this);/为菜单添加监听器 myB.add(m1); Menu m3=new Menu(帮助); m3.add(关于); myB.setHelpMenu(m3); public static void main(String args) /绘制程序界面 RussiaGame02 f = new RussiaGame02(); f.setSize(450, 600); f.show() public void itemStateChanged(ItemEvent e)/ public void actionPerformed(ActionEvent e)/菜单监听器的实现细节 if(e.getActionCommand()=退出)/如果按退出键则退出 System.exit(0); if(e.getActionCommand()=新游戏)/按新游戏键,清空显示屏幕并重置 p.uu.control.b4.setEnabled(true); p.uu.control.b5.setEnabled(true); p.reset(); p.uu.control.b1.setLabel(点击继续玩);/将按开始按扭标签置换为重玩一次 if(!p.GameOver() p.clean(); p.t.suspend(); else p.clean(); p.t.resume(); 3.设计结果与分析调试程序,没有错误后开始运行,进入游戏界面模块图4 进入游戏界面图选择确定后进入游戏界面,设置了此容器为边界布局,控制面板上设置六个控制按钮。将显示面板放在中央,控制面板放在右侧。开始游戏、退出游戏、提高速度、降低速度、提高关数、降低关数。,分数模块设置字体格式按网格布局添加四个标签,设置标签格式Show(),加边框。四个标签分别当前得分、当前速度、当前闯关、勇往直前。图5 游戏界面图游戏开始前可以选择游戏的速度和关数从而设置游戏的难度,游戏开始的默认难度速度为1级,关数也为1级所得学分为0,设置的关数越高,难度就越大。游戏开始后,就不可以改变难度,只能选择暂停和退出程序。 图6 提高级别后运行界面图玩家开始玩游戏后,如果在方块没有到达顶端的前提下可以消除一行,当前得分自动增加100分,当方块到达顶端时而无法消除,生成的方块不能再下了,则游戏结束,出现游戏结束的界面模块,出现你也太差劲了几个字样。图7 游戏结束界面图游戏结束后显示本次游戏的得分数,点击确定后就可以继续选择进行游戏。图8 本次游戏得分界面图 当游戏结束或者中途想重新玩游戏的时候,就可一选择新游戏选项或者点击ctrl+n进行新游戏。点击退出或者快捷键ctrl+x就退出游戏界面。 图9 进入新游戏界面图 一轮游戏是一个大循环,在这个循环中,每隔100毫秒,检查游戏中的当前块是否已经到底了,如果没有, 就继续等待。如果到底了,就看有没有全填满的行,如果有就删除它,并为游戏者加分,同时随机产生一新的当前块,让它自动下落。当新产生一个块时,先检查画布最顶上的一行是否已经被占了,如果是,可以判断Game Over了。虽然成功的完成游戏设计,但也发现了自己很多的不足,很多预想功能还不能在游戏运行中实现,无声音效果,略显调,界单面不够漂亮,还有很多小瑕疵有待完善。 4.设计总结通过此次课程设计,将我所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很多问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。从实践上认识了Java是如何编写命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意构造,将不必要的命令去除。深入的了解了JAVA语言的严谨性,了解了JAVA语言中众多方法,类的使用,为以后学习打下良好的基础。JAVA是一种面向对象的程序语言。熟悉数据库的基本知识及一种以上数据库系统开发软件。最后衷心感谢在课程设计过程中给予过我帮助的老师和同学们,没有他们的帮助课程设计就不能圆满完成。5.参考文献1陈国君,陈磊,刘洋Java2程序设计基础M北京:清华大学出版社;2008.62耿祥义,张跃平Java课程设计M北京:清华大学出版社;2008.113张思民,梁维娜Java程序设计实践教程M北京:清华大学出版社;2006.84叶核亚JAVA2程序设计实用教程M(第2版)北京:电子工业出版社;2008.46. 附录:import javax.swing.*;/导入高级抽象窗口,完成更高级的功能import java.awt.*;/导入java.awt包 提供生成各种标准图形界面元素和处理图形界面的类库import java.awt.event.*;/导入抽象窗口类事件包import java.util.*;import javax.swing.border.*;import java.applet.*;class XFK /小方块类 int m;/横坐标 int n;/纵坐标abstract class FK /所有俄罗斯方块的父类 XFK xfk = new XFK4;/每个俄罗斯方块由4个小方块构成 int state;/定义长条的状态 int map; public void setMap(int map)/定义背景的二维数组, this.map = map; FK ()/默认的构造函数 for (int i = 0; i4; i+)/一个for循环,循环4次 xfki = new XFK();/对XFK对象数组xfk初始化 abstract public void reset();/每个方块都有的重设方法 abstract public void turn();/虚的旋转方法 abstract public boolean canTurn();/判断是否能旋转的方法 public void move(int fx)/用于将各个小方块的坐标左移 switch(fx) case KeyEvent.VK_LEFT:/向左移动 for (int i = 0;i4; i+)/循环语句 xfki.m-;/每一个小方块的横坐标减一,向左移一步 break; case KeyEvent.VK_RIGHT:/向右移动 for (int i = 0; i 4; i+) /循环语句 xfki.m+;/每一个小方块的横坐标加一,向右移一步 break; case KeyEvent.VK_DOWN:/向下移动 for (int i = 0;i4; i+)/循环语句 xfki.n+;/每一个小方块的纵坐标加一,向下移一步 break; default: break; public boolean canMove(int fx)/定义canMove方法,用于判断能否移动 switch(fx) case KeyEvent.VK_LEFT: for (int i = 0;i4; i+)/循环语句 int m = xfki.m - 1;/将xfki的横坐标值减一,向左移动一步所得到的坐标赋值给m int n = xfki.n ;/保持纵坐标值不变 if (m=12 | n=18 |mapmn =1)/移动时是否任何一个小方块到了边界 return false; return true; case KeyEvent.VK_RIGHT: for (int i = 0;i4; i+) int m = xfki.m + 1; int n = xfki.n ; if (m=12 | n=18 |mapmn =1) return false; return true; case KeyEvent.VK_DOWN: for (int i = 0;i4; i+) int m = xfki.m; int n = xfki.n + 1 ; if (m=12 | n=18 |mapmn =1 ) return false; return true; default: return false; class FK1 extends FK /长条形类 public void reset() /定义Fk1类的reset方法 /出现状态(state) state = (int)(Math.random()*2);/随机产生数0,1初始化大方快状态 /状态的种类 if (state = 0) /条形方块横向状态 for (int i = 0; i4; i+) xfki.m = 4+i; /初始化组成条形图形各小方块横向坐标 xfki.n = 0; /初始化组成条形图形各小方块纵向坐标 else /条形方块竖向状态 for (int i = 0; i0&xfk0.m10)/各小方块横向坐标必须在可变范围 int m = xfk0.m - 1; int n = xfk0.n + 1; for (int i = 0; i4; i+) xfki.m = m + i; xfki.n = n; state=0; /重置条形状态 else if(xfk0.n16) /横向个小方块从向坐标不能超过16 int m = xfk0.m + 1; int n = xfk0.n - 1; for (int i = 0; i4; i+) xfki.m = m; xfki.n = n+i; state = 1; /重置条形状态 public boolean canTurn() /判断方块是否可以转 turn(); /调用方块旋转方法使方块转动 for(int i=0;i4;i+)/循环方块的每一小块 int m=xfki.m; /将旋转后的每一小块的横坐标赋给m int n=xfki.n; /将旋转后的每一小块的纵坐标赋给n if ( m11 | n17 | map mn = 1 )/if条件旋转后方块坐标超过map或是与有方块的地方冲突 return true; /如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 return false; /如果旋转后坐标在map内且没有和有方块的地方冲突,则返回false不再旋转,相当于能旋转 class FK2 extends FK /正Z形类 public void reset()/定义Fk2类的reset方法 state = (int)(Math.random()*2);/随机产生数0,1初始化大方快状态 switch(state) case 0:/随机产生数0时,产生的为竖着的Z方块 for(int i=0;i2;i+) xfki.m=5;/初始化组成条形图形各小方块横向坐标 xfki.n=i;/初始化组成条形图形各小方块纵向坐标 for(int i=2;i4;i+)/一个for循环,循环4次 xfki.m=4;/初始化组成条形图形各小方块横向坐标 xfki.n=i-1;/初始化组成条形图形各小方块纵向坐标 break; case 1:/随机产生数1时,产生的为横着的的Z方块 for(int i=0;i2;i+)/一个for循环,循环2次 xfki.m=6-i;/初始化组成条形图形各小方块横向坐标 xfki.n=1;/初始化组成条形图形各小方块纵向坐标 for(int i=2;i4;i+)/一个for循环,循环2次 xfki.m=7-i;/初始化组成条形图形各小方块横向坐标 xfki.n=0;/初始化组成条形图形各小方块纵向坐标 break; default: break; public void turn()/定义turn方法,用于改变状态 int m,n; switch(state) case 0: m=xfk0.m+1;/第一个小方块的横坐标的值加1,并赋值给m n=xfk0.n+1;/第一个小方块的竖坐标的值加1,并赋值给n for(int i=0;i2;i+)/循环语句 xfki.m=m-i;/将每一个小方块从m-1到m列排列 xfki.n=n;/将每一个小方块都在第n行排列 for(int i=2;i4;i+)/循环语句 xfki.m=m+1-i; xfki.n=n-1; break; case 1: m=xfk0.m-1; n=xfk0.n-1; for(int i=0;i2;i+) xfki.m=m;/将每一个小方块都在第m列排列 xfki.n=n+i;/将每一个小方块从n到n+1行排列 for(int i=2;i4;i+) xfki.m=m-1; xfki.n=n+i-1; break; default: break; state=(state+1)%2;/改变状态 public boolean canTurn() /判断方块是否可以转 turn(); /调用方块旋转方法使方块转动 for(int i=0;i4;i+)/循环方块的每一小块 int m=xfki.m; /将旋转后的每一小块的横坐标赋给m int n=xfki.n; /将旋转后的每一小块的纵坐标赋给n if ( m11 | n17 | map mn = 1 )/if条件旋转后方块坐标超过map或是与有方块的地方冲突 return true; /如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 return false; /如果旋转后坐标在map内且没有和有方块的地方冲突,则返回false不再旋转,相当于能旋转 class FK3 extends FK /T型类 public void reset()/重置方法 state = (int)(Math.random()*4);/随机产生数0,1,2,3初始化大方快状态 switch(state) case 0:/随机产生数0时,产生的为横着的的反T型方块 for (int i = 0; i 3; i+) /一个for循环 xfki.m = 4+i;/初始化组成条形图形各小方块横向坐标 xfki.n = 1; xfk3.m = 5; xfk3.n = 0; break; case 1:/随机产生数1时,产生的为!-型方块 for (int i = 0; i 3; i+) xfki.m = 5;/初始化组成条形图形各小方块横向坐标 xfki.n = i; xfk3.m = 6;/初始化组成条形图形各小方块横向坐标 xfk3.n = 1; break; case 2:/随机产生数2时,产生的为T型方块 for (int i = 0; i 3; i+) xfki.m = 4+i;/初始化组成条形图形各小方块横向坐标 xfki.n = 0; xfk3.m = 5; xfk3.n = 1; break; case 3:/随机产生数1时,产生的为-!型方块 for (int i = 0; i 3; i+) xfki.m = 5;/初始化组成条形图形各小方块横向坐标 xfki.n = i; xfk3.m = 4; xfk3.n = 1; break; default: break; public void turn()/定义turn方法,用于改变状态 int m,n; switch(state) case 0: m = xfk0.m + 1;/第一个小方块的横坐标的值加1,并赋值给m n = xfk0.n -1;/第一个小方块的竖坐标的值减1,并赋值给n for (int i = 0; i0) m = xfk0.m - 1;/第一个小方块的横坐标的值减1,并赋值给m n = xfk0.n + 1;/第一个小方块的竖坐标的值加1,并赋值给n for (int i = 0; i3; i+)/循环语句 xfki.m = m+i;/将每一个小方块从第m列道m+2排列 xfki.n = n;/将每一个小方块都在第m行排列 xfk3.m = m+1;/第三个小方块的横坐标的值加1,并赋值给m xfk3.n = n+1;/第三个小方块的竖坐标的值减1,并赋值给n else state=1; turn(); break; case 2: m = xfk0.m + 1;/第一个小方块的横坐标的值加1,并赋值给m n = xfk0.n - 1;/第一个小方块的竖坐标的值减1,并赋值给n for (int i = 0; i 3; i+) /循环语句 xfki.m = m;/将每一个小方块都在第m列排列 xfki.n = n + i;/将每一个小方块从n到n+2行排列 xfk3.m = m - 1;/第三个小方块的横坐标的值减1,并赋值给m xfk3.n = n + 1;/第三个小方块的竖坐标的值减1,并赋值给n break; case 3: if(xfk0.m11) m = xfk0.m - 1;/第一个小方块的横坐标的值减1,并赋值给m n = xfk0.n + 1;/第一个小方块的竖坐标的值加1,并赋值给n for (int i = 0; i 3; i+) /循环语句 xfki.m = m + i;/第三个小方块的横坐标的值加1,并赋值给m xfki.n = n ;/第三个小方块的竖坐标的值赋值给n xfk3.m = m + 1;/第三个小方块的横坐标的值加1,并赋值给m xfk3.n = n - 1;/第三个小方块的竖坐标的值减1,并赋值给n else state=3; turn(); break; default: break; state = (state+1

温馨提示

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

最新文档

评论

0/150

提交评论