java课程设计报告材料俄罗斯方块.docx
《java课程设计报告材料俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《java课程设计报告材料俄罗斯方块.docx(34页珍藏版)》请在冰豆网上搜索。
java课程设计报告材料俄罗斯方块
JAVA程序设计课程设计
之
俄罗斯方块
年级:
13级
班级:
T412网络工程
指导老师:
朱林
小组成员:
20138346021许浩洋
时间:
2015年11月11日
摘要
在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一。
俄罗斯方块(Tetris,俄文:
Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
为此,我们设计了一款简单的俄罗斯方块JAVA游戏程序,以便更好的满足广大电脑工作者闲暇之余的消遣,并且也让我们学到编程技术与团队意识。
关键字:
俄罗斯方块、JAVA游戏、编程
第1章课程设计要求
题目名称:
俄罗斯方块
题目类型:
设计型
课程设计目的:
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程序主要功能说明
1.面板画笔类
代码:
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.setDefaultCloseOperation(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.2.2方块类
代码:
packageTetris;
//代