JAVA课程设计俄罗斯方块的实现.docx
- 文档编号:12177015
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:35
- 大小:596.09KB
JAVA课程设计俄罗斯方块的实现.docx
《JAVA课程设计俄罗斯方块的实现.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计俄罗斯方块的实现.docx(35页珍藏版)》请在冰豆网上搜索。
JAVA课程设计俄罗斯方块的实现
课程设计报告
课程:
JAVA程序设计
学号:
1410211035
姓名:
班级:
2014级计算机科学与技术(专升本)班
教师:
时间:
2015.7.1
计算机学院
设计名称:
JAVA游戏课程设计——俄罗斯方块
设计内容、目的与要求:
设计内容:
实现正常的运行游戏(旋转、左右移动,下落)
设计目的:
(1)了解JAVA的基本使用方法;
(2)熟悉eclipse的运行环境;
(3)用JAVA面向对象的方法来设计一个俄罗斯方块的小游戏;
(4)基本实现俄罗斯方块的应用功能。
设计要求:
本次实验要能实现以下功能:
(1)游戏区:
玩家可以在游戏区中堆积方块,并能够在游戏的过程中随时了解得分情况。
(2)游戏控制:
玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏;
计划与进度安排:
2015年4月6号:
确定选题。
2015年4月8号:
系统需求分析与调研,搜集资料。
2015年4月10号-2015年4月14号:
确定设计流程与步骤。
2015年4月20号-2015年5月10号:
系统的详细设计与功能的实现。
设计过程、步骤(可加页):
1.系统需求分析
显示需求:
7个不同形状的方块通过旋转之后可以实现左、右、下的移动
键盘处理事件需求:
可通过键盘方向键(上键、下键、左键、右键)对下落方块进行向上(旋转变形)、向下(加速下落)、向左移动、向右移动。
(1)系统功能模块示意图:
(2)游戏区模块示意图:
(3)控制区模块示意图:
2.游戏区模块功能
(1)游戏区模块(创建游戏区,处理玩家操作,显示操作结果)
创建游戏区代码:
publicstaticvoidmain(String[]args){
JFrameframe=newJFrame();
Tetristetris=newTetris();
tetris.setBackground(newColor(0x0000ff));
frame.add(tetris);
frame.setSize(530,580);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
tetris.action();
}
显示操作结果:
privatevoidpaintScore(Graphicsg){
intx=290;
inty=160;
g.setColor(newColor(FONT_COLOR));
Fontfont=g.getFont();
font=newFont(font.getName(),font.getStyle(),FONT_SIZE);
g.setFont(font);
Stringstr="SCORE:
"+score;
g.drawString(str,x,y);
y+=56;
str="LINES:
"+lines;
g.drawString(str,x,y);
y+=56;
str="[P]Pause";
if(pause){
str="[C]Continue";
}
if(gameOver){
str="[S]Start!
";
}
g.drawString(str,x,y);
}
(2)游戏控制模块(开始游戏,暂停,继续,退出)
开始游戏:
publicvoidstartAction(){
pause=false;
gameOver=false;
score=0;
lines=0;
clearWall();
tetromino=Tetromino.randomOne();
nextOne=Tetromino.randomOne();
timer=newTimer();
timer.schedule(newTimerTask(){
publicvoidrun(){
softDropAction();
repaint();
}
},interval,interval);
}
暂停P:
{caseKeyEvent.VK_P:
pauseAction();
break;}
....
publicvoidpauseAction(){
timer.cancel();
pause=true;
}
继续C:
if(pause){
if(key==KeyEvent.VK_C){
continueAction();
repaint();
}
return;
}
退出Q:
if(key==KeyEvent.VK_Q){
System.exit(0);
}
3.游戏完成测试
(1)游戏打开界面
(2)游戏进行中界面
(4)J型格子正常下落(5)L型方格正常下落
(5)田字型方格正常下落(6)Z字型方格正常下落
(7)一字型正常下落
4.代码见附录(附录1,附录2,附录3)
结果与分析(可以加页):
1.游戏开始界面
游戏界面实现的功能项:
消除行所得分数SCORE,消除的行LINE,暂停P(继续C),暂停键P,退出键Q
2.游戏正常进行
通过键盘按键->,<-,向上(空格),向下对下落的方格进行左移,右移,下落,旋转
设计体会与建议:
java是一种面向对象的编程语言,具有可移植性高,安全,可靠等优点,最初设计时就是本着一次编写到处执行设计的。
可以开发各种应用程序和游戏,不过速度没有c++快。
经过一学期的Java课程设计学习,使我对java有了深入的了解,让我知道了java是如何使用,如何来开发系统等等。
java的功能比较完善,这使我很有兴趣来学习java,在学习中虽然有很多地方不理解,刚开始时觉得很乱,总是找不到头绪,让自己不知所措, 而且在学习中遇到了不少的麻烦,上课的时候总是有一些问题使自己跟不上老师所讲的的课程,这样使自己少学了不少的知识,还好学校安排了课程设计这门课,在这个时候我算是又重新学了java程序设计。
在这次课程设计的过程中有很多的地方不会,但通过问老师问同学、和查阅书籍来完成的了。
虽然自己遇到了少的困难,但是我很认真的学习,来对待自己。
刚开始开发这个俄罗斯方块作品的时候,存在不少分歧,虽然我们是参照参考书籍来做的,但还是有许多地方不合逻辑,最后通过不懈的努力,多次的研究,一一攻破,解决每一个问题,使作品更加的完善。
在开发作品的时候,游戏整体遇到了许多的麻烦,但是通过同学的帮助使作品逐步完成 。
通过这次课程设计让自己更加了解一下自己,充分的感觉到自身的不足,还有待进一步的学习。
附录代码
1.Cell.java
ackageaa;
importjava.awt.image.BufferedImage;
/**
*格子
*/
publicclassCell{
privateintrow;//格子的行
privateintcol;//格子的列
privateBufferedImageimage;//格子的贴图
publicCell(introw,intcol,BufferedImageimage){
super();
this.row=row;
this.col=col;
this.image=image;
}
publicintgetRow(){
returnrow;
}
publicvoidsetRow(introw){
this.row=row;
}
publicintgetCol(){
returncol;
}
publicvoidsetCol(intcol){
this.col=col;
}
publicBufferedImagegetImage(){
returnimage;
}
publicvoidsetImage(BufferedImageimage){
this.image=image;
}
publicvoiddrop(){
row++;
}
publicvoidmoveRight(){
col++;
}
publicvoidmoveLeft(){
col--;
row+","+col;}}
}
@Override//重写
publicString
toString()
}return
2.Tetris.java)
packageaa;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.awt.image.BufferedImage;
importjava.util.Arrays;
importjava.util.Timer;
importjava.util.TimerTask;
importjavax.imageio.ImageIO;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
/**
*俄罗斯方块
*/
publicclassTetrisextendsJPanel{
privateintscore;//分数
privateintlines;//销毁的行数
privateCell[][]wall;//背景墙
privateTetrominotetromino;//正在下落的四格方块
privateTetrominonextOne;//下一个四格方块
/**背景图片*/
privatestaticBufferedImagebackground;
privatestaticBufferedImageoverImage;
publicstaticBufferedImageT;
publicstaticBufferedImageS;
publicstaticBufferedImageI;
publicstaticBufferedImageL;
publicstaticBufferedImageJ;
publicstaticBufferedImageO;
publicstaticBufferedImageZ;
publicstaticfinalintROWS=20;//背景墙的行数
publicstaticfinalintCOLS=10;//背景墙的列数
//将图片素材,复制到com.tarena.tetris包中.
/**使用静态代码块加载静态的图片*/
static{
try{
//Tetris.class的同一个包中找"tetris.png"
background=ImageIO.read(Tetris.class.getResource("tetris.png"));
overImage=ImageIO.read(Tetris.class.getResource("game-over.png"));
T=ImageIO.read(Tetris.class.getResource("T.png"));
I=ImageIO.read(Tetris.class.getResource("I.png"));
S=ImageIO.read(Tetris.class.getResource("S.png"));
Z=ImageIO.read(Tetris.class.getResource("Z.png"));
J=ImageIO.read(Tetris.class.getResource("J.png"));
L=ImageIO.read(Tetris.class.getResource("L.png"));
O=ImageIO.read(Tetris.class.getResource("O.png"));
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*JPanelpaint()paint画重写paint()修改原有的绘制方法
**/
@Override
publicvoidpaint(Graphicsg){
//画背景,画墙,画正在下落的方块画下一个方块...
g.drawImage(background,0,0,null);
g.translate(15,15);//坐标系平移
paintWall(g);//画墙
paintTetromino(g);//绘制正在下落的方块
paintNextOne(g);//绘制下一个要下落的方块
paintScore(g);//绘制分数
if(gameOver){
g.drawImage(overImage,0,0,null);
}
}
/**在Tetris添加启动方法action()*/
publicvoidaction(){
wall=newCell[ROWS][COLS];
startAction();
//wall[2][2]=newCell(2,2,T);
tetromino=Tetromino.randomOne();
nextOne=Tetromino.randomOne();
//处理键盘按下事件,在按下按键时候执行下落方法
KeyAdapterl=newKeyAdapter(){
@Override
//key按键Pressed按下了
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();//[c]
if(key==KeyEvent.VK_Q){//Q表示退出
System.exit(0);//结束Java进程
}
if(gameOver){
if(key==KeyEvent.VK_S){//S表示开始
startAction();
repaint();
}
return;
}
if(pause){//pause=true
if(key==KeyEvent.VK_C){//C表示继续
continueAction();
repaint();
}
return;
}
switch(key){
caseKeyEvent.VK_DOWN:
//向下箭头表示下落
softDropAction();
break;
caseKeyEvent.VK_RIGHT:
//向右箭头表示右移
moveRightAction();
break;
caseKeyEvent.VK_LEFT:
//向左箭头表示左移
moveLeftAction();
break;
caseKeyEvent.VK_SPACE:
//空格键表示自由下落
hardDropAction();
break;
caseKeyEvent.VK_UP:
//向上箭头表示右旋转
rotateRightAction();
break;
caseKeyEvent.VK_P:
//按键盘上的P表示暂停
pauseAction();
break;
}
repaint();//再画一次!
}
};
//下落流程:
监听键盘事件->如果下箭头按下->
//执行下落算法tetromino.softDrop()->
//修改每个格子对象的数据->调用repaint()->
//尽快调用paint()->paint方法会根据当前的数据
//重新绘制界面->看到移动以后的方块了
//绑定事件到当前面板
this.requestFocus();
this.addKeyListener(l);
}
publicstaticfinalintFONT_COLOR=0x667799;
publicstaticfinalintFONT_SIZE=30;
/**
*绘制分数
*@paramg
*/
privatevoidpaintScore(Graphicsg){
intx=290;
inty=160;
g.setColor(newColor(FONT_COLOR));
Fontfont=g.getFont();//取得g当前字体
font=newFont(font.getName(),font.getStyle(),FONT_SIZE);
g.setFont(font);//更改了g的字体
Stringstr="SCORE:
"+score;
g.drawString(str,x,y);
y+=56;
str="LINES:
"+lines;
g.drawString(str,x,y);
y+=56;
str="[P]Pause";
if(pause){
str="[C]Continue";
}
if(gameOver){
str="[S]Start!
";
}
g.drawString(str,x,y);
}
/**
*绘制下一个要下落的方块
*
*@paramg
*/
privatevoidpaintNextOne(Graphicsg){
if(nextOne==null){
return;
}
//将每个格子的row,col换算为x,y然后贴图
Cell[]cells=nextOne.cells;
for(inti=0;i //i=0123 Cellcell=cells[i]; //cell每个格子 intx=(cell.getCol()+10)*CELL_SIZE; inty=(cell.getRow()+1)*CELL_SIZE; g.drawImage(cell.getImage(),x-1,y-1,null); } } /** *绘制正在下落的方块 * *@paramg */ publicvoidpaintTetromino(Graphicsg){ if(tetromino==null){ return; } //将每个格子的row,col换算为x,y然后贴图 Cell[]cells=tetromino.cells; for(inti=0;i //i=0123 Cellcell=cells[i]; //cell每个格子 intx=cell.getCol()*CELL_SIZE; inty=cell.getRow()*CELL_SIZE; g.drawImage(cell.getImage(),x-1,y-1,null); } } publicstaticfinalintCELL_SIZE=26; /**画墙*/ privatevoidpaintWall(Graphicsg){ for(introw=0;row Cell[]line=wall[row]; //line代表墙上的每一行 for(intcol=0;col Cellcell=line[col]; //cell代表墙上的每个格子 intx=col*CELL_SIZE; inty=row*CELL_SIZE; if(cell==null){ g.drawRect(x,y,CELL_SIZE,CELL_SIZE); }else{ g.drawImage(cell.getImage(),x-1,y-1,null); } //g.drawString(row+","+col,x,y+CELL_SIZE); } } } /**检查当前正在下落的方块是否出界了*/ privatebooleanoutOfBounds(){ Cell[]cells=tetromino.cells; for(inti=0;i Cellcell=cells[i];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 课程设计 俄罗斯方块 实现