java课程设计报告俄罗斯方块Word文档下载推荐.docx
《java课程设计报告俄罗斯方块Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《java课程设计报告俄罗斯方块Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
1)由方块组成的分歧的随机图形会从区域上方开端缓慢落下.
2)玩家可以做的操纵有:
以90度为单位旋转方每格块.
以格子为单位左右移动方块,让方块加速落下.
3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的随机图形会出现在上方开端落下.
4)当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分.
5)一次性销毁分歧行数方块得分分歧,一行1分,两行2分,三行5分,四行10分.
6)当固定的方块堆到区域最上方,则游戏竣事.
处理玩家操纵
2.2功能分析
2.2.1系统操纵界面
2.2.2程序主要功能说明
代码:
packageTetris;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.util.Arrays;
importjava.util.Timer;
importjava.util.TimerTask;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassTetrisPanelextendsJPanel{
//游戏主面板20行10列
privatestaticfinalintROWS=20;
privatestaticfinalintCOLS=10;
//代表方块着陆的墙
privateCell[][]wall=newCell[ROWS][COLS];
//定义每小块的大小
privatestaticfinalintCELL_SIZE=25;
//游戏得分
privateintscore;
//游戏销毁行数
privateintlines;
//一次性销毁行数的计分尺度(0行=0分,1行=1分,2行=4分,3行=10分,4行=20分)
privatestaticfinalint[]SCORE_LEVEL={0,1,4,10,20};
//游戏竣事标识表记标帜
privatebooleangameOver=false;
//游戏暂停标识表记标帜
privatebooleanpause=false;
//正在下落的四格方块
privateTetrominocurrentTetro;
//下一个下落的四格方块
privateTetrominonextTetro;
//定义游戏定时器
privateTimertimer;
publicstaticvoidmain(String[]args){
JFrameframe=newJFrame("
俄罗斯方块"
);
intwidth=(COLS+8)*CELL_SIZE+100;
intheight=ROWS*CELL_SIZE+100;
frame.setSize(width,height);
frame.setLocationRelativeTo(null);
frame.setDefaultClo搜索引擎优化peration(JFrame.EXIT_ON_CLOSE);
//取消系统默许规划
frame.setLayout(null);
TetrisPanelpanel=newTetrisPanel();
panel.setLocation(45,35);
panel.setSize((COLS+8)*CELL_SIZE,ROWS*CELL_SIZE+1);
frame.add(panel);
frame.setVisible(true);
panel.action();
}
publicvoidpaint(Graphicsg){
super.paint(g);
//填充布景颜色
this.paintBackground(g);
//绘制游戏墙
paintWall(g);
//绘制分数墙
paintScore(g);
//绘制面板边框
paintTetrisBorder(g);
//绘制当前四格方块
paintCurrentTetro(g);
//绘制下个四格方块
paintNextTetro(g);
//
privatestaticfinalintBG_COLOR=0xC3D5EA;
privatestaticfinalintBORDER_COLOR=0x667799;
privatestaticfinalintFONT_COLOR=0x000000;
//绘制布景的方法
publicvoidpaintBackground(Graphicsg){
g.setColor(newColor(BG_COLOR));
//this.setBackground(newColor(BG_COLOR));
g.fillRect(0,0,this.getWidth(),this.getHeight());
//绘制游戏墙的方法
publicvoidpaintWall(Graphicsg){
for(introw=0;
row<
ROWS;
row++){
for(intcol=0;
col<
COLS;
col++){
Cellcell=wall[row][col];
intx=col*CELL_SIZE;
inty=row*CELL_SIZE;
if(cell==null){
g.setColor(newColor(BORDER_COLOR));
g.drawRect(x,y,CELL_SIZE,CELL_SIZE);
}else{
g.setColor(newColor(cell.getColor()));
g.fillRect(x,y,CELL_SIZE,CELL_SIZE);
//绘制分数墙的方法
publicvoidpaintScore(Graphicsg){
intx=12*CELL_SIZE;
inty=6*CELL_SIZE;
Fontfont=newFont("
楷体"
Font.BOLD,23);
Stringmsg="
分数:
"
+score;
g.setColor(newColor(FONT_COLOR));
g.setFont(font);
g.drawString(msg,x,y);
y+=2*CELL_SIZE;
msg="
行数:
+lines;
if(gameOver){
(T_T)
【S】再来"
;
x-=CELL_SIZE;
}elseif(pause){
【C】继续"
【P】暂停"
//绘制面板边框的方法
publicvoidpaintTetrisBorder(Graphicsg){
g.drawRect(0,0,CELL_SIZE*(COLS+8)-1,CELL_SIZE*ROWS);
//绘制当前四格方块的方法
publicvoidpaintCurrentTetro(Graphicsg){
if(currentTetro==null){
//如果没有四格方块,则返回不绘画
return;
for(Cellcell:
currentTetro.cells){
introw=cell.getRow();
intcol=cell.getCol();
intx=col*CELL_SIZE;
inty=row*CELL_SIZE;
//绘制下个四格方块的方法
publicvoidpaintNextTetro(Graphicsg){
if(nextTetro==null){
nextTetro.cells){
intx=(col+9)*CELL_SIZE;
inty=(row+1)*CELL_SIZE;
//让四格方块动起来的方法
publicvoidaction(){
startGameAction();
//请求此容器获取输入核心
this.requestFocus();
this.addKeyListener(newKeyAdapter(){
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();
if(key==KeyEvent.VK_S){
if(pause){
if(key==KeyEvent.VK_C){
continueAction();
switch(key){
caseKeyEvent.VK_DOWN:
softDownAction();
break;
caseKeyEvent.VK_LEFT:
moveLeftAction();
caseKeyEvent.VK_RIGHT:
moveRightAction();
caseKeyEvent.VK_UP:
rotateRightAction();
caseKeyEvent.VK_SPACE:
hardDownAction();
caseKeyEvent.VK_P:
pauseAction();
repaint();
//暂停游戏的方法
privatevoidpauseAction(){
pause=true;
timer.cancel();
//继续游戏的方法
privatevoidcontinueAction(){
pause=false;
timer=newTimer();
timer.schedule(newTimerTask(){
publicvoidrun(){
},500,500);
});
//在游戏开端时调用或者【S】按下时调用
publicvoidstartGameAction(){
gameOver=false;
score=0;
lines=0;
//清空游戏主面板
emptyWall();
//生成下一个四格方块
nextTetromino();
//生成定时器对象
//启动定时器工作
//调用面板的四格方块下落方法(自由下落)
//重画面板
//清空游戏主面板方法
publicvoidemptyWall(){
for(introw=0;
//wall[row]这一行全部用null暗示
Arrays.fill(wall[row],null);
//生成(随机)下一个四格方块,1.下一个变成当前的.2.随机生成下一个.
publicvoidnextTetromino(){
//第一次nextTetro是null时就随机生成一个
nextTetro=Tetromino.randomTetromino();
//下一个四格方块当即变成当前四格方块
currentTetro=nextTetro;
//四格方块下落流程,方块移动到区域最下方或者移动到其他方块上则固定在此处.
//而新的四个方块则会出现在区域上方并开端下落且随机生成下一个四格方块
publicvoidsoftDownAction(){
if(canDown()){
//如果能下落则继续下落
currentTetro.softDown();
//不克不及下落则着陆到墙上
tetrominoLandToWall();
//每个四格方块着陆清除满行且计分
destroy();
//每个四格方块着陆需要检测游戏是否竣事
if(gameOver()){
//如果游戏竣事
gameOverAction();
//随机生成下一个四格方块
//检查方块是否可以继续下落(落到最底部或者墙上的下方有方块)
privatebooleancanDown(){
//检查是否到底部
Cell[]cells=currentTetro.cells;
cells){
if(cell.getRow()==ROWS-1){
returnfalse;
//检查次四格方块下方是否有方块
Cellblock=wall[row+1][col];
if(block!
=null){
returntrue;
//方块“着陆”到墙上,取出每个小方块找到对应的行号row和列号col,将cell小方块放到对应的wall[row][col]位置上
privatevoidtetrominoLandToWall(){
//将cell小方块放到对应的wall[row][col]位置上
wall[row][col]=cell;
//销毁满行的方法
privatevoiddestroy(){
//统计本次销毁的行数
intlines=0;
for(introw=0;
//断定此行是否是满行
if(fullCells(row)){
//清除此行
clearLine(row);
//每清除一行就累计加一
lines++;
//整个游戏面板每行断定之后要记录销毁行数与计分
score+=SCORE_LEVEL[lines];
this.lines+=lines;
//断定某一行是否填满cell小方块
privatebooleanfullCells(introw){
Cell[]line=wall[row];
for(inti=0;
i<
line.length;
i++){
if(line[i]==null){
//只要慈航有一个位置没有cell,就不是满行
//清除此行的方法,方法:
(依次将此行的上一行复制到下一行,第一行全部用null填充)
privatevoidclearLine(introw){
//循环将游戏面板中的每行复制到下一行
for(inti=row;
i>
=1;
i--){
//wall[row]=Arrays.copyOf(wall[row-1],COLS);
System.arraycopy(wall[row-1],0,wall[row],0,COLS);
//第一行全部用null填充
Arrays.fill(wall[0],null);
//检查游戏是否竣事(思路:
游戏主面板中第一行出现四个方块的区域有小方块cell在则游戏竣事)
privatebooleangameOver(){
gameOver=wall[0][3]!
=null||wall[0][4]!
=null;
returngameOver;
//清零游戏竣事现场(停止计时器)
privatevoidgameOverAction(){
//停止计时器
//以四格方块为单位左右移动的方法:
1.遇到左右鸿沟不克不及移动.2.遇到左右有方块不克不及移动.
//左移的方法
privatevoidmoveLeftAction(){
currentTetro.moveLeft();
if(outOfBounds()||coincide()){
currentTetro.moveRight();
//断定四格方块是否与墙上的方块重合的方法
privatebooleancoincide(){
//System.out.println(col+"
:
+row);
if(wall[row][col]!
=null){
//断定四格方块是否出鸿沟的方法
privatebooleanoutOfBounds(){
if(col<
0||col>
=COLS){
//右移的方法
privatevoidmoveRightAction(){
//四格方块加速下落的方法
privatevoidhardDownAction(){
//四格方块继续下落
while(canDown()){
//着陆到墙上
//清除满行并计分
//旋转流程节制
privatevoidrotateRightAction(){
currentTetro.rotateRight();
currentTetro.rotateLeft();
2.
//代表游戏中每个小格子方块
publicclassCell{
//小方块在游戏面板中的哪一行
privateintrow;
//小方块在游戏面板中的哪一列
privateintcol;
//小方块的颜色
privateintcolor;
publicCell(introw,int