您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页俄罗斯方块游戏的设计_java课设_含可运行程序

俄罗斯方块游戏的设计_java课设_含可运行程序

来源:华佗小知识
课程设计说明书 NO.1

俄罗斯方块游戏的设计 1. 课程设计的目的 在工作压力及其巨大的今天,游戏成了众多上班一族和学生朋友学习放松的工具,所以设计了一个俄罗斯方块的游戏程序,游戏功能齐全,随进随出,根据自己的能力设置游戏的难度系数。通过此次课程设计,巩固了所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、Eclipse等开发工具的运用,拓宽常用类库的应用。通过该教学环节与手段,把所学课程及相关知识加以融会贯通,理论与实际的结合,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。 2.设计方案论证 2.1设计思路 本课程设计的目标是做一个俄罗斯方块的游戏软件,实现界面初始化,游戏背景颜色和不同方块类型的初始化,程序正常运行,对游戏难度不同程度的设置,游戏的从新开始,正常退出和相应的数据计算功能。类似下落、转向、平移、得分累加和计数等。在设计过程中,充分的利用平时课堂所学知识。在游戏里,设置了7种不同形状的方块分别为条形、T型、田型、正反Z型、正反L型。各种类的实现,分数面板类,用来显示分数和关数。添加三个标签,并设置字体格式,定义控制面板类,新建并添加控制按钮。定义预览面板类,显示下一个。在预览框内实现随机产生不同颜色和种类的小方块。联合类,新建三个面板对象,将以上产生的三个面板添加到总的控制面板上。俄罗斯游戏方块面板类,它起的就是显示屏的作用,各种方块的运行状况,都由其控制。主框架类,将显示类面板和控制类面板按边界布局添加到主类当中。从而实现游戏界面整体的融合和功能的实现。 2.2设计方法 俄罗斯方块的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDLET后,就立即生成一个重绘线程,该线程每隔100MS绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的下坠物(下坠物一共有7种,由4种小砖块组成,每种下坠物颜色固定为灰白色,可以上下左右旋沈 阳 大 学 课程设计说明书 NO.2

转)就不需要重绘。游戏画布是一个COMMANDLISTENER,可以接受用户键盘命令,控制下坠物的左移,右移,下移,旋转动作。整个游戏的流程控制体现在游戏画布对象的PAINT()方法里。PAINT()根据当前的游戏状态,绘制出当时的游戏画面。对于游戏处于运行状态的画面的绘制,则需要在下坠物的当前位置,绘制下坠物。在绘制下坠物之前,判断下坠物是否还能下坠,如果能下坠的话,就让它下落一格,再进行绘制,如果下坠物已无法下坠,则判断游戏是否处于游戏结束状态,如果是处于游戏结束状态的话,则设置游戏状态为游戏结束状态。如果游戏不是处于游戏结束状态,则把下坠物固定下来,同时检查游戏画布上下坠物当前行下面的所有行,看是否需要进行行删除动作,如果需要行删除,则清除游戏地图上被删行的数据,再把被删行绘制成背景色。然后初始化一个新的下坠物,绘制这个新的下坠物。 根据需求分析要实现的系统功能,可以得出系统的模块图: 俄罗斯方块游戏 游戏操作处理 画布游戏界面 多程理法块 线处方模控制按钮监听事件 键盘事件command 主框架类构建画布 面板类处理初始化问 题 7种游戏方块类 图1 系统模块图 沈 阳 大 学 课程设计说明书 NO.3

主程序的流程图为 开始 调节难度 绘制方块下落 Yes 是否能旋转 No 正常下落 旋转方块 判定是否满格 Yes 消除满格的行 No 固定方块 游戏随机绘制方块 No 时钟等待时间超100 Yes 绘制游戏结束界面 游戏结束 图2 主程序流程图 沈 阳 大 学 课程设计说明书 NO.4

得分模块的流程图为 开始 设计游戏难度 自动生成任意方块 方块落底,变成蓝色 No 判断是否格满 Yes Showscore加分 显示面板上显示分数 调用退出程序 结束 图3 得分模块流程图 2.3 设计中的成员变量和方法 表1 主框架中的成员变量 成员变量描述 是否可以控制标志变量 游戏是否结束变量 变量类型 boolean boolean 名称 control GameOver 沈 阳 大 学 课程设计说明书 NO.5

是否允许改变变量 时间计时变量 得分变量 boolean Timer int turn timer ShowScore 表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联合类 新建三个面板对象,将以上产生的三个面板添加到总的控制面板上。可构造函数,格式沈 阳 大 学 课程设计说明书 NO.6

为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)// { 沈 阳 大 学 课程设计说明书 NO.7

} 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 进入游戏界面图 选择确定后进入游戏界面,设置了此容器为边界布局,控制面板上设置六个控制按钮。将显示面板放在,控制面板放在右侧。\"开始游戏\"、\"退出游戏\"、\"提高速度\"、沈 阳 大 学 课程设计说明书 NO.8

\"降低速度\"、\"提高关数\"、\"降低关数\"。,分数模块设置字体格式按网格布局添加四个标签,设置标签格式Show(),加边框。四个标签分别\"当前得分\"、\"当前速度\"、\"当前闯关\"、\"勇往直前\"。 图5 游戏界面图 游戏开始前可以选择游戏的速度和关数从而设置游戏的难度,游戏开始的默认难度速度为1级,关数也为1级所得学分为0,设置的关数越高,难度就越大。游戏开始后,就不可以改变难度,只能选择暂停和退出程序。 沈 阳 大 学 课程设计说明书 NO.9

图6 提高级别后运行界面图 玩家开始玩游戏后,如果在方块没有到达顶端的前提下可以消除一行,当前得分自动增加100分,当方块到达顶端时而无法消除,生成的方块不能再下了,则游戏结束,出现游戏结束的界面模块,出现你也太差劲了几个字样。 沈 阳 大 学 课程设计说明书 NO.10

图7 游戏结束界面图 游戏结束后显示本次游戏的得分数,点击确定后就可以继续选择进行游戏。 沈 阳 大 学 课程设计说明书 NO.11

图8 本次游戏得分界面图 当游戏结束或者中途想重新玩游戏的时候,就可一选择新游戏选项或者点击ctrl+n进行新游戏。点击退出或者快捷键ctrl+x就退出游戏界面。 图9 进入新游戏界面图 一轮游戏是一个大循环,在这个循环中,每隔100毫秒,检查游戏中的当前块是否已经到底了,如果没有, 就继续等待。如果到底了,就看有没有全填满的行,如果有就删除它,并为游戏者加分,同时随机产生一新的当前块,让它自动下落。当新产生一个块时,先检查画布最顶上的一行是否已经被占了,如果是,可以判断Game Over了。 虽然成功的完成游戏设计,但也发现了自己很多的不足,很多预想功能还不能在游戏运行中实现,无声音效果,略显调,界单面不够漂亮,还有很多小瑕疵有待完善。 4.设计总结 通过此次课程设计,将我所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很多问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。从实践上认识了Java是如何编写命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意构造,将不必要的命令去除。深入的了解了JAVA语言的严谨性,了解了JAVA语言沈 阳 大 学 课程设计说明书 NO.12

中众多方法,类的使用,为以后学习打下良好的基础。JAVA是一种面向对象的程序语言。熟悉数据库的基本知识及一种以上数据库系统开发软件。最后衷心感谢在课程设计过程中给予过我帮助的老师和同学们,没有他们的帮助课程设计就不能完成。 5.参考文献 [1]陈国君,陈磊,刘洋.Java2程序设计基础[M].北京:清华大学出版社;2008.6 [2]耿祥义,张跃平.Java课程设计[M].北京:清华大学出版社;2008.11 [3]张思民,梁维娜.Java程序设计实践教程[M].北京:清华大学出版社;2006.8 [4]叶核亚.JAVA2程序设计实用教程[M](第2版).北京:电子工业出版社;2008.4 沈 阳 大 学 课程设计说明书 NO.13

6. 附录: 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 XFK[4];//每个俄罗斯方块由4个小方块构成 int state;//定义长条的状态 int [][] map; public void setMap(int [][] map){//定义背景的二维数组, this.map = map; } FK (){//默认的构造函数 for (int i = 0; i<4; i++){//一个for循环,循环4次 xfk[i] = 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;i<4; i++){//循环语句 沈 阳 大 学 课程设计说明书 NO.14

xfk[i].m--;//每一个小方块的横坐标减一,向左移一步 } break; case KeyEvent.VK_RIGHT://向右移动 for (int i = 0; i < 4; i++) {//循环语句 xfk[i].m++;//每一个小方块的横坐标加一,向右移一步 } break; case KeyEvent.VK_DOWN://向下移动 for (int i = 0;i<4; i++){//循环语句 xfk[i].n++;//每一个小方块的纵坐标加一,向下移一步 } break; default: break; } } public boolean canMove(int fx){//定义canMove方法,用于判断能否移动 switch(fx){ case KeyEvent.VK_LEFT: for (int i = 0;i<4; i++){//循环语句 int m = xfk[i].m - 1;//将xfk[i]的横坐标值减一,向左移动一步所得到的坐标赋值给m int n = xfk[i].n ;//保持纵坐标值不变 if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==1){//移动时是否任何一个小方块到了边界 return false; } } return true; case KeyEvent.VK_RIGHT: for (int i = 0;i<4; i++){ int m = xfk[i].m + 1; int n = xfk[i].n ; if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==1){ return false; } } return true; case KeyEvent.VK_DOWN: for (int i = 0;i<4; i++){ 沈 阳 大 学 课程设计说明书 NO.15

int m = xfk[i].m; int n = xfk[i].n + 1 ; if (m<0 || m>=12 || n<0 || n>=18 ||map[m][n] ==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; i<4; i++){ xfk[i].m = 4+i; //初始化组成条形图形各小方块横向坐标 xfk[i].n = 0; //初始化组成条形图形各小方块纵向坐标 } } else { //条形方块竖向状态 for (int i = 0; i<4; i++){ xfk[i].m = 5; //初始化组成条形图形各小方块横向坐标 xfk[i].n = i; //初始化组成条形图形各小方块纵向坐标 } } } public void turn(){ //定义Fk1类的turn方法 if (state == 1) { //state为竖直型的情况 if(xfk[0].m>0&&xfk[0].m<10){//各小方块横向坐标必须在可变范围 int m = xfk[0].m - 1; int n = xfk[0].n + 1; for (int i = 0; i<4; i++){ xfk[i].m = m + i; xfk[i].n = n; } state=0; //重置条形状态 } 沈 阳 大 学 课程设计说明书 NO.16

}else { if(xfk[0].n<16){ //横向个小方块从向坐标不能超过16 int m = xfk[0].m + 1; int n = xfk[0].n - 1; for (int i = 0; i<4; i++){ xfk[i].m = m; xfk[i].n = n+i; } state = 1; //重置条形状态 } } } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 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;i<2;i++){ xfk[i].m=5;//初始化组成条形图形各小方块横向坐标 xfk[i].n=i;//初始化组成条形图形各小方块纵向坐标 } for(int i=2;i<4;i++){//一个for循环,循环4次 xfk[i].m=4;//初始化组成条形图形各小方块横向坐标 xfk[i].n=i-1;//初始化组成条形图形各小方块纵向坐标 } 沈 阳 大 学 课程设计说明书 NO.17

break; case 1://随机产生数1时,产生的为横着的的Z方块 for(int i=0;i<2;i++){//一个for循环,循环2次 xfk[i].m=6-i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=1;//初始化组成条形图形各小方块纵向坐标 } for(int i=2;i<4;i++){//一个for循环,循环2次 xfk[i].m=7-i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=0;//初始化组成条形图形各小方块纵向坐标 } break; default: break; } } public void turn(){//定义turn方法,用于改变状态 int m,n; switch(state){ case 0: m=xfk[0].m+1;//第一个小方块的横坐标的值加1,并赋值给m n=xfk[0].n+1;//第一个小方块的竖坐标的值加1,并赋值给n for(int i=0;i<2;i++){//循环语句 xfk[i].m=m-i;//将每一个小方块从m-1到m列排列 xfk[i].n=n;//将每一个小方块都在第n行排列 } for(int i=2;i<4;i++){//循环语句 xfk[i].m=m+1-i; xfk[i].n=n-1; } break; case 1: m=xfk[0].m-1; n=xfk[0].n-1; for(int i=0;i<2;i++){ xfk[i].m=m;//将每一个小方块都在第m列排列 xfk[i].n=n+i;//将每一个小方块从n到n+1行排列 } for(int i=2;i<4;i++){ xfk[i].m=m-1; xfk[i].n=n+i-1; } break; default: 沈 阳 大 学 课程设计说明书 NO.18

break; } state=(state+1)%2;//改变状态 } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 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循环 xfk[i].m = 4+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n = 1; } xfk[3].m = 5; xfk[3].n = 0; break; case 1://随机产生数1时,产生的为\"!-\"型方块 for (int i = 0; i < 3; i++) { xfk[i].m = 5;//初始化组成条形图形各小方块横向坐标 xfk[i].n = i; } xfk[3].m = 6;//初始化组成条形图形各小方块横向坐标 xfk[3].n = 1; break; case 2://随机产生数2时,产生的为T型方块 for (int i = 0; i < 3; i++) { 沈 阳 大 学 课程设计说明书 NO.19

xfk[i].m = 4+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n = 0; } xfk[3].m = 5; xfk[3].n = 1; break; case 3://随机产生数1时,产生的为\"-!\"型方块 for (int i = 0; i < 3; i++) { xfk[i].m = 5;//初始化组成条形图形各小方块横向坐标 xfk[i].n = i; } xfk[3].m = 4; xfk[3].n = 1; break; default: break; } } public void turn(){//定义turn方法,用于改变状态 int m,n; switch(state){ case 0: m = xfk[0].m + 1;//第一个小方块的横坐标的值加1,并赋值给m n = xfk[0].n -1;//第一个小方块的竖坐标的值减1,并赋值给n for (int i = 0; i<3; i++){//循环语句 xfk[i].m = m;//将每一个小方块都在第m列排列 xfk[i].n = n+i;//将每一个小方块从n到n+2行排列 } xfk[3].m = m+1;//第三个小方块的横坐标的值加1,并赋值给m xfk[3].n = n+1;//第三个小方块的竖坐标的值减1,并赋值给n break; case 1: if(xfk[0].m>0){ m = xfk[0].m - 1;//第一个小方块的横坐标的值减1,并赋值给m n = xfk[0].n + 1;//第一个小方块的竖坐标的值加1,并赋值给n for (int i = 0; i<3; i++){//循环语句 xfk[i].m = m+i;////将每一个小方块从第m列道m+2排列 xfk[i].n = n;//将每一个小方块都在第m行排列 } xfk[3].m = m+1;//第三个小方块的横坐标的值加1,并赋值给m xfk[3].n = n+1;//第三个小方块的竖坐标的值减1,并赋值给n } 沈 阳 大 学 课程设计说明书 NO.20

else{ state=1; turn(); } break; case 2: m = xfk[0].m + 1;//第一个小方块的横坐标的值加1,并赋值给m n = xfk[0].n - 1;//第一个小方块的竖坐标的值减1,并赋值给n for (int i = 0; i < 3; i++) {//循环语句 xfk[i].m = m;//将每一个小方块都在第m列排列 xfk[i].n = n + i;//将每一个小方块从n到n+2行排列 } xfk[3].m = m - 1;//第三个小方块的横坐标的值减1,并赋值给m xfk[3].n = n + 1;//第三个小方块的竖坐标的值减1,并赋值给n break; case 3: if(xfk[0].m<11){ m = xfk[0].m - 1;//第一个小方块的横坐标的值减1,并赋值给m n = xfk[0].n + 1;//第一个小方块的竖坐标的值加1,并赋值给n for (int i = 0; i < 3; i++) {//循环语句 xfk[i].m = m + i;//第三个小方块的横坐标的值加1,并赋值给m xfk[i].n = n ;//第三个小方块的竖坐标的值赋值给n } xfk[3].m = m + 1;//第三个小方块的横坐标的值加1,并赋值给m xfk[3].n = n - 1;//第三个小方块的竖坐标的值减1,并赋值给n } else{ state=3; turn(); } break; default: break; } state = (state+1)%4; } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if (n<0 || map [m][n] == 1 )//if条件旋转后方块坐标超过map或是与有方块的地方冲突 沈 阳 大 学 课程设计说明书 NO.21

{ return true; //如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 } } return false; } } class FK4 extends FK {//L型类(因为四个方块样子很难描述,下略) public void reset(){//重置方法 state = (int)(Math.random()*4);//随机产生数0,1,2,3初始化大方快状态 switch(state){ case 0://随机产生数0时,产生的为正L型方块 for(int i=0;i<3;i++){//循环语句 xfk[i].m=4; xfk[i].n=i; } xfk[3].m=5; xfk[3].n=2; break; case 1://随机产生数1时, for(int i=0;i<3;i++){//循环语句 xfk[i].m=6-i; xfk[i].n=0; } xfk[3].m=4; xfk[3].n=1; break; case 2://随机产生数0时,产生的为正L型方块 for(int i=0;i<3;i++){//循环语句 xfk[i].m=5; xfk[i].n=2-i; } xfk[3].m=4; xfk[3].n=0; break; case 3: for(int i=0;i<3;i++){//循环语句 xfk[i].m=4+i; xfk[i].n=1; } 沈 阳 大 学 课程设计说明书 NO.22

xfk[3].m=6; xfk[3].n=0; break; default: break; } } public void turn(){//旋转方法 int m,n; switch(state){ case 0: if(xfk[1].m>0){ m=xfk[0].m+1;//第一个小方块的横坐标的值加1,并赋值给m n=xfk[0].n+1;//第一个小方块的纵坐标的值加1,并赋值给n for(int i=0;i<3;i++){//循环语句 xfk[i].m=m-i; xfk[i].n=n; } xfk[3].m=m-2; xfk[3].n=n+1; } else{ turn(); state=0; } break; case 1: m=xfk[0].m-1; n=xfk[0].n+1; for(int i=0;i<3;i++){ xfk[i].m=m; xfk[i].n=n-i; } xfk[3].m=m-1; xfk[3].n=n-2; break; case 2: if(xfk[0].m<11){ m=xfk[0].m-1; n=xfk[0].n-1; for(int i=0;i<3;i++){ xfk[i].m=m+i; 沈 阳 大 学 课程设计说明书 NO.23

xfk[i].n=n; } xfk[3].m=m+2; xfk[3].n=n-1; } else{ turn(); state=2; } break; case 3: m=xfk[0].m+1; n=xfk[0].n-1; for(int i=0;i<3;i++){ xfk[i].m=m; xfk[i].n=n+i; } xfk[3].m=m+1; xfk[3].n=n+2; break; default: break; } state = (state+1)%4; } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if (n<0 || map [m][n] == 1 )//if条件旋转后方块坐标超过map或是与有方块的地方冲突 { turn(); return true; //如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 } } return false; //如果旋转后坐标在map内且没有和有方块的地方冲突,则返回false不再旋转,相当于能旋转 } } 沈 阳 大 学 课程设计说明书 NO.24

class FK5 extends FK {//L2 同上 public void reset(){ state = (int)(Math.random()*4); switch(state){//不同的4个状态 case 0: for(int i=0;i<3;i++){ xfk[i].m=5;//初始化组成条形图形各小方块横向坐标 xfk[i].n=i;//初始化组成条形图形各小方块纵向坐标 } xfk[3].m=4; xfk[3].n=2; break; case 1: for(int i=0;i<3;i++){ xfk[i].m=6-i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=1;//初始化组成条形图形各小方块纵向坐标 } xfk[3].m=4; xfk[3].n=0; break; case 2: for(int i=0;i<3;i++){ xfk[i].m=5;//初始化组成条形图形各小方块横向坐标 xfk[i].n=2-i;//初始化组成条形图形各小方块纵向坐标 } xfk[3].m=6; xfk[3].n=0; break; case 3: for(int i=0;i<3;i++){ xfk[i].m=4+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=0;//初始化组成条形图形各小方块纵向坐标 } xfk[3].m=6; xfk[3].n=1; break; default: break; } } public void turn(){//旋转方法 沈 阳 大 学 课程设计说明书 NO.25

int m,n; switch(state){ case 0: if(xfk[0].m<11){ m=xfk[0].m+1; n=xfk[0].n+1; for(int i=0;i<3;i++){ xfk[i].m=m-i; xfk[i].n=n; } xfk[3].m=m-2; xfk[3].n=n-1; } else{ turn(); state=0; } break; case 1: m=xfk[0].m-1; n=xfk[0].n+1; for(int i=0;i<3;i++){ xfk[i].m=m; xfk[i].n=n-i; } xfk[3].m=m+1; xfk[3].n=n-2; break; case 2: if(xfk[0].m>0){ m=xfk[0].m-1; n=xfk[0].n-1; for(int i=0;i<3;i++){ xfk[i].m=m+i; xfk[i].n=n; } xfk[3].m=m+2; xfk[3].n=n+1; } else{ turn(); state=2; } 沈 阳 大 学 课程设计说明书 NO.26

break; case 3: m=xfk[0].m+1; n=xfk[0].n-1; for(int i=0;i<3;i++){ xfk[i].m=m; xfk[i].n=n+i; } xfk[3].m=m-1; xfk[3].n=n+2; break; default: break; } state = (state+1)%4; } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if ( n<0 || map [m][n] == 1 )//if条件旋转后方块坐标超过map或是与有方块的地方冲突 { turn(); return true; //如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 } } return false; //如果旋转后坐标在map内且没有和有方块的地方冲突,则返回false不再旋转,相当于能旋转 } } class FK6 extends FK{ //定义田型方块为方块6 public void reset(){ for(int i=0;i<2;i++){ xfk[i].m=5+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=0;//初始化组成条形图形各小方块纵向坐标 } for(int i=2;i<4;i++){ xfk[i].m=3+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=1;//初始化组成条形图形各小方块纵向坐标 沈 阳 大 学 课程设计说明书 NO.27

} } public void turn(){//田型方块不能旋转 } public boolean canTurn() { //判断方块是否能转型 return true; } } class FK7 extends FK {//Z2 public void reset(){ state = (int)(Math.random()*2); switch(state){ case 0: for(int i=0;i<2;i++){//循环语句 xfk[i].m=5;//初始化组成条形图形各小方块横向坐标 xfk[i].n=i;//初始化组成条形图形各小方块纵向坐标 } for(int i=2;i<4;i++){//循环语句 xfk[i].m=6;//初始化组成条形图形各小方块横向坐标 xfk[i].n=i-1;//初始化组成条形图形各小方块纵向坐标 } break; case 1: for(int i=0;i<2;i++){//循环语句 xfk[i].m=4+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=1;//初始化组成条形图形各小方块纵向坐标 } for(int i=2;i<4;i++){//循环语句 xfk[i].m=3+i;//初始化组成条形图形各小方块横向坐标 xfk[i].n=0;//初始化组成条形图形各小方块纵向坐标 } break; default: break; } } public void turn(){//旋转方法 int m,n; switch(state){ case 0: m=xfk[0].m-1; 沈 阳 大 学 课程设计说明书 NO.28

n=xfk[0].n+1; for(int i=0;i<2;i++){ xfk[i].m=m+i; xfk[i].n=n; } for(int i=2;i<4;i++){ xfk[i].m=m+i-1; xfk[i].n=n-1; } break; case 1: m=xfk[0].m+1; n=xfk[0].n-1; for(int i=0;i<2;i++){ xfk[i].m=m; xfk[i].n=n+i; } for(int i=2;i<4;i++){ xfk[i].m=m+1; xfk[i].n=n+i-1; } break; default: break; } state=(state+1)%2; } public boolean canTurn() {//判断方块是否可以转 turn(); //调用方块旋转方法使方块转动 for(int i=0;i<4;i++)//循环方块的每一小块 {int m=xfk[i].m; //将旋转后的每一小块的横坐标赋给m int n=xfk[i].n; //将旋转后的每一小块的纵坐标赋给n if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 1 )//if条件旋转后方块坐标超过map或是与有方块的地方冲突 { return true; //如果滿足if条件则返回true再旋转一次,相当于没有转,不能旋转 } } return false; //如果旋转后坐标在map内且没有和有方块的地方冲突,则返回false不再旋转,相当于能旋转 } 沈 阳 大 学 课程设计说明书 NO.29

} //定义分数面板类,用来显示分数和关数。添加三个标签,并设置字体格式 class Show extends JPanel { LineBorder c=new LineBorder(Color.yellow,3,true); Font b=new Font(\"Braggadcoio\ Label s1=new Label(\"当前得分:0\"); Label s2=new Label(\"当前速度:1\"); Label s4=new Label(\"当前闯关:1\"); Label s3=new Label(\"勇往直前 \"); Show() //按网格布局添加三个标签,设置标签格式,加边框 { setLayout(new GridLayout(4,1)); this.setBorder(c); s1.setFont(b); s3.setFont(b); s2.setFont(b); s4.setFont(b); add(s2); add(s1); add(s4); add(s3); } } //定义控制面板类,新建并添加控制按钮。 class ControlPanel extends JPanel { LineBorder c=new LineBorder(Color.black,3,true); Button b1=new Button(\"开始游戏\"); //定义按钮,设置按钮名称 Button b2=new Button(\"退出游戏\"); Button b4=new Button(\"提高速度\"); Button b5=new Button(\"降低速度\"); Button b7=new Button(\"提高级数\"); Button b8=new Button(\"降低级数\"); ControlPanel()//按网格布局添加控制按钮,添加边框。 { setLayout(new GridLayout(6,1,0,5));//定义布局GridLayout,使按钮竖向排列 add(b1); this.setBorder(c); 沈 阳 大 学 课程设计说明书 NO.30

add(b4); add(b5); add(b2); add(b7); add(b8); } } //定义预览面板类,显示下一个。在预览框内实现随机产生不同颜色和种类的小方块。 class ShowNext extends Panel { int s; public void paint(Graphics g){//绘制小方块,随机设置随机产生的七种小方块的颜色。 g.setColor(Color.LIGHT_GRAY);//绘制预览框的背景网格,按三维形式填充网格,设颜色为灰色 for (int i = 0; i<=5; i++) for (int j = 0; j<=4; j++){ g.fill3DRect(i*25,j*25,25,25,true); } Color col[]={Color.gray,Color.gray,Color.gray,Color.gray,Color.gray,Color.gray,Color.gray}; //定义col,用以给不同方块取不同色 g.setColor(col[s]);//以S传值获取颜色 switch(s)//在显示下一个面板中画方块形状 { case 0: for (int i = 0; i<4; i++){ int m = i; int n = 1; g.fillRoundRect(m*25,n*25,25,25,6,6);//填充方法 g.draw3DRect(m*25,n*25,25,25,true); //描边方法 } break; case 1: for(int i=0;i<2;i++) { int m=2; int n=i+1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); 沈 阳 大 学 课程设计说明书 NO.31

} for(int i=2;i<4;i++) { int m=1; int n=i; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } break; case 2: for (int i = 0; i < 3; i++) { int m = 1+i; int n = 2; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } int m = 2; int n = 1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); break; case 3: for(int i=0;i<3;i++){ m=1; n=i+1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } m=2; n=3; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); break; case 4: for(int i=0;i<3;i++){ m=2; n=i+1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } m=1; n=3; g.fillRoundRect(m*25,n*25,25,25,6,6); 沈 阳 大 学 课程设计说明书 NO.32

g.draw3DRect(m*25,n*25,25,25,true); break; case 5: for(int i=0;i<2;i++){ m=1+i; n=1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } for(int i=2;i<4;i++){ m=i-1; n=2; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } break; case 6: for(int i=0;i<2;i++){ m=1; n=i+1; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } for(int i=2;i<4;i++){ m=2; n=i; g.fillRoundRect(m*25,n*25,25,25,6,6); g.draw3DRect(m*25,n*25,25,25,true); } break; } } } //联合类,新建三个面板对象,将以上产生的三个面板添加到总的控制面板上 class Unit extends JPanel { ControlPanel control=new ControlPanel(); Show show=new Show(); ShowNext shownext=new ShowNext(); Unit()//构造函数,按网格布局添加三个面板对象到总的控制面板上 {setLayout(new GridLayout(3,1)); add (shownext); 沈 阳 大 学 课程设计说明书 NO.33

add (show); add (control); } } //俄罗斯游戏方块面板类, class RussiaPanel extends JPanel implements Runnable,KeyListener,ActionListener{ Unit uu = new Unit(); int ShowScore; //定义分数,存取得分多少 int lever=1; //定义级数,初始设为1级 int poor=1; FK dqfk ; FK [] fk = new FK[7] ; static int rr = (int)(Math.random()*7); //定义rr,值取随机,显示下一个方块的重要参数 static int r = (int)(Math.random()*7); //显示当前方块的参数 static int tt = 500; //用以存取时间参数 int time=tt; //定义时间 static int co; //决定当前运动方块形状 int [][] map = new int[12][35]; public void clean()//对当前屏幕清空 { for (int i = 0; i<12; i++){//去除当前所有方块 for (int j = 0; j<18; j++){ map [i][j] = 0; } } repaint(); //重新画游戏面板,实现清屏 ShowScore=0; //得分参数归零 uu.show.s1.setText(\"得分 :0\");//得分设为零 lever=1; //级别设为一级 time=tt=500; //时间为500秒 t.suspend(); uu.show.repaint(); //显示游戏刷新 } public void reset(){ //重设小方块,随机产生小方块 int r = rr; dqfk = fk[r]; rr = (int)(Math.random()*7); //重取随机数,用以确定下一个方块 co = r; //获取局部变量 uu.shownext.s=rr; //穿参数值用以显示下一个 沈 阳 大 学 课程设计说明书 NO.34

uu.shownext.repaint(); dqfk.reset(); } public void uplevel()//减少方块下落时间来提高难度 { if(tt>100) tt-=100; time = tt; } public void downlevel()//增加方块下落时间来降低难度 { if(tt<500) tt+=100; time = tt; } RussiaPanel (Unit z){//对控制按钮添加,新建七种方块并绘制背景图 uu=z; addKeyListener(this); uu.control.b1.addActionListener(this); uu.control.b4.addActionListener(this); uu.control.b5.addActionListener(this); uu.control.b2.addActionListener(this); uu.control.b7.addActionListener(this); uu.control.b8.addActionListener(this); fk[0] = new FK1(); fk[1] = new FK2(); fk[2] = new FK3(); fk[3] = new FK4(); fk[4] = new FK5(); fk[5] = new FK6(); fk[6] = new FK7(); this.reset(); for (int i = 0; i<7; i++) { fk[i].setMap(map); } } public void paint(Graphics g) {//在显示窗口绘制小方块,产生不同颜色的小方块 super.paint(g); g.setColor(Color.darkGray);//将显示窗口用灰色小方块填充 for (int i = 0; i<12; i++){ 沈 阳 大 学 课程设计说明书 NO.35

for (int j= 0; j<18; j++){ if (map [i][j]==0){ g.fill3DRect(i*25,j*25,25,25,true); } } } Color col[]={Color.gray,Color.gray,Color.gray,Color.gray,Color.gray,Color.gray,Color.gray}; g.setColor(Color.cyan);//设置落下停止的小方块颜色为cyan for (int i = 0; i<12; i++){//若存在小方块,则三维填充 for (int j= 0; j<18; j++){ if (map [i][j]==1){ g.fillRoundRect(i*25,j*25,25,25,4,4); g.getColor(); } } } g.setColor(Color.yellow);//设置方块边框的颜色为黄色 for (int i = 0; i<12; i++){ for (int j= 0; j<18; j++){ if (map [i][j]==1){ g.drawRoundRect(i*25,j*25,25,25,4,4); g.getColor(); } } } g.setColor(col[co]);//给小方块填充不同的颜色 for (int i = 0; i<4; i++){ int m = dqfk.xfk[i].m; int n = dqfk.xfk[i].n; g.fillRoundRect(m*25,n*25,25,25,4,4); g.drawRoundRect(m*25,n*25,25,25,4,4); g.getColor(); } g.setColor(Color.yellow);//设置所产生的小方块的边框为黄色 for (int i = 0; i<4; i++){ int m = dqfk.xfk[i].m; int n = dqfk.xfk[i].n; g.drawRoundRect(m*25,n*25,25,25,5,5); g.getColor(); } g.setColor(Color.gray); g.setColor(col[rr]); 沈 阳 大 学 课程设计说明书 NO.36

} void refresh(){//判断如果满行则消去此行 for (int i = 0; i<18;i++){ if (isFullLine(i)){ refresh(i); } } } boolean isFullLine(int m){//消行的具体方法,清空此行 for (int i = 0; i<12; i++){ if (map[i][m] == 0){ return false; } } return true; } void refresh(int m){ShowScore+=100;//若满一行则加一百分,并将小方块下移一行 for (int i = m; i>0; i--){ for (int j = 0; j<12; j++){ map [j][i] = map [j][i-1]; } } uu.show.s1.setText(\"当前得分 :\"+ShowScore);//显示得分 uu.show.s2.setText(\"当前级数 :\"+lever);//显示难度 uu.show.s4.setText(\"当前闯关 :\"+poor);//显示难度 } boolean GameOver(){ //如果顶行被占,则游戏结束 for (int i= 0 ; i<12; i ++){ if(map[i][0] ==1) return true; } return false; } public void run() {//方块下移 while (true){ if (dqfk.canMove(KeyEvent.VK_DOWN))//判断是否能下移 dqfk.move(KeyEvent.VK_DOWN);//满足条件则下移 else { for (int i = 0; i<4; i++){//否则停止并绘制小方块 沈 阳 大 学 课程设计说明书 NO.37

int m = dqfk.xfk[i].m; int n = dqfk.xfk[i].n; map[m][n] = 1; } refresh(); if(!GameOver())//若游戏没结束 reset();//再产生小方块 else//若结束,则可以增加关数,显示对话框,游戏结束,清空屏幕 {this.transferFocusBackward(); uu.control.b4.setEnabled(true); uu.control.b5.setEnabled(true); JOptionPane.showMessageDialog(this, \" 你也太差劲了!\"); JOptionPane.showMessageDialog(this, \"本次游戏的分为\"+ShowScore); uu.control.b1.setLabel(\"重玩一次\"); t.suspend(); clean(); } } this.repaint(); try {//线程休眠,抛出异常 Thread.sleep(time); } catch (InterruptedException ex) { } } } public void keyPressed(KeyEvent e) {//实现键盘, int key = e.getKeyCode();//得到当前键值 switch(key){ case KeyEvent.VK_UP://实现转的方法 if(dqfk.canTurn()) dqfk.turn(); this.repaint(); break; case KeyEvent.VK_LEFT://向左移 if (dqfk.canMove(KeyEvent.VK_LEFT)) { dqfk.move(KeyEvent.VK_LEFT); this.repaint(); } 沈 阳 大 学 课程设计说明书 NO.38

break; case KeyEvent.VK_RIGHT://向右移 if (dqfk.canMove(KeyEvent.VK_RIGHT)) { dqfk.move(KeyEvent.VK_RIGHT); this.repaint(); } break; case KeyEvent.VK_DOWN://下移 time = 60; break; default: break; } repaint(); } public void keyReleased(KeyEvent e) {//释放键位时方块下降 int key = e.getKeyCode(); if (key == KeyEvent.VK_DOWN) time = tt; } public void keyTyped(KeyEvent e) {//键的类型,方法为空 } Thread t = new Thread(this);//新建线程 public void actionPerformed(ActionEvent e)//实现控制按钮的具体方法 { if(e.getActionCommand().equals(\"重玩一次\"))//菜单按键方法实现。点击此键,将不能再点击控制难度按键 { uu.control.b4.setEnabled(false); uu.control.b5.setEnabled(false); uu.control.b1.setLabel(\"点击继续玩\");//将按钮标题替换为暂停 t.resume(); reset(); this.requestFocus(true); } if(e.getActionCommand().equals(\"点击继续玩\")) { uu.control.b1.setLabel(\"暂停\"); t.resume(); this.requestFocus(true); 沈 阳 大 学 课程设计说明书 NO.39

} if(e.getActionCommand().equals(\"开始游戏\")) //控制按钮,游戏开始,点击此键,将不能再点击控制难度按键 { uu.control.b4.setEnabled(false); uu.control.b5.setEnabled(false); t.start(); uu.control.b1.setLabel(\"暂停\");//将按钮标题替换为暂停 this.requestFocus(true); } if(e.getActionCommand().equals(\"继续\")) {//若点击继续,则替换标签为暂停 uu.control.b1.setLabel(\"暂停\"); t.resume(); this.requestFocus(true); } if(e.getActionCommand().equals(\"提高速度\"))//点击此按钮,提高级数 { if(lever<5) lever++; //级数增加1级 uplevel(); //调用升级函数 uu.show.s2.setText(\"当前速度 :\"+lever);//显示当前关数 this.requestFocus(true); } if(e.getActionCommand().equals(\"降低速度\"))//点击此按钮,降低级数 { if(lever>1) lever--; downlevel(); //调用降级函数 uu.show.s2.setText(\"当前速度 :\"+lever);//显示当前关数 this.requestFocus(true); } if(e.getActionCommand().equals(\"提高级数\"))//点击此按钮,提高级数 { if(poor<5) poor++; //级数增加1级 uplevel(); //调用升级函数 uu.show.s4.setText(\"当前闯关 :\"+poor);//显示当前关数 this.requestFocus(true); } if(e.getActionCommand().equals(\"降低级数\"))//点击此按钮,降低级数 { 沈 阳 大 学 课程设计说明书 NO.40

if(poor>1) poor--; downlevel(); //调用降级函数 uu.show.s4.setText(\"当前闯关 :\"+poor);//显示当前关数 this.requestFocus(true); } if(e.getActionCommand().equals(\"暂停\"))//若点击暂停,则替换标签为继续 { uu.control.b1.setLabel(\"继续\"); t.suspend(); this.requestFocus(true); uu.control.b1.requestFocus(); } if(e.getActionCommand().equals(\"退出游戏\"))//退出游戏 { System.exit(0); if(e.getActionCommand().equals(\"重新开始\"))//按新游戏键,清空显示屏幕并重置 { repaint(); //重新画游戏面板,实现清屏 ShowScore=0; //得分参数归零 uu.show.s1.setText(\"得分 :0\");//得分设为零 lever=1; //级别设为一级 time=tt=500; //时间为500秒 t.suspend(); uu.show.repaint(); //显示游戏刷新 } } } } //主框架类,将显示类面板和控制类面板按边界布局添加到RussiaGame02 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);//控制面板放在右侧 沈 阳 大 学 课程设计说明书 NO.41

this.addKeyListener(p);//为显示面板添加 JOptionPane.showMessageDialog(this, \"寒涛工作室欢迎进入俄罗斯方块游戏 !\");//显示欢迎对话框 MenuBar myB=new MenuBar();//新建控制菜单 setMenuBar(myB); Menu m1=new Menu(\"游戏\");//新建标题菜单 MenuItem m11=new MenuItem(\"新游戏\新建菜单选项 m1.add(m11); MenuItem m14=new MenuItem(\"退出\ 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(); } 沈 阳 大 学

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务