java实现俄罗斯方块游戏
本文实例为大家分享了java实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下
1.功能需求
2.软件功能架构图
3.界面设计
4.程序逻辑图
5.实现代码
- 创建控制面板并添加按钮
- 初始化界面
- 添加事件监听
- 创建方块
- 实现对方块操作
- 游戏主类,实现游戏控制
功能需求
1、 在二维平面里面用各种随机产生的方块堆积木,每满一行消去一行,当达到顶部时,游戏结束。
2、 玩家通过方向键来控制方块转动,左移,右移和直落。
3、 每种类型的方块都有颜色。
4、 玩家能够在玩的过程中给出分数,分数是由方块的类型决定的,每堆积一个方块就把分数累加到总分中。
5、 游戏有暂停,开始,结束,游戏规则和游戏说明等控制
软件功能架构图
界面设计
游戏主类继承JFrame类,负责游戏的全局控制。内含:
(1)GameCanvas画布类的实例对象(用来存放小方格)
(2)一个保存当前活动块的(RussiaBlock)实例的对象
(3)一个保存当前控制面板(ControlPanel)实例的对象
程序逻辑图
代码实现
1、创建控制面板并添加按钮
publicclassControlPanelextendsJPanel{ privatestaticfinallongserialVersionUID=3900659640646175724L;//用来表明不同版本之间类的兼容性 //定义文本框 privateJTextFieldtfLevel=newJTextField(""+RussiaBlocksGame.DEFAULT_LEVEL),tfScore=newJTextField("0"), tfTime=newJTextField(""); //定义按钮 privateJButtonbtPlay=newJButton("开始"),btPause=newJButton("暂停"),btStop=newJButton("停止"), btTurnLevelUp=newJButton("增加难度"),btTurnLevelDown=newJButton("降低难度"); //创建面板容器类为边界布局BorderLayout() privateJPanelplTip=newJPanel(newBorderLayout()); privateTipPanelplTipBlock=newTipPanel(); //创建信息面板容器类为网格布局GridLayout(4,1),4行1列 privateJPanelplInfo=newJPanel(newGridLayout(4,1)); //创建按钮面板容器类为网格布局GridLayout(6,1) privateJPanelplButton=newJPanel(newGridLayout(6,1)); //定义时间类 //privateTimertimer; //创建组件边框Boreder,EtchedBorder“浮雕化”边框 privateBorderborder=newEtchedBorder(EtchedBorder.RAISED,Color.white,newColor(148,145,140)); /* *控制面板类的构造函数 */ publicControlPanel(finalRussiaBlocksGamegame){ //TODOAuto-generatedconstructorstub //创建网格布局,GridLayout(3,1,0,2),指定行数和列数的网格布局,并指定水平和竖直网格间隙 setLayout(newGridLayout(3,1,0,2)); //添加组件 plTip.add(newJLabel("下一个方块"),BorderLayout.NORTH); plTip.add(plTipBlock); plTip.setBorder(border); plInfo.add(newJLabel("难度系数")); plInfo.add(tfLevel); plInfo.add(newJLabel("得分")); plInfo.add(tfScore); plInfo.setBorder(border); plButton.add(btPlay); btPlay.setEnabled(true); plButton.add(btPause); btPause.setEnabled(false); plButton.add(btStop); btStop.setEnabled(false); plButton.add(btTurnLevelDown); plButton.add(btTurnLevelUp); plButton.setBorder(border); tfLevel.setEnabled(false); tfScore.setEnabled(false); tfTime.setEnabled(false); add(plTip); add(plInfo); add(plButton); }
2、初始化界面
//初始化菜单栏 privateJMenuBarbar=newJMenuBar(); privateJMenumGame=newJMenu("游戏"),mControl=newJMenu("控制"),mInfo=newJMenu("帮助"); privateJMenuItemmiNewGame=newJMenuItem("新游戏"),miSetBlockColor=newJMenuItem("设置方块颜色..."), miSetBackColor=newJMenuItem("设置背景颜色..."),miTurnHarder=newJMenuItem("升高游戏难度"), miTurnEasier=newJMenuItem("降低游戏难度"),miExit=newJMenuItem("退出"),miPlay=newJMenuItem("开始"), miPause=newJMenuItem("暂停"),miResume=newJMenuItem("恢复"),miStop=newJMenuItem("终止游戏"), miRule=newJMenuItem("游戏规则"),miAuthor=newJMenuItem("关于本游戏"); /** *建立并设置窗口菜单 */ privatevoidcreatMenu(){ bar.add(mGame); bar.add(mControl); bar.add(mInfo); mGame.add(miNewGame); mGame.addSeparator(); mGame.add(miSetBlockColor); mGame.add(miSetBackColor); mGame.addSeparator(); mGame.add(miTurnHarder); mGame.add(miTurnEasier); mGame.addSeparator(); mGame.add(miExit); mControl.add(miPlay); miPlay.setEnabled(true); mControl.add(miPause); miPause.setEnabled(false); mControl.add(miResume); miResume.setEnabled(false); mControl.add(miStop); miStop.setEnabled(false); mInfo.add(miRule); mInfo.add(miAuthor); setJMenuBar(bar); miNewGame.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ stopGame(); reset(); setLevel(DEFAULT_LEVEL); } }); //设置方块颜色 miSetBlockColor.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ ColornewFrontColor=JColorChooser.showDialog(RussiaBlocksGame.this,"设置方块颜色", canvas.getBackgroundColor()); if(newFrontColor!=null){ canvas.setBlockColor(newFrontColor); } } }); //设置背景颜色 miSetBackColor.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ ColornewBackColor=JColorChooser.showDialog(RussiaBlocksGame.this,"设置背景颜色", canvas.getBackgroundColor()); if(newBackColor!=null){ canvas.setBackgroundColor(newBackColor); } } }); //定义菜单栏"关于"的功能,弹出确认框。 miAuthor.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(null,"软件工程(4)班\n3115005372\n杨宇杰\n©一切解释权归杨宇杰所有","关于俄罗斯方块-2016",1); } }); //游戏规则说明 miRule.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ JOptionPane.showMessageDialog(null, "由小方块组成的不同形状的板块陆续从屏幕上方落下来,\n玩家通过调整板块的位置和方向,使它们在屏幕底部拼\n出完整的一条或几条。这些完整的横条会随即消失,给新\n落下来的板块腾出空间,与此同时,玩家得到分数奖励。\n没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,\n玩家便告输,游戏结束。", "游戏规则",1); } }); //增加难度 miTurnHarder.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ intcurLevel=getLevel(); if(!playing&&curLevel1){ setLevel(curLevel-1); } } }); //退出按钮动作响应 miExit.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEvente){ System.exit(0); } }); }
3、添加事件监听
/* *添加事件监听 */ /* *开始游戏 */ btPlay.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEventae){ //TODOAuto-generatedmethodstub game.playGame(); } }); /* *暂停游戏 */ btPause.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEventae){ //TODOAuto-generatedmethodstub if(btPause.getText().equals("暂停")){ game.pauseGame(); }else{ game.resumeGame(); } } }); /* *停止游戏 */ btStop.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEventae){ //TODOAuto-generatedmethodstub game.stopGame(); } }); /* *升高难度 */ btTurnLevelUp.addActionListener(newActionListener(){ @Override publicvoidactionPerformed(ActionEventae){ //TODOAuto-generatedmethodstub try{ intlevel=Integer.parseInt(tfLevel.getText()); if(level1){ tfLevel.setText(""+(level-1)); } }catch(NumberFormatExceptione){ //TODO:handleexception requestFocus(); } } }); /* *主要用于解决Jframe窗口大小变化时,里面的组件的位置也会自适应的移动。 */ addComponentListener(newComponentAdapter(){ publicvoidcomponentResized(ComponentEventce){ plTipBlock.fanning(); } });
4、创建方块
publicclassErsBoximplementsCloneable{ privatebooleanisColor; privateDimensionsize=newDimension();//Dimension类封装单个对象中组件的宽度和高度(精确到整数) /* *方格类构造函数isColor是不是用前景色为此方格着色,true前景色,false背景色 */ publicErsBox(booleanisColor){ //TODOAuto-generatedconstructorstub this.isColor=isColor; } /* *设置方格的颜色true前景色,false背景色 */ publicvoidsetColor(booleanisColor){ //TODOAuto-generatedmethodstub this.isColor=isColor; } /* *得到此方格的尺寸 */ publicDimensiongetSize(){ returnsize; } /** *设置方格的尺寸, * *@paramsizeDimension,方格的尺寸 */ publicvoidsetSize(Dimensionsize){ this.size=size; } /* *覆盖object的objectclone(),实现克隆 */ publicObjectclone(){ Objectcloned=null; try{ cloned=super.clone(); }catch(Exceptionex){ //TODO:handleexception ex.printStackTrace(); } returncloned; } /** *此方格是不是用前景色表现 * *@returnboolean,true用前景色表现,false用背景色表现 */ publicbooleanisColorBox(){ //TODOAuto-generatedmethodstub returnisColor; } }
5、实现对方块操作
publicclassErsBlockextendsThread{ //一个块占得4行 publicstaticfinalintBOXES_ROWS=4; //一个块占4列 publicstaticfinalintBOXES_COLS=4; /* *让升级变化平滑的因子,避免最后几级之间的速度相差近一倍 */ publicfinalstaticintLEVEL_FLATNESS_GENE=3; //相近的两级之间,块每下落一行的时间差别为多少(毫秒) publicfinalstaticintBETWEEN_LEVELS_DEGRESS_TIME=50; //方块的样式数目为7 publicfinalstaticintBLOCK_KIND_NUMBER=7; //每一个样式的方块反转状态种类为4 publicfinalstaticintBLOCK_STASTUS_NUMBER=4; /** *分别对应7中模型的28中状态 */ publicfinalstaticint[][]STYLES={//共28种状态 {0x0f00,0x4444,0x0f00,0x4444},//长条型的四种状态 {0x04e0,0x0464,0x00e4,0x04c4},//T型的四种状态 {0x4620,0x6c00,0x4620,0x6c00},//反Z型的四种状态 {0x2640,0xc600,0x2640,0xc600},//Z型的四种状态 {0x6220,0x1700,0x2230,0x0740},//7型的四种状态 {0x6440,0x0e20,0x44c0,0x8e00},//反7型的四种状态 {0x0660,0x0660,0x0660,0x0660},//方块的四种状态 }; privateGameCanvascanvas; privateErsBox[][]boxes=newErsBox[BOXES_ROWS][BOXES_COLS]; privateintstyle,y,x,level; privatebooleanpausing=false,moving=true; /* *构造一个函数,产生一个特定的块style为块的样式,对应STYLES中的某一个y起始位置,左上角在canvas中的坐标行 *x起始位置,左上角在canvas中的坐标列level游戏等级控制下降速度canvas面板 */ publicErsBlock(intstyle,inty,intx,intlevel,GameCanvascanvas){ this.style=style; this.y=y; this.x=x; this.level=level; this.canvas=canvas; intkey=0x8000; for(inti=0;i>=1; } } display(); } /* *线程类的run()函数覆盖,下落块,直到块不能再下落 */ @Override publicvoidrun(){ while(moving){ try{ sleep(BETWEEN_LEVELS_DEGRESS_TIME*(RussiaBlocksGame.MAX_LEVEL-level+LEVEL_FLATNESS_GENE)); }catch(InterruptedExceptionie){ ie.printStackTrace(); } //后边的moving是表示在等待的100毫秒间,moving没有被改变 if(!pausing){ moving=(moveTo(y+1,x)&&moving); } } } /* *块左移一格 */ publicvoidmoveLeft(){ //TODOAuto-generatedmethodstub moveTo(y,x-1); } /* *块右移一格 */ publicvoidmoveRight(){ //TODOAuto-generatedmethodstub moveTo(y,x+1); } /** *块下移一格 */ publicvoidmoveDown(){ //TODOAuto-generatedmethodstub moveTo(y+1,x); } /* *块变形 */ publicvoidturnNext(){ for(inti=0;i >=1; } } display(); returntrue; } /* *将当前块变成newStyle所指定的块样式newStyle,希望改变的样式,对应STYLES中的某一个true改变成功,false改变失败 */ privatebooleanturnTo(intnewStyle){ //TODOAuto-generatedmethodstub if(!isTurnAble(newStyle)||!moving){ returnfalse; } erase(); intkey=0x8000; for(inti=0;i >=1; } } style=newStyle; display(); canvas.repaint(); returntrue; } }
6、游戏主类,实现游戏控制
publicRussiaBlocksGame(Stringtitle){ super(title);//设置标题 setSize(500,600);//设置窗口大小 setLocationRelativeTo(null);//设置窗口居中 creatMenu(); Containercontainer=getContentPane();//创建菜单栏 container.setLayout(newBorderLayout(6,0));//设置窗口的布局管理器 canvas=newGameCanvas(20,15);//新建游戏画布 ctrlPanel=newControlPanel(this);//新建控制面板 container.add(canvas,BorderLayout.CENTER);//左边加上画布 container.add(ctrlPanel,BorderLayout.EAST);//右边加上控制面板 //注册窗口事件。当点击关闭按钮时,结束游戏,系统退出。 addWindowListener(newWindowAdapter(){ @Override publicvoidwindowClosing(WindowEventwe){ stopGame(); System.exit(0); } }); //根据窗口大小,自动调节方格的尺寸 addComponentListener(newComponentAdapter(){ @Override publicvoidcomponentResized(ComponentEventce){ canvas.adjust(); } }); setVisible(true); canvas.adjust(); } /** *让游戏复位 */ publicvoidreset(){//画布复位,控制面板复位 ctrlPanel.setPlayButtonEnable(true); ctrlPanel.setPauseButtonEnable(false); ctrlPanel.setPauseButtonLabel(true); ctrlPanel.setStopButtonEnable(false); ctrlPanel.setTurnLevelDownButtonEnable(true); ctrlPanel.setTurnLevelUpButtonEnable(true); miPlay.setEnabled(true); miPause.setEnabled(false); miResume.setEnabled(false); miStop.setEnabled(false); ctrlPanel.reset(); canvas.reset(); } /** *判断游戏是否还在进行 * *@returnboolean,true-还在运行,false-已经停止 */ publicbooleanisPlaying(){ returnplaying; } /** *得到当前活动的块 * *@returnErsBlock,当前活动块的引用 */ publicErsBlockgetCurBlock(){ returnblock; } /** *得到当前画布 * *@returnGameCanvas,当前画布的引用 */ publicGameCanvasgetCanvas(){ returncanvas; } /** *开始游戏 */ publicvoidplayGame(){ play(); ctrlPanel.setPlayButtonEnable(false); ctrlPanel.setPauseButtonEnable(true); ctrlPanel.setPauseButtonLabel(true); ctrlPanel.setStopButtonEnable(true); ctrlPanel.setTurnLevelDownButtonEnable(false); ctrlPanel.setTurnLevelUpButtonEnable(false); miStop.setEnabled(true); miTurnHarder.setEnabled(false); miTurnEasier.setEnabled(false); ctrlPanel.requestFocus();//设置焦点 } /** *游戏暂停 */ publicvoidpauseGame(){ if(block!=null){ block.pauseMove(); } ctrlPanel.setPlayButtonEnable(false); ctrlPanel.setPauseButtonLabel(false); ctrlPanel.setStopButtonEnable(true); miPlay.setEnabled(false); miPause.setEnabled(false); miResume.setEnabled(true); miStop.setEnabled(true); } /** *让暂停中的游戏继续 */ publicvoidresumeGame(){ if(block!=null){ block.resumeMove(); } ctrlPanel.setPlayButtonEnable(false); ctrlPanel.setPauseButtonEnable(true); ctrlPanel.setPauseButtonLabel(true); miPause.setEnabled(true); miResume.setEnabled(false); ctrlPanel.requestFocus(); } /** *用户停止游戏 */ publicvoidstopGame(){ playing=false; if(block!=null){ block.stopMove(); } ctrlPanel.setPlayButtonEnable(true); ctrlPanel.setPauseButtonEnable(false); ctrlPanel.setPauseButtonLabel(true); ctrlPanel.setStopButtonEnable(false); ctrlPanel.setTurnLevelDownButtonEnable(true); ctrlPanel.setTurnLevelUpButtonEnable(true); miPlay.setEnabled(true); miPause.setEnabled(false); miResume.setEnabled(false); miStop.setEnabled(false); miTurnHarder.setEnabled(true); miTurnEasier.setEnabled(true); reset();//重置画布和控制面板 } /** *得到游戏者设置的难度 * *@returnint,游戏难度1-MAX_LEVEL */ publicintgetLevel(){ returnctrlPanel.getLevel(); } /** *用户设置游戏难度 * *@paramlevelint,游戏难度1-MAX_LEVEL */ publicvoidsetLevel(intlevel){ if(level<11&&level>0){ ctrlPanel.setLevel(level); } } /** *得到游戏积分 * *@returnint,积分 */ publicintgetScore(){ if(canvas!=null){ returncanvas.getScore(); } return0; } /** *得到自上次升级以来的游戏积分,升级以后,此积分清零 * *@returnint,积分 */ publicintgetScoreForLevelUpdate(){ if(canvas!=null){ returncanvas.getScoreForLevelUpdate(); } return0; } /** *当积分累积到一定数值时,升一次级 * *@returnBoolean,true-updatesucceed,false-updatefail */ publicbooleanlevelUpdate(){ intcurLevel=getLevel(); if(curLevel以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。