java课程设计报告俄罗斯方块.docx
《java课程设计报告俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《java课程设计报告俄罗斯方块.docx(22页珍藏版)》请在冰点文库上搜索。
java课程设计报告俄罗斯方块
JAVA法式设计课程设计之迟辟智美创作
之
俄罗斯方块
年级:
13级
班级:
T412网络工程
指导老师:
朱林
小组成员:
20138346021许浩洋
时间:
2015年11月11日
摘要
在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的年夜量普及,人们生活节奏越来越快,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一.俄罗斯方块(Tetris,俄文:
Тетрис)是一款风靡全球的电视和掌上游戏机游戏,它由俄罗斯人发明,故得此名.俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行而且消除得分.由于上手简单、老少皆宜,从而家喻户晓,风靡世界.为此,我们设计了一款简单的俄罗斯方块JAVA游戏法式,以便更好的满足广年夜电脑工作者闲暇之余的消遣,而且也让我们学到编程技术与团队意识.
关键字:
俄罗斯方块、JAVA游戏、编程
第一章课程设计要求
题目名称:
俄罗斯方块
题目类型:
设计型
课程设计目的:
1)了解Java的基本使用方法.
2)熟悉eclipse的运行环境.
3)用JAVA来设计一个俄罗斯方块的小游戏.
4)基本实现俄罗斯方块的应用功能.
实验原理:
JAVA法式分析与设计、类的灵活运用、多态技术、模板技术、异常处置等.
实验内容:
本俄罗斯方块游戏是对随机给出分歧的形状(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)下落填充给定的区域,若填满一条便消失落,记分.若在游戏中各形状填满了给定区域,为输者.
第二章设计概要
2.1功能设计
本项目是为了实现俄罗斯方块的基本功能而设计的,基天性够到达俄罗斯方块的各种游戏性.项目需求分析如下:
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;rowfor(intcol=0;colCellcell=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);
g.setColor(newColor(BORDER_COLOR));
g.drawRect(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;
g.drawString(msg,x,y);
if(gameOver){
msg="(T_T)【S】再来";
y+=2*CELL_SIZE;
x-=CELL_SIZE;
g.drawString(msg,x,y);
}elseif(pause){
msg="【C】继续";
y+=2*CELL_SIZE;
g.drawString(msg,x,y);
}else{
msg="【P】暂停";
y+=2*CELL_SIZE;
g.drawString(msg,x,y);
}
}
//绘制面板边框的方法
publicvoidpaintTetrisBorder(Graphicsg){
g.setColor(newColor(BORDER_COLOR));
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;
g.setColor(newColor(cell.getColor()));
g.fillRect(x,y,CELL_SIZE,CELL_SIZE);
g.setColor(newColor(BORDER_COLOR));
g.drawRect(x,y,CELL_SIZE,CELL_SIZE);
}
}
//绘制下个四格方块的方法
publicvoidpaintNextTetro(Graphicsg){
if(nextTetro==null){
//如果没有四格方块,则返回不绘画
return;
}
for(Cellcell:
nextTetro.cells){
introw=cell.getRow();
intcol=cell.getCol();
intx=(col+9)*CELL_SIZE;
inty=(row+1)*CELL_SIZE;
g.setColor(newColor(cell.getColor()));
g.fillRect(x,y,CELL_SIZE,CELL_SIZE);
g.setColor(newColor(BORDER_COLOR));
g.drawRect(x,y,CELL_SIZE,CELL_SIZE);
}
}
//让四格方块动起来的方法
publicvoidaction(){
startGameAction();
//请求此容器获取输入焦点
this.requestFocus();
this.addKeyListener(newKeyAdapter(){
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();
if(gameOver){
if(key==KeyEvent.VK_S){
startGameAction();
}
return;
}
if(pause){
if(key==KeyEvent.VK_C){
continueAction();
}
return;
}
switch(key){
caseKeyEvent.VK_DOWN:
softDownAction();
break;
caseKeyEvent.VK_LEFT:
moveLeftAction();
break;
caseKeyEvent.VK_RIGHT:
moveRightAction();
break;
caseKeyEvent.VK_UP:
rotateRightAction();
break;
caseKeyEvent.VK_SPACE:
hardDownAction();
break;
caseKeyEvent.VK_P:
pauseAction();
break;
}
repaint();
}
//暂停游戏的方法
privatevoidpauseAction(){
pause=true;
timer.cancel();
}
//继续游戏的方法
privatevoidcontinueAction(){
pause=false;
timer=newTimer();
timer.schedule(newTimerTask(){
publicvoidrun(){
softDownAction();
repaint();
}
},500,500);
}
});
}
//在游戏开始时调用或者【S】按下时调用
publicvoidstartGameAction(){
gameOver=false;
pause=false;
score=0;
lines=0;
//清空游戏主面板
emptyWall();
//生成下一个四格方块
nextTetromino();
//生成按时器对象
timer=newTimer();
//启动按时器工作
timer.schedule(newTimerTask(){
publicvoidrun(){
//调用面板的四格方块下落方法(自由下落)
softDownAction();
//重画面板
repaint();
}
},500,500);
}
//清空游戏主面板方法
publicvoidemptyWall(){
for(introw=0;row//wall[row]这一行全部用null暗示
Arrays.fill(wall[row],null);
}
}
//生成(随机)下一个四格方块,1.下一个酿成以后的.2.随机生成下一个.
publicvoidnextTetromino(){
if(nextTetro==null){
//第一次nextTetro是null时就随机生成一个
nextTetro=Tetromino.randomTetromino();
}
//下一个四格方块立即酿成以后四格方块
currentTetro=nextTetro;
nextTetro=Tetromino.randomTetromino();
}
//四格方块下落流程,方块移动到区域最下方或者移动到其他方块上则固定在此处.
//而新的四个方块则会呈现在区域上方并开始下落且随机生成下一个四格方块
publicvoidsoftDownAction(){
if(canDown()){
//如果能下落则继续下落
currentTetro.softDown();
}else{
//不能下落则着陆到墙上
tetrominoLandToWall();
//每一个四格方块着陆清除满行且计分
destroy();
//每一个四格方块着陆需要检测游戏是否结束
if(gameOver()){
//如果游戏结束
gameOverAction();
}else{
//随机生成下一个四格方块
nextTetromino();
}
}
}
//检查方块是否能够继续下落(落到最底部或者墙上的下方有方块)
privatebooleancanDown(){
//检查是否究竟部
Cell[]cells=currentTetro.cells;
for(Cellcell:
cells){
if(cell.getRow()==ROWS-1){
returnfalse;
}
}
//检查次四格方块下方是否有方块
for(Cellcell:
cells){
introw=cell.getRow();
intcol=cell.getCol();
Cellblock=wall[row+1][col];
if(block!
=null){
returnfalse;
}
}
returntrue;
}
//方块“着陆”到墙上,取出每个小方块找到对应的行号row和列号col,将cell小方块放到对应的wall[row][col]位置上
privatevoidtetrominoLandToWall(){
Cell[]cells=currentTetro.cells;
for(Cellcell:
cells){
introw=cell.getRow();
intcol=cell.getCol();
//将cell小方块放到对应的wall[row][col]位置上
wall[row][col]=cell;
}
}
//销毁满行的方法
privatevoiddestroy(){
//统计本次销毁的行数
intlines=0;
for(introw=0;row//判断此行是否是满行
if(fullCells(row)){
//清除此行
clearLine(row);
//每清除一行就累计加一
lines++;
}
}
//整个游戏面板每一行判断之后要记录销毁行数与计分
score+=SCORE_LEVEL[lines];
this.lines+=lines;
}
//判断某一行是否填满cell小方块
privatebooleanfullCells(introw){
Cell[]line=wall[row];
for(inti=0;iif(line[i]==null){
//只要慈航有一个位置没有cell,就不是满行
returnfalse;
}
}
returntrue;
}
//清除此行的方法,方法:
(依次将此行的上一行复制到下一行,第一行全部用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(){
//停止计时器
timer.cancel();
}
//以四格方块为单元左右移动的方法:
1.遇到左右鸿沟不能移动.2.遇到左右有方块不能移动.
//左移的方法
privatevoidmoveLeftAction(){
currentTetro.moveLeft();
if(outOfBounds()||coincide()){
currentTetro.moveRight();
}
}
//判断四格方块是否与墙上的方块重合的方法
privatebooleancoincide(){
for(Cellcell:
currentTetro.cells){
intcol=cell.getCol();
introw=cell.getRow();
//System.out.println(col+":
"+row);
if(wall[row][col]!
=null){
returntrue;
}
}
returnfalse;
}
//判断四格方块是否出鸿沟的方法
privatebooleanoutOfBounds(){
for(Cellcell:
currentTetro.cells){
intcol=cell.getCol();
if(col<0||col>=COLS){
returntrue;
}
}
returnfalse;
}
//右移的方法
privatevoidmoveRightAction(){
currentTetro.moveRight();
if(outOfBounds()||coincide()){
currentTetro.moveLeft();
}
}
//四格方块加速下落的方法
privatevoidhardDownAction(){
//四格方块继续下落
while(canDown()){
currentTetro.softDown();
}
//着陆到墙上
tetrominoLandToWall();
//清除满行并计分
destroy();
if(gameOver()){
gameOverAction();
}else{
nextTetromino();
}
}
//旋转流程控制
privatevoidrotateRightAction(){
currentTetro.rotateRight();
if(outOfBounds()||coincide()){
currentTetro.rotateLeft();
}
}
}
2.
代码:
packageTetris;
//代表游戏中每一个小格子方块
publicclassCell{
//小方块在游戏面板中的哪一行
privateintrow;
//小方块在游戏面板中的哪一列
privateintcol;
//小方块的颜色
privateintcolor;
publicCell(introw,int