俄罗斯方块1.docx
- 文档编号:27084793
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:18
- 大小:20.97KB
俄罗斯方块1.docx
《俄罗斯方块1.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块1.docx(18页珍藏版)》请在冰豆网上搜索。
俄罗斯方块1
packageexample;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
//俄罗斯方块类
publicclassERS_BlockextendsJFrame{
publicstaticbooleanisPlay=false;//表明该模板未播放的一种状态
publicstaticintlevel=1,score=0;
publicstaticTextFieldscoreField,levelField;//定义消息对象
publicstaticMyTimertimer;//定时器
GameCanvasgameScr;//提供了游戏的借口,能直接得到键盘的物理状态
publicstaticvoidmain(String[]argus){
ERS_Blockers=newERS_Block("俄罗斯方块游戏V1.0Author:
Vincent");
WindowListenerwin_listener=newWinListener();//监听器
ers.addWindowListener(win_listener);
JOptionPane.showMessageDialog(ers,"游戏说明:
\n1:
方向键控制俄罗斯方块移动的方向."+
"\n2:
空格键控制俄罗斯方块的类型装换."+
"\n3:
单击'开始游戏'游戏开始."+
"\n4:
单击'游戏暂停'暂停游戏,再次单击该键则继续游戏."+
"\n5:
单击'提高等级或降低等级'可以设置难度等级."+
"\n6:
单击'退出游戏'则游戏结束.");
}
//俄罗斯方块类的构造方法
ERS_Block(Stringtitle){
super(title);//调用父类得构造方法
setSize(618,490);//设置框架的尺寸
setLayout(newGridLayout(1,2));//设置框架的布局流
gameScr=newGameCanvas();
gameScr.addKeyListener(gameScr);//为该对象注册键盘点击监听器
timer=newMyTimer(gameScr);
timer.setDaemon(true);//虚拟光驱
timer.start();
timer.suspend();//暂停,延缓
add(gameScr);
PanelrightScr=newPanel();//Panel是最简单的容器类
rightScr.setLayout(newGridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
rightScr.setBackground(Color.cyan);
//右边信息窗体的布局
MyPanelinfoScr=newMyPanel();
infoScr.setLayout(newGridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
infoScr.setBackground(Color.cyan);
//定义标签和初始值
Labelscorep=newLabel("分数:
",Label.LEFT);
Labellevelp=newLabel("级数:
",Label.LEFT);
scoreField=newTextField();
levelField=newTextField();
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(newDimension(20,60));//Dimension类封装单个对象中组件的宽度和高度(精确到整数)。
该类与组件的某个属性关联。
scoreField.setSize(newDimension(20,60));
levelp.setSize(newDimension(20,60));
levelField.setSize(newDimension(20,60));
scoreField.setText("0");
levelField.setText("1");
//右边控制按钮窗体的布局
MyPanelcontrolScr=newMyPanel();
controlScr.setLayout(newGridLayout(5,1,0,5));
rightScr.add(controlScr);
controlScr.setBackground(Color.cyan);
//定义按钮play
Buttonplay_b=newButton("开始游戏");
play_b.setSize(newDimension(100,200));
play_b.addActionListener(newCommand(Command.button_play,gameScr));
//定义按钮LevelUP
Buttonlevel_up_b=newButton("提高级数");
level_up_b.setSize(newDimension(50,200));
level_up_b.addActionListener(newCommand(Command.button_levelup,gameScr));
//定义按钮LevelDown
Buttonlevel_down_b=newButton("降低级数");
level_down_b.setSize(newDimension(50,200));
level_down_b.addActionListener(newCommand(Command.button_leveldown,gameScr));
//定义按钮LevelPause
Buttonpause_b=newButton("游戏暂停");
pause_b.setSize(newDimension(50,200));
pause_b.addActionListener(newCommand(Command.button_pause,gameScr));
//定义按钮Quit
Buttonquit_b=newButton("退出游戏");
quit_b.setSize(newDimension(50,200));
quit_b.addActionListener(newCommand(Command.button_quit,gameScr));
controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
}
//重写MyPanel类,使Panel的四周留空间
classMyPanelextendsJPanel{
publicInsetsgetInsets(){
returnnewInsets(30,50,30,50);
}
}//(庞婷婷)
//游戏画布类
classGameCanvasextendsCanvasimplementsKeyListener{
finalintunitSize=30;//小方块边长
introwNum;//正方格的行数
intcolumnNum;//正方格的列数
intmaxAllowRowNum;//允许有多少行未削
intblockInitRow;//新出现块的起始行坐标
intblockInitCol;//新出现块的起始列坐标
int[][]scrArr;//屏幕数组
Blockb;//对方块的引用
//画布类的构造方法
GameCanvas(){
rowNum=15;
columnNum=10;
maxAllowRowNum=rowNum-2;
b=newBlock(this);
blockInitRow=rowNum-1;
blockInitCol=columnNum/2-2;
scrArr=newint[32][32];
}
//初始化屏幕,并将屏幕数组清零的方法
voidinitScr(){
for(inti=0;i for(intj=0;j scrArr[i][j]=0; b.reset();//调用随机函数 repaint();//重新画方块 } //重新刷新画布方法 publicvoidpaint(Graphicsg){ for(inti=0;i for(intj=0;j drawUnit(i,j,scrArr[i][j]); } //画方块的方法 publicvoiddrawUnit(introw,intcol,inttype){//实现方块的颜色 scrArr[row][col]=type; Graphicsg=getGraphics(); switch(type){//表示画方块的方法 case0: g.setColor(Color.cyan); break;//以背景为颜色画方块 case1: g.setColor(Color.blue); break;//画正在下落的方块 case2: g.setColor(Color.magenta); break;//画已经落下的方块 } g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true); g.dispose();//取消画笔 } publicBlockgetBlock(){ returnb;//返回block实例的引用 } //返回屏幕数组中(row,col)位置的属性值 publicintgetScrArrXY(introw,intcol){ if(row<0||row>=rowNum||col<0||col>=columnNum) return(-1);//防止越界 else return(scrArr[row][col]); } //调用函数,实现方块的横坐标和纵坐标 //返回新块的初始行坐标方法 publicintgetInitRow(){ return(blockInitRow);//返回新块的初始行坐标 } //返回新块的初始列坐标方法 publicintgetInitCol(){ return(blockInitCol);//返回新块的初始列坐标 } //满行删除方法 voiddeleteFullLine(){ intfull_line_num=0; intk=0; for(inti=0;i booleanisfull=true; L1: for(intj=0;j if(scrArr[i][j]==0){//此列无方块存在 k++;//自加1 isfull=false; breakL1; } if(isfull) full_line_num++;//行数累加变量进行自加表示删除了一行方块 if(k! =0&&k-1! =i&&! isfull)//方块未满行 for(intj=0;j if(scrArr[i][j]==0) drawUnit(k-1,j,0);//以背景为颜色画方块 else drawUnit(k-1,j,2);//画已经落下的方块 scrArr[k-1][j]=scrArr[i][j]; } } for(inti=k-1;i for(intj=0;j drawUnit(i,j,0); scrArr[i][j]=0; } } ERS_Block.score+=10*full_line_num; ERS_Block.scoreField.setText(""+ERS_Block.score);//显示分数 } //判断游戏是否结束方法 booleanisGameOver(){ for(intcol=0;col if(scrArr[maxAllowRowNum][col]! =0) returntrue; } returnfalse; } publicvoidkeyTyped(KeyEvente){ } publicvoidkeyReleased(KeyEvente){ } //处理键盘输入的方法 publicvoidkeyPressed(KeyEvente){ if(! ERS_Block.isPlay) return; switch(e.getKeyCode()){ caseKeyEvent.VK_DOWN: b.fallDown();break; caseKeyEvent.VK_LEFT: b.leftMove();break; caseKeyEvent.VK_RIGHT: b.rightMove();break; caseKeyEvent.VK_SPACE: b.leftTurn();break; } } } //处理控制类 classCommandimplementsActionListener{ staticfinalintbutton_play=1;//给按钮分配编号 staticfinalintbutton_levelup=2; staticfinalintbutton_leveldown=3; staticfinalintbutton_quit=4; staticfinalintbutton_pause=5; staticbooleanpause_resume=true; intcurButton;//当前按钮 GameCanvasscr; //控制按钮类的构造方法 Command(intbutton,GameCanvasscr){ curButton=button; this.scr=scr; } //按钮执行方法 publicvoidactionPerformed(ActionEvente){ switch(curButton){ casebutton_play: if(! ERS_Block.isPlay){ scr.initScr(); ERS_Block.isPlay=true;//初始化赋值为true ERS_Block.score=0;//赋值为0 ERS_Block.scoreField.setText("0"); ERS_Block.timer.resume();//重新开始 } scr.requestFocus();//获得焦点结束开始游戏功能设计 break; casebutton_levelup: if(ERS_Block.level<10){//提高级数方法 ERS_Block.level++; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score=0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; casebutton_leveldown: if(ERS_Block.level>1){ ERS_Block.level--; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score=0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; casebutton_pause: if(pause_resume){ ERS_Block.timer.suspend(); pause_resume=false; }else{ ERS_Block.timer.resume(); pause_resume=true; } scr.requestFocus(); break; casebutton_quit: Object[]possibilities1={"YES","NO","CANCEL"}; Iconicon=null; intn=JOptionPane.showOptionDialog(null,"RellyQuit? ","Information",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,icon,possibilities1,possibilities1[0]); if(n==JOptionPane.YES_OPTION){ System.exit(0); } elseif(n==JOptionPane.NO_OPTION){} if(n==JOptionPane.CANCEL_OPTION){} scr.requestFocus(); } } }//刘盼杰 classBlock{ staticint[][]pattern={ {0x0f00,0x4444,0x0f00,0x4444},//用十六进制表示'一'字型的四种状态 {0x04e0,0x0464,0x00e4,0x04c4},//'T'型的四种状态 {0x4620,0x6c00,0x4620,0x6c00},//反'Z'型的四种状态 {0x2640,0xc600,0x2640,0xc600},//'Z'型的四种状态 {0x6220,0x1700,0x2230,0x0740},//'L'型的四种状态 {0x6440,0x0e20,0x44c0,0x8e00},//反'L'型的四种状态 {0x0660,0x0660,0x0660,0x0660},//'田'字型的四种状态 }; intblockType;//块的模式号(0-6) intturnState;//块的翻转状态(0-3) intblockState;//块的下落状态 introw,col;//块在画布上的坐标 GameCanvasscr;//定义对象 //块类的构造方法 Block(GameCanvasscr){//重新初始化块,并显示新块 this.scr=scr;//参数赋值 blockType=(int)(Math.random()*1000)%7;//random()指可随机产生一定范围的一切整数 turnState=(int)(Math.random()*1000)%4;//状态 blockState=1;//初始化为1 row=scr.getInitRow();//获取方块的横坐标 col=scr.getInitCol();//获取方块的纵坐标 } publicvoidreset(){//实现块翻转的操作 blockType=(int)(Math.random()*1000)%7;//对产生的随机数进行求余操作 turnState=(int)(Math.random()*1000)%4; blockState=1; row=scr.getInitRow(); col=scr.getInitCol(); dispBlock (1);//显示方块 } publicvoidleftTurn(){//实现方块翻转的方法 if(assertValid(blockType,(turnState+1)%4,row,col)){//判断方法是否为真 dispBlock(0);//传入参数0 turnState=(turnState+1)%4; dispBlock (1);//传入参数1 } } //实现块的左移的方法 publicvoidleftMove(){ if(assertValid(blockType,turnState,row,col-1)){ dispBlock(0); c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块