2024年10月俄罗斯方块java(java俄罗斯方块)

 更新时间:2024-10-12

  ⑴俄罗斯方块java(java俄罗斯方块

  ⑵俄罗斯方块——java源代码提供importjava.awt.*;importjava.awt.event.*;//俄罗斯方块类publilassERS_BlockextendsFrame{publicstaticbooleanisPlay=false;publicstaticintlevel=,score=;publicstaticTextFieldscoreField,levelField;publicstaticMyTimertimer;GameCanvasgameScr;publicstaticvoidmain(Stringargus){ERS_Blockers=newERS_Block(“俄罗斯方块游戏V.Author:Vincent“);WindowListenerwin_listener=newWinListener();ers.addWindowListener(win_listener);}//俄罗斯方块类的构造方法ERS_Block(Stringtitle){super(title);setSize(,);setLayout(newGridLayout(,));gameScr=newGameCanvas();gameScr.addKeyListener(gameScr);timer=newMyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();add(gameScr);PanelrightScr=newPanel();rightScr.setLayout(newGridLayout(,,,));rightScr.setSize(,);add(rightScr);//右边信息窗体的布局MyPanelinfoScr=newMyPanel();infoScr.setLayout(newGridLayout(,,,));infoScr.setSize(,);rightScr.add(infoScr);//定义标签和初始值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(,));scoreField.setSize(newDimension(,));levelp.setSize(newDimension(,));levelField.setSize(newDimension(,));scoreField.setText(““);levelField.setText(““);//右边控制按钮窗体的布局MyPanelcontrolScr=newMyPanel();controlScr.setLayout(newGridLayout(,,,));rightScr.add(controlScr);//定义按钮playButtonplay_b=newButton(“开始游戏“);play_b.setSize(newDimension(,));play_b.addActionListener(newmand(mand.button_play,gameScr));//定义按钮LevelUPButtonlevel_up_b=newButton(“提高级数“);level_up_b.setSize(newDimension(,));level_up_b.addActionListener(newmand(mand.button_levelup,gameScr));//定义按钮LevelDownButtonlevel_down_b=newButton(“降低级数“);level_down_b.setSize(newDimension(,));level_down_b.addActionListener(newmand(mand.button_leveldown,gameScr));//定义按钮LevelPauseButtonpause_b=newButton(“游戏暂停“);pause_b.setSize(newDimension(,));pause_b.addActionListener(newmand(mand.button_pause,gameScr));//定义按钮QuitButtonquit_b=newButton(“退出游戏“);quit_b.setSize(newDimension(,));quit_b.addActionListener(newmand(mand.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的四周留空间classMyPanelextendsPanel{publicInsetsgetInsets(){returnnewInsets(,,,);}}//游戏画布类classGameCanvasextendsCanvasimplementsKeyListener{finalintunitSize=;//小方块边长introwNum;//正方格的行数intcolumnNum;//正方格的列数intmaxAllowRowNum;//允许有多少行未削intblockInitRow;//新出现块的起始行坐标intblockInitCol;//新出现块的起始列坐标intscrArr;//屏幕数组Blockb;//对方快的引用//画布类的构造方法GameCanvas(){rowNum=;columnNum=;maxAllowRowNum=rowNum-;b=newBlock(this);blockInitRow=rowNum-;blockInitCol=columnNum/-;scrArr=newint;}//初始化屏幕,并将屏幕数组清零的方法voidinitScr(){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)scrArr[j]=;b.reset();repaint();}//重新刷新画布方法publicvoidpaint(Graphicsg){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)drawUnit(i,j,scrArr[j]);}//画方块的方法publicvoiddrawUnit(introw,intcol,inttype){scrArr[row][col]=type;Graphicsg=getGraphics();tch(type){//表示画方快的方法case:g.setColor(Color.black);break;//以背景为颜色画case:g.setColor(Color.blue);break;//画正在下落的方块case:g.setColor(Color.magenta);break;//画已经落下的方法}g.fillDRect(col*unitSize,getSize().height-(row+)*unitSize,unitSize,unitSize,true);g.dispose();}publicBlockgetBlock(){returnb;//返回block实例的引用}//返回屏幕数组中(row,col)位置的属性值publicintgetScrArrXY(introw,intcol){if(row《||row》=rowNum||col《||col》=columnNum)return(-);elsereturn(scrArr[row][col]);}//返回新块的初始行坐标方法publicintgetInitRow(){return(blockInitRow);//返回新块的初始行坐标}//返回新块的初始列坐标方法publicintgetInitCol(){return(blockInitCol);//返回新块的初始列坐标}//满行删除方法voiddeleteFullLine(){intfull_line_num=;intk=;for(inti=;i《rowNum;i++){booleanisfull=true;L:for(intj=;j《columnNum;j++)if(scrArr[j]==){k++;isfull=false;breakL;}if(isfull)full_line_num++;if(k!=&&k-!=i&&!isfull)for(intj=;j《columnNum;j++){if(scrArr[j]==)drawUnit(k-,j,);elsedrawUnit(k-,j,);scrArr[k-][j]=scrArr[j];}}for(inti=k-;i《rowNum;i++){for(intj=;j《columnNum;j++){drawUnit(i,j,);scrArr[j]=;}}ERS_Block.score+=full_line_num;ERS_Block.scoreField.setText(““+ERS_Block.score);}//判断游戏是否结束方法booleanisGameEnd(){for(intcol=;col《columnNum;col++){if(scrArr[maxAllowRowNum][col]!=)returntrue;}returnfalse;}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}//处理键盘输入的方法publicvoidkeyPressed(KeyEvente){if(!ERS_Block.isPlay)return;tch(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;}}}//处理控制类classmandimplementsActionListener{staticfinalintbutton_play=;//给按钮分配编号staticfinalintbutton_levelup=;staticfinalintbutton_leveldown=;staticfinalintbutton_quit=;staticfinalintbutton_pause=;staticbooleanpause_resume=true;intcurButton;//当前按钮GameCanvasscr;//控制按钮类的构造方法mand(intbutton,GameCanvasscr){curButton=button;this.scr=scr;}//按钮执行方法publicvoidactionPerformed(ActionEvente){tch(curButton){casebutton_play:if(!ERS_Block.isPlay){scr.initScr();ERS_Block.isPlay=true;ERS_Block.score=;ERS_Block.scoreField.setText(““);ERS_Block.timer.resume();}scr.requestFocus();break;casebutton_levelup:if(ERS_Block.level《){ERS_Block.level++;ERS_Block.levelField.setText(““+ERS_Block.level);ERS_Block.score=;ERS_Block.scoreField.setText(““+ERS_Block.score);}scr.requestFocus();break;casebutton_leveldown:if(ERS_Block.level》){ERS_Block.level--;ERS_Block.levelField.setText(““+ERS_Block.level);ERS_Block.score=;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:System.exit();}}}//方块类classBlock{staticintpattern={{xf,x,xf,x},//用十六进至表示,本行表示长条四种状态{xe,x,xe,xc},{x,xc,x,xc},{x,xc,x,xc},{x,x,x,x},{x,xe,xc,xe},{x,x,x,x}};intblockType;//块的模式号(-intturnState;//块的翻转状态(-intblockState;//快的下落状态introw,col;//块在画布上的坐标GameCanvasscr;//块类的构造方法Block(GameCanvasscr){this.scr=scr;blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();}//重新初始化块,并显示新块publicvoidreset(){blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();dispBlock();}//实现“块”翻转的方法publicvoidleftTurn(){if(assertValid(blockType,(turnState+)%,row,col)){dispBlock();turnState=(turnState+)%;dispBlock();}}//实现“块”的左移的方法publicvoidleftMove(){if(assertValid(blockType,turnState,row,col-)){dispBlock();col--;dispBlock();}}//实现块的右移publicvoidrightMove(){if(assertValid(blockType,turnState,row,col+)){dispBlock();col++;dispBlock();}}//实现块落下的操作的方法publicbooleanfallDown(){if(blockState==)return(false);if(assertValid(blockType,turnState,row-,col)){dispBlock();row--;dispBlock();return(true);}else{blockState=;dispBlock();return(false);}}//判断是否正确的方法booleanassertValid(intt,ints,introw,intcol){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if((int)(pattern[t][s]&k)!=){inttemp=scr.getScrArrXY(row-i,col+j);if(temp《||temp==)returnfalse;}k=k》》;}}returntrue;}//同步显示的方法publicsynchronizedvoiddispBlock(ints){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if(((int)pattern[blockType][turnState]&k)!=){scr.drawUnit(row-i,col+j,s);}k=k》》;}}}}//定时线程classMyTimerextendsThread{GameCanvasscr;publicMyTimer(GameCanvasscr){this.scr=scr;}publicvoidrun(){while(true){try{sleep((-ERS_Block.level+)*);}catch(InterruptedExceptione){}if(!scr.getBlock().fallDown()){scr.deleteFullLine();if(scr.isGameEnd()){ERS_Block.isPlay=false;suspend();}elsescr.getBlock().reset();}}}}classWinListenerextendsWindowAdapter{publicvoidwindowClosing(WindowEventl){System.exit();}}希望能解决您的问题。

  ⑶在这段java代码--俄罗斯方块,方块是怎么旋转的

  ⑷贴出来的代码还不够,不过已经基本能回答你的问题了我的推理过程:从(turnstate+)%可以看出,turnstate是一个数字,取值只有,因此它仅仅是一个标识符,四种取值分别标记着这个方块处于原状,旋转度,度或者度。然后blow函数应该是一个判断旋转之后会不会出现和已有方块重叠的函数。因此,这个turn函数的功能是:把标识符变成下一个状态,然后判断如果旋转,会不会和已有的方块重叠,如果重叠,就取消这个旋转标记的改变。因此,答案就很明显了:真正实现旋转方块的操作并不在这里,或者说,你再仔细研究一下这个程序的代码,它可能实际上根本没有旋转过那个方块,只是用turnstate这个数字标记方块旋转了多少度,判断重叠以及绘制的时候才真正计算或者从表里直接读取旋转后状态而已。

  ⑸求一个java俄罗斯方块的设计思路不要代码只要思路本人是初学者

  ⑹:首先自己定义一个类,比如MyLabel,继承jlabel,设置大小比如(,设置成方块,这就是游戏里面最小的单位,下落的图形,就是四个这个样的单位组合到一起,位置不同。:定义自己的图形(就是游戏中下落的部分比如MyPic,这个类是控制MyLabel的,一般是个MyLabel组合成一个MyPic,:定义自己的面板,大小是(n*,m*)就是上面最小单位的整数行和列,然后建一个二位数组int[n][m],数组里面默认为,标示这个位置没有MyLabel,是空的,如果位置有MyLabel,设置成,这个是数组是,图形下落的时候判断是否继续下落还是要停下了,下面有了就停,否则继续下落,下落停止后,根据数组,看某一行是否全部为是的话,把这行清空图形的下落要用定时器或者自己写线程实现,然后就是判断下面是否有东西,是下落,还是停止,图形的旋转的话,自己研究吧,位置的变换,也不好做

  ⑺用java做一个俄罗斯方块,要用到那方面的技术才行

  ⑻JAVA俄罗斯方块?这让我想到了初学JAVA的时候,我就是做的俄罗斯方块。完成最简单的俄罗斯的方块只需要监听、线程、SWING就行了。让我想想,好像没了。最主要的地方就是,你要写好几个形状,其实就是坐标啦。还有在写一个地图,判断有没有落地还有消去什么的。然后在线程中,随机生成形状,让形状一直往下落,就是一直改变坐标,然后要有是否越界,是否落地,是否消去的判断。就是一个不断画图的简单程序

  ⑼java俄罗斯方块旋转算法,求解

  ⑽可以给每一个小方块设置为一个坐标,变为一个三阶行列式,*矩阵,转变为二元数组旋转。观察一下左旋:

  ⑾????????????

  ⑿??????→→?????

  ⒀??????????????

  ⒁坐标变换如下:(,变为(,,(,变为(,,(,变为(,

  ⒂,变为(,,(,变为(,,(,变为(,

  ⒃,变为(,,(,变为(,,(,变为(,

  ⒄规律就是(i,j变为(j,-i+):

  ⒅如果是*的方格,就可以变为二阶行列式,也就是*的二元数组,这里给出*九宫格改变的示意,我的代码如下:

  ⒆import?java.util.Random;public?class?T{public?static?void?main(String?args){int?a=new?int;System.out.println(“now?begin?to?form?a?new?integer?array“);Random?r=new?Random();for(int?i=;i《;i++){for(int?j=;j《;j++){a[i][j]=r.nextInt();}}System.out.println(“the?array?is?shown?as?follows:“);for(int?i=;i《;i++){for(int?j=;j《;j++){System.out.print(a[i][j]+“?“);}System.out.println();}System.out.println(“左转九十度“);for(int?i=;i《a.length;i++){for(int?j=;j《a[i].length;j++){System.out.print(a[a[i].length--j][i]+“?“);}System.out.println();}}}

  ⒇java的俄罗斯方块代码及详细解答和设计思想

  ⒈importjava.awt.*;importjava.awt.event.*;//俄罗斯方块类publilassERS_BlockextendsFrame{publicstaticbooleanisPlay=false;publicstaticintlevel=,score=;publicstaticTextFieldscoreField,levelField;publicstaticMyTimertimer;GameCanvasgameScr;publicstaticvoidmain(Stringargus){ERS_Blockers=newERS_Block(“俄罗斯方块游戏V.Author:Vincent“);WindowListenerwin_listener=newWinListener();ers.addWindowListener(win_listener);}//俄罗斯方块类的构造方法ERS_Block(Stringtitle){super(title);setSize(,);setLayout(newGridLayout(,));gameScr=newGameCanvas();gameScr.addKeyListener(gameScr);timer=newMyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();add(gameScr);PanelrightScr=newPanel();rightScr.setLayout(newGridLayout(,,,));rightScr.setSize(,);add(rightScr);//右边信息窗体的布局MyPanelinfoScr=newMyPanel();infoScr.setLayout(newGridLayout(,,,));infoScr.setSize(,);rightScr.add(infoScr);//定义标签和初始值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(,));scoreField.setSize(newDimension(,));levelp.setSize(newDimension(,));levelField.setSize(newDimension(,));scoreField.setText(““);levelField.setText(““);//右边控制按钮窗体的布局MyPanelcontrolScr=newMyPanel();controlScr.setLayout(newGridLayout(,,,));rightScr.add(controlScr);//定义按钮playButtonplay_b=newButton(“开始游戏“);play_b.setSize(newDimension(,));play_b.addActionListener(newmand(mand.button_play,gameScr));//定义按钮LevelUPButtonlevel_up_b=newButton(“提高级数“);level_up_b.setSize(newDimension(,));level_up_b.addActionListener(newmand(mand.button_levelup,gameScr));//定义按钮LevelDownButtonlevel_down_b=newButton(“降低级数“);level_down_b.setSize(newDimension(,));level_down_b.addActionListener(newmand(mand.button_leveldown,gameScr));//定义按钮LevelPauseButtonpause_b=newButton(“游戏暂停“);pause_b.setSize(newDimension(,));pause_b.addActionListener(newmand(mand.button_pause,gameScr));//定义按钮QuitButtonquit_b=newButton(“退出游戏“);quit_b.setSize(newDimension(,));quit_b.addActionListener(newmand(mand.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的四周留空间classMyPanelextendsPanel{publicInsetsgetInsets(){returnnewInsets(,,,);}}//游戏画布类classGameCanvasextendsCanvasimplementsKeyListener{finalintunitSize=;//小方块边长introwNum;//正方格的行数intcolumnNum;//正方格的列数intmaxAllowRowNum;//允许有多少行未削intblockInitRow;//新出现块的起始行坐标intblockInitCol;//新出现块的起始列坐标intscrArr;//屏幕数组Blockb;//对方快的引用//画布类的构造方法GameCanvas(){rowNum=;columnNum=;maxAllowRowNum=rowNum-;b=newBlock(this);blockInitRow=rowNum-;blockInitCol=columnNum/-;scrArr=newint;}//初始化屏幕,并将屏幕数组清零的方法voidinitScr(){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)scrArr[i][j]=;b.reset();repaint();}//重新刷新画布方法publicvoidpaint(Graphicsg){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)drawUnit(i,j,scrArr[i][j]);}//画方块的方法publicvoiddrawUnit(introw,intcol,inttype){scrArr[row][col]=type;Graphicsg=getGraphics();switch(type){//表示画方快的方法case:g.setColor(Color.black);break;//以背景为颜色画case:g.setColor(Color.blue);break;//画正在下落的方块case:g.setColor(Color.magenta);break;//画已经落下的方法}g.fillDRect(col*unitSize,getSize().height-(row+)*unitSize,unitSize,unitSize,true);g.dispose();}publicBlockgetBlock(){returnb;//返回block实例的引用}//返回屏幕数组中(row,col)位置的属性值publicintgetScrArrXY(introw,intcol){if(row《||row》=rowNum||col《||col》=columnNum)return(-);elsereturn(scrArr[row][col]);}//返回新块的初始行坐标方法publicintgetInitRow(){return(blockInitRow);//返回新块的初始行坐标}//返回新块的初始列坐标方法publicintgetInitCol(){return(blockInitCol);//返回新块的初始列坐标}//满行删除方法voiddeleteFullLine(){intfull_line_num=;intk=;for(inti=;i《rowNum;i++){booleanisfull=true;L:for(intj=;j《columnNum;j++)if(scrArr[i][j]==){k++;isfull=false;breakL;}if(isfull)full_line_num++;if(k!=&&k-!=i&&!isfull)for(intj=;j《columnNum;j++){if(scrArr[i][j]==)drawUnit(k-,j,);elsedrawUnit(k-,j,);scrArr[k-][j]=scrArr[i][j];}}for(inti=k-;i《rowNum;i++){for(intj=;j《columnNum;j++){drawUnit(i,j,);scrArr[i][j]=;}}ERS_Block.score+=full_line_num;ERS_Block.scoreField.setText(““+ERS_Block.score);}//判断游戏是否结束方法booleanisGameEnd(){for(intcol=;col《columnNum;col++){if(scrArr[maxAllowRowNum][col]!=)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;}}}//处理控制类classmandimplementsActionListener{staticfinalintbutton_play=;//给按钮分配编号staticfinalintbutton_levelup=;staticfinalintbutton_leveldown=;staticfinalintbutton_quit=;staticfinalintbutton_pause=;staticbooleanpause_resume=true;intcurButton;//当前按钮GameCanvasscr;//控制按钮类的构造方法mand(intbutton,GameCanvasscr){curButton=button;this.scr=scr;}//按钮执行方法publicvoidactionPerformed(ActionEvente){switch(curButton){casebutton_play:if(!ERS_Block.isPlay){scr.initScr();ERS_Block.isPlay=true;ERS_Block.score=;ERS_Block.scoreField.setText(““);ERS_Block.timer.resume();}scr.requestFocus();break;casebutton_levelup:if(ERS_Block.level《){ERS_Block.level++;ERS_Block.levelField.setText(““+ERS_Block.level);ERS_Block.score=;ERS_Block.scoreField.setText(““+ERS_Block.score);}scr.requestFocus();break;casebutton_leveldown:if(ERS_Block.level》){ERS_Block.level--;ERS_Block.levelField.setText(““+ERS_Block.level);ERS_Block.score=;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:System.exit();}}}//方块类classBlock{staticintpattern={{xf,x,xf,x},//用十六进至表示,本行表示长条四种状态{xe,x,xe,xc},{x,xc,x,xc},{x,xc,x,xc},{x,x,x,x},{x,xe,xc,xe},{x,x,x,x}};intblockType;//块的模式号(-intturnState;//块的翻转状态(-intblockState;//快的下落状态introw,col;//块在画布上的坐标GameCanvasscr;//块类的构造方法Block(GameCanvasscr){this.scr=scr;blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();}//重新初始化块,并显示新块publicvoidreset(){blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();dispBlock();}//实现“块”翻转的方法publicvoidleftTurn(){if(assertValid(blockType,(turnState+)%,row,col)){dispBlock();turnState=(turnState+)%;dispBlock();}}//实现“块”的左移的方法publicvoidleftMove(){if(assertValid(blockType,turnState,row,col-)){dispBlock();col--;dispBlock();}}//实现块的右移publicvoidrightMove(){if(assertValid(blockType,turnState,row,col+)){dispBlock();col++;dispBlock();}}//实现块落下的操作的方法publicbooleanfallDown(){if(blockState==)return(false);if(assertValid(blockType,turnState,row-,col)){dispBlock();row--;dispBlock();return(true);}else{blockState=;dispBlock();return(false);}}//判断是否正确的方法booleanassertValid(intt,ints,introw,intcol){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if((int)(pattern[t][s]&k)!=){inttemp=scr.getScrArrXY(row-i,col+j);if(temp《||temp==)returnfalse;}k=k》》;}}returntrue;}//同步显示的方法publicsynchronizedvoiddispBlock(ints){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if(((int)pattern[blockType][turnState]&k)!=){scr.drawUnit(row-i,col+j,s);}k=k》》;}}}}//定时线程classMyTimerextendsThread{GameCanvasscr;publicMyTimer(GameCanvasscr){this.scr=scr;}publicvoidrun(){while(true){try{sleep((-ERS_Block.level+)*);}catch(InterruptedExceptione){}if(!scr.getBlock().fallDown()){scr.deleteFullLine();if(scr.isGameEnd()){ERS_Block.isPlay=false;suspend();}elsescr.getBlock().reset();}}}}classWinListenerextendsWindowAdapter{publicvoidwindowClosing(WindowEventl){System.exit();}}

  ⒉importjava.awt.*;importjava.awt.event.*;//俄罗斯方块类publilassMytestextendsFrame{publicstaticbooleanisPlay=false;publicstaticintlevel=,score=;publicstaticTextFieldscoreField,levelField;publicstaticMyTimertimer;GameCanvasgameScr;publicstaticvoidmain(Stringargus){Mytesters=newMytest(“俄罗斯方块游戏“);WindowListenerwin_listener=newWinListener();ers.addWindowListener(win_listener);}//俄罗斯方块类的构造方法Mytest(Stringtitle){super(title);setSize(,);setLayout(newGridLayout(,));gameScr=newGameCanvas();gameScr.addKeyListener(gameScr);timer=newMyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();add(gameScr);PanelrightScr=newPanel();rightScr.setLayout(newGridLayout(,,,));rightScr.setSize(,);add(rightScr);//右边信息窗体的布局MyPanelinfoScr=newMyPanel();infoScr.setLayout(newGridLayout(,,,));infoScr.setSize(,);rightScr.add(infoScr);//定义标签和初始值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(,));scoreField.setSize(newDimension(,));levelp.setSize(newDimension(,));levelField.setSize(newDimension(,));scoreField.setText(““);levelField.setText(““);//右边控制按钮窗体的布局MyPanelcontrolScr=newMyPanel();controlScr.setLayout(newGridLayout(,,,));rightScr.add(controlScr);//定义按钮playButtonplay_b=newButton(“开始游戏“);play_b.setSize(newDimension(,));play_b.addActionListener(newmand(mand.button_play,gameScr));//定义按钮LevelUPButtonlevel_up_b=newButton(“提高级数“);level_up_b.setSize(newDimension(,));level_up_b.addActionListener(newmand(mand.button_levelup,gameScr));//定义按钮LevelDownButtonlevel_down_b=newButton(“降低级数“);level_down_b.setSize(newDimension(,));level_down_b.addActionListener(newmand(mand.button_leveldown,gameScr));//定义按钮LevelPauseButtonpause_b=newButton(“游戏暂停“);pause_b.setSize(newDimension(,));pause_b.addActionListener(newmand(mand.button_pause,gameScr));//定义按钮QuitButtonquit_b=newButton(“退出游戏“);quit_b.setSize(newDimension(,));quit_b.addActionListener(newmand(mand.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的四周留空间classMyPanelextendsPanel{publicInsetsgetInsets(){returnnewInsets(,,,);}}//游戏画布类classGameCanvasextendsCanvasimplementsKeyListener{finalintunitSize=;//小方块边长introwNum;//正方格的行数intcolumnNum;//正方格的列数intmaxAllowRowNum;//允许有多少行未削intblockInitRow;//新出现块的起始行坐标intblockInitCol;//新出现块的起始列坐标intscrArr;//屏幕数组Blockb;//对方快的引用//画布类的构造方法GameCanvas(){rowNum=;columnNum=;maxAllowRowNum=rowNum-;b=newBlock(this);blockInitRow=rowNum-;blockInitCol=columnNum/-;scrArr=newint;}//初始化屏幕,并将屏幕数组清零的方法voidinitScr(){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)scrArr[i][j]=;b.reset();repaint();}//重新刷新画布方法publicvoidpaint(Graphicsg){for(inti=;i《rowNum;i++)for(intj=;j《columnNum;j++)drawUnit(i,j,scrArr[i][j]);}//画方块的方法publicvoiddrawUnit(introw,intcol,inttype){scrArr[row][col]=type;Graphicsg=getGraphics();switch(type){//表示画方快的方法case:g.setColor(Color.black);break;//以背景为颜色画case:g.setColor(Color.blue);break;//画正在下落的方块case:g.setColor(Color.magenta);break;//画已经落下的方法}g.fillDRect(col*unitSize,getSize().height-(row+)*unitSize,unitSize,unitSize,true);g.dispose();}publicBlockgetBlock(){returnb;//返回block实例的引用}//返回屏幕数组中(row,col)位置的属性值publicintgetScrArrXY(introw,intcol){if(row《||row》=rowNum||col《||col》=columnNum)return(-);elsereturn(scrArr[row][col]);}//返回新块的初始行坐标方法publicintgetInitRow(){return(blockInitRow);//返回新块的初始行坐标}//返回新块的初始列坐标方法publicintgetInitCol(){return(blockInitCol);//返回新块的初始列坐标}//满行删除方法voiddeleteFullLine(){intfull_line_num=;intk=;for(inti=;i《rowNum;i++){booleanisfull=true;L:for(intj=;j《columnNum;j++)if(scrArr[i][j]==){k++;isfull=false;breakL;}if(isfull)full_line_num++;if(k!=&&k-!=i&&!isfull)for(intj=;j《columnNum;j++){if(scrArr[i][j]==)drawUnit(k-,j,);elsedrawUnit(k-,j,);scrArr[k-][j]=scrArr[i][j];}}for(inti=k-;i《rowNum;i++){for(intj=;j《columnNum;j++){drawUnit(i,j,);scrArr[i][j]=;}}Mytest.score+=full_line_num;Mytest.scoreField.setText(““+Mytest.score);}//判断游戏是否结束方法booleanisGameEnd(){for(intcol=;col《columnNum;col++){if(scrArr[maxAllowRowNum][col]!=)returntrue;}returnfalse;}publicvoidkeyTyped(KeyEvente){}publicvoidkeyReleased(KeyEvente){}//处理键盘输入的方法publicvoidkeyPressed(KeyEvente){if(!Mytest.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;}}}//处理控制类classmandimplementsActionListener{staticfinalintbutton_play=;//给按钮分配编号staticfinalintbutton_levelup=;staticfinalintbutton_leveldown=;staticfinalintbutton_quit=;staticfinalintbutton_pause=;staticbooleanpause_resume=true;intcurButton;//当前按钮GameCanvasscr;//控制按钮类的构造方法mand(intbutton,GameCanvasscr){curButton=button;this.scr=scr;}//按钮执行方法publicvoidactionPerformed(ActionEvente){switch(curButton){casebutton_play:if(!Mytest.isPlay){scr.initScr();Mytest.isPlay=true;Mytest.score=;Mytest.scoreField.setText(““);Mytest.timer.resume();}scr.requestFocus();break;casebutton_levelup:if(Mytest.level《){Mytest.level++;Mytest.levelField.setText(““+Mytest.level);Mytest.score=;Mytest.scoreField.setText(““+Mytest.score);}scr.requestFocus();break;casebutton_leveldown:if(Mytest.level》){Mytest.level--;Mytest.levelField.setText(““+Mytest.level);Mytest.score=;Mytest.scoreField.setText(““+Mytest.score);}scr.requestFocus();break;casebutton_pause:if(pause_resume){Mytest.timer.suspend();pause_resume=false;}else{Mytest.timer.resume();pause_resume=true;}scr.requestFocus();break;casebutton_quit:System.exit();}}}//方块类classBlock{staticintpattern={{xf,x,xf,x},//用十六进至表示,本行表示长条四种状态{xe,x,xe,xc},{x,xc,x,xc},{x,xc,x,xc},{x,x,x,x},{x,xe,xc,xe},{x,x,x,x}};intblockType;//块的模式号(-intturnState;//块的翻转状态(-intblockState;//快的下落状态introw,col;//块在画布上的坐标GameCanvasscr;//块类的构造方法Block(GameCanvasscr){this.scr=scr;blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();}//重新初始化块,并显示新块publicvoidreset(){blockType=(int)(Math.random()*)%;turnState=(int)(Math.random()*)%;blockState=;row=scr.getInitRow();col=scr.getInitCol();dispBlock();}//实现“块”翻转的方法publicvoidleftTurn(){if(assertValid(blockType,(turnState+)%,row,col)){dispBlock();turnState=(turnState+)%;dispBlock();}}//实现“块”的左移的方法publicvoidleftMove(){if(assertValid(blockType,turnState,row,col-)){dispBlock();col--;dispBlock();}}//实现块的右移publicvoidrightMove(){if(assertValid(blockType,turnState,row,col+)){dispBlock();col++;dispBlock();}}//实现块落下的操作的方法publicbooleanfallDown(){if(blockState==)return(false);if(assertValid(blockType,turnState,row-,col)){dispBlock();row--;dispBlock();return(true);}else{blockState=;dispBlock();return(false);}}//判断是否正确的方法booleanassertValid(intt,ints,introw,intcol){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if((int)(pattern[t][s]&k)!=){inttemp=scr.getScrArrXY(row-i,col+j);if(temp《||temp==)returnfalse;}k=k》》;}}returntrue;}//同步显示的方法publicsynchronizedvoiddispBlock(ints){intk=x;for(inti=;i《;i++){for(intj=;j《;j++){if(((int)pattern[blockType][turnState]&k)!=){scr.drawUnit(row-i,col+j,s);}k=k》》;}}}}//定时线程classMyTimerextendsThread{GameCanvasscr;publicMyTimer(GameCanvasscr){this.scr=scr;}publicvoidrun(){while(true){try{sleep((-Mytest.level+)*);}catch(InterruptedExceptione){}if(!scr.getBlock().fallDown()){scr.deleteFullLine();if(scr.isGameEnd()){Mytest.isPlay=false;suspend();}elsescr.getBlock().reset();}}}}classWinListenerextendsWindowAdapter{publicvoidwindowClosing(WindowEventl){System.exit();}}

您可能感兴趣的文章:

相关文章