JAVA俄罗斯方块实验报告.docx
《JAVA俄罗斯方块实验报告.docx》由会员分享,可在线阅读,更多相关《JAVA俄罗斯方块实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
JAVA俄罗斯方块实验报告
四.总体设计2
五.系统结构图3
六.程序模块设计3
七、实验总结体会15
.需求分析
在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。
此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
二.系统运行环境
操作系统选择WindowsXP版本,运行环境选择MyEclipse
三.系统功能需求描述
俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。
本软件要实现的功能如下:
1.游戏区:
玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。
2.游戏控制:
玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。
3.级别设置:
玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏速度越快,难度越大。
四.总体设计
游戏中玩家可以做的操作有:
1.以90度为单位旋转方每一格块。
2.以格子为单位左右移动方块,让方块加速落下。
3.方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的随机图形会出现在区域上方开始落下。
4.当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分。
同时删除的列数越多,得分指数上升。
5.当固定的方块堆到区域最上方,则游戏结束
五•系统结构图
六•程序模块设计
6.1用户界面设计
开始游戏
6.2程序代码设计
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.0Author:
Vineent");
WindowListenerwin」istener=newWinListener();
ers.addWindowListener(win」istener);
}
//俄罗斯方块类的构造方法
@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;irepaint();
}
//重新刷新画布方法
publicvoidpaint(Graphicsg){for(inti=0;i}
//画方块的方法
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);
elsereturn(scrArr[row][col]);
}
//返回新块的初始行坐标方法publicintgetInitRow(){return(blockInitRow);//返回新块的初始行坐标}
//返回新块的初始列坐标方法publicintgetInitCol(){return(blockInitCol);//返回新块的初始列坐标}
//满行删除方法
voiddeleteFullLine(){intfull_line_num=0;
intk=0;
for(inti=0;iL1:
for(intj=0;jisfull=false;breakL1;
}if(isfull)full_line_num++;
if(k!
=0&&k-1!
=i&&!
isfull)for(intj=0;jelsedrawUnit(k-1,j,2);scrArr[k-1][j]=scrArr[i][j];
}
}for(inti=k-1;iscrArr[i][j]=0;
}
}ERS_Block.score+=full_line_num;
ERS_Block.scoreField.setText(""+ERS_Block.score);
}
//判断游戏是否结束方法booleanisGameEnd(){for(intcol=0;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;
}
//按钮执行方法@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;//intturnState;//intblockState;//
块的模式号(0-6)块的翻转状态(0-3)
快的下落状态
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{Game