java课程设计报告俄罗斯方块.docx
- 文档编号:23749460
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:22
- 大小:31KB
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;row for(intcol=0;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); 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;i if(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,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计 报告 俄罗斯方块