程序.docx
《程序.docx》由会员分享,可在线阅读,更多相关《程序.docx(14页珍藏版)》请在冰豆网上搜索。
![程序.docx](https://file1.bdocx.com/fileroot1/2023-1/30/5d6c325d-e237-4db6-8fd4-2a7cedfb4596/5d6c325d-e237-4db6-8fd4-2a7cedfb45961.gif)
程序
packagerussia;
importjava.awt.*;
importjava.awt.event.*;
//俄罗斯方块类
classERS_BlockextendsFrame{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
publicstaticbooleanisPlay=false;
publicstaticintlevel=1,score=0;
publicstaticTextFieldscoreField,levelField;
publicstaticMyTimertimer;
GameCanvasgameScr;
publicstaticvoidmain(String[]argus){
ERS_Blockers=newERS_Block("俄罗斯方块游戏V1.0");
WindowListenerwin_listener=newWinListener();
ers.addWindowListener(win_listener);
}
//俄罗斯方块类的构造方法
@SuppressWarnings("deprecation")
ERS_Block(Stringtitle){
super(title);
setSize(600,480);
setLayout(newGridLayout(1,2));
gameScr=newGameCanvas();
gameScr.addKeyListener(gameScr);
timer=newMyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
PanelrightScr=newPanel();
rightScr.setLayout(newGridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
//右边信息窗体的布局
MyPanelinfoScr=newMyPanel();
infoScr.setLayout(newGridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
//定义标签和初始值
Labelscorep=newLabel("分数:
",Label.LEFT);
Labellevelp=newLabel("级数:
",Label.LEFT);
scoreField=newTextField(8);
levelField=newTextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(newDimension(20,60));
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);
//定义按钮play
Buttonplay_b=newButton("开始游戏");
play_b.setSize(newDimension(50,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的四周留空间
classMyPanelextendsPanel{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
publicInsetsgetInsets(){
returnnewInsets(30,50,30,50);
}
}
//游戏画布类
classGameCanvasextendsCanvasimplementsKeyListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
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;ifor(intj=0;j{scrArr[i][j]=0;}
b.reset();
repaint();
}
//重新刷新画布方法
publicvoidpaint(Graphicsg){
for(inti=0;ifor(intj=0;jdrawUnit(i,j,scrArr[i][j]);
}
//画方块的方法
publicvoiddrawUnit(introw,intcol,inttype){
scrArr[row][col]=type;
Graphicsg=getGraphics();
switch(type){//表示画方快的方法
case0:
g.setColor(Color.black);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;ibooleanisfull=true;
L1:
for(intj=0;jif(scrArr[i][j]==0){
k++;
isfull=false;
breakL1;
}
if(isfull)full_line_num++;
if(k!
=0&&k-1!
=i&&!
isfull)
for(intj=0;jif(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;ifor(intj=0;jdrawUnit(i,j,0);
scrArr[i][j]=0;
}
}
ERS_Block.score+=full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
//判断游戏是否结束方法
booleanisGameEnd(){
for(intcol=0;colif(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_UP:
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;
}
//按钮执行方法
@SuppressWarnings("deprecation")
publicvoidactionPerformed(ActionEvente){
switch(curButton){
casebutton_play:
if(!
ERS_Block.isPlay){
scr.initScr();
ERS_Block.isPlay=true;
ERS_Block.score=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:
System.exit(0);
}
}
}
//方块类
classBlock{
staticint[][]pattern={
{0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态
{0x04e0,0x0464,0x00e4,0x04c4},
{0x4620,0x6c00,0x4620,0x6c00},
{0x2640,0xc600,0x2640,0xc600},
{0x6220,0x1700,0x2230,0x0740},
{0x6440,0x0e20,0x44c0,0x8e00},
{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;
turnState=(int)(Math.random()*1000)%4;
blockState=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);
turnState=(turnState+1)%4;
dispBlock
(1);
}
}
//实现“块”的左移的方法
publicvoidleftMove(){
if(assertValid(blockType,turnState,row,col-1)){
dispBlock(0);
col--;
dispBlock
(1);
}
}
//实现块的右移
publicvoidrightMove(){
if(assertValid(blockType,turnState,row,col+1)){
dispBlock(0);
col++;
dispBlock
(1);
}
}
//实现块落下的操作的方法
publicbooleanfallDown(){
if(blockState==2)
return(false);
if(assertValid(blockType,turnState,row-1,col)){
dispBlock(0);
row--;
dispBlock
(1);
return(true);
}else{
blockState=2;
dispBlock
(2);
return(false);
}
}
//判断是否正确的方法
booleanassertValid(intt,ints,introw,intcol){
intk=0x8000;
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
if((int)(pattern[t][s]&k)!
=0){
inttemp=scr.getScrArrXY(row-i,col+j);
if(temp<0||temp==2)
returnfalse;
}
k=k>>1;
}
}
returntrue;
}
//同步显示的方法
publicsynchronizedvoiddispBlock(ints){
intk=0x8000;
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
if(((int)pattern[blockType][turnState]&k)!
=0){
scr.drawUnit(row-i,col+j,s);
}
k=k>>1;
}
}
}
}
//定时线程
classMyTimerextendsThread{
GameCanvasscr;
publicMyTimer(GameCanvasscr){
this.scr=scr;
}
@SuppressWarnings("deprecation")
publicvoidrun(){
while(true){
try{
sleep((10-ERS_Block.level+1)*100);
}
catch(InterruptedExceptione){}
if(!
scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
ERS_Block.isPlay=false;
suspend();
}else
scr.getBlock().reset();
}
}
}
}
classWinListenerextendsWindowAdapter{
publicvoidwindowClosing(WindowEventl){
System.exit(0);
}
}