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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。