java俄罗斯程序方块直接编译运行 小游戏.docx
《java俄罗斯程序方块直接编译运行 小游戏.docx》由会员分享,可在线阅读,更多相关《java俄罗斯程序方块直接编译运行 小游戏.docx(19页珍藏版)》请在冰点文库上搜索。
java俄罗斯程序方块直接编译运行小游戏
//俄罗斯方块——java源代码提供
importjava.awt.*;
importjava.awt.event.*;
//俄罗斯方块类
publicclassERS_BlockextendsFrame{
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);
}
//俄罗斯方块类的构造方法
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
{
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;ifor(intj=0;jscrArr[i][j]=0;//originalscrArr[j]=0;
b.reset();
repaint();
}
//重新刷新画布方法
publicvoidpaint(Graphicsg)
{
for(inti=0;ifor(intj=0;jdrawUnit(i,j,scrArr[i][j]);//originalscrArr[j]=0;
}
//画方块的方法
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;i{
booleanisfull=true;
L1:
for(intj=0;jif(scrArr[i][j]==0)//originallyscrArr[j]==0
{
k++;
isfull=false;
breakL1;
}
if(isfull)full_line_num++;
if(k!
=0&&k-1!
=i&&!
isfull)
for(intj=0;j{
if(scrArr[i][j]==0)//originallyscrArr[j]==0
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j]=scrArr[i][j];//originallyscrArr[j]==0
}
}
for(inti=k-1;i{
for(intj=0;j{
drawUnit(i,j,0);
scrArr[i][j]=0;//originallyscrArr[j]==0
}
}
ERS_Block.score+=full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
//判断游戏是否结束方法
booleanisGameEnd()
{
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_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;
}
//按钮执行方法
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;
}
}
}
}//endofclassBlock
//定时线程
classMyTimerextendsThread
{
GameCanvasscr;
publicMyTimer(GameCanvasscr)
{
this.scr=scr;
}
publicvoidrun()
{
while(true)
{
try
{
sleep((10-ERS_Block.level+1)*100);
}
catch(InterruptedExceptione)