JAVA面向对象程序设计课程综合作业实验报告.docx
- 文档编号:29027255
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:17
- 大小:39.32KB
JAVA面向对象程序设计课程综合作业实验报告.docx
《JAVA面向对象程序设计课程综合作业实验报告.docx》由会员分享,可在线阅读,更多相关《JAVA面向对象程序设计课程综合作业实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
JAVA面向对象程序设计课程综合作业实验报告
JAVA面向对象程序设计课程综合作业
实验报告
一.设计目的
JAVA面向对象程序设计课程综合作业是在学生系统地学习了“JAVA面向对象程序设计课程”后,编写“俄罗斯方块游戏”雏形系统。
通过对一个实际问题的分析、设计与实现,将原理与应用相结合,使学生学会将书本知识用于解决实际问题,培养学生的动手能力;另一方面,使学生能深入理解和灵活掌握教学内容。
二.系统名称
简易俄罗斯方块游戏
三.系统功能需求
本游戏的主要工作是:
控制一个下落的方块,并尽量使用下落的方块填满一行或多行已存在的方格,并要避免方块层叠到游戏场景的顶部。
°不同类型的方块均由多个小方格组成,方块将一直自动下落,直到落在游戏场景底部或者已停住方块上面
°游戏玩家,可以控制下落方块左移、右移以及下移,也可以旋转方块
✧当一个方块停止下落时,要检查是否存在填满方格的行;若存在填满的行,则将其清除;清除一行则游戏玩家可获得一些分值
°当前方块层叠到游戏场景的顶部时,游戏结束。
四.系统实现功能
1、键盘实现功能:
2、菜单功能:
(1)方块变形:
上健
(1)分数栏;(5)方块右移按钮;
(2)方块左移:
左键
(2)游戏开始按钮;(6)方块下移按钮;
(3)方块右移:
右键(3)方块旋转按钮;
(4)方块下移:
下健(4)方块左移按钮;
3、控制功能:
(1)当前方块的左移、右移、下移、旋转;
(2)方块块不会超越边界,不会覆盖当前已经落下的方块;
(3)随机产生7种方块;
(4)实现方块自动下落;
(5)当游戏区域底行填满时进行消行;
(6)判断某一行是否填满;
(7)消行后记录分数
(8)判断游戏是否结束。
五.概要设计
详细描述出系统中定义了几个类,类之间的关系。
每个类定义了哪些数据成员和方法,数据成员和方法的功能是什么。
表1MainWindow类数据成员说明表
数据成员
数据类型
说明
默认值
rowCount
int
游戏区域行数
20
columnCount
int
游戏区域列数
15
squareWidth
int
方格宽度
20
squareHeight
int
方格高度
20
Score
int
分数
0
timerPeriod
long
时间周期
700
表2MainWindow类方法成员说明表
方法成员
返回值类型
说明
参数
MainWindow()
无
添加面板、分数标签、方块移动和旋转按钮。
无
canStepDown()
canDown
判断方块能否继续下移,实现方块不穿越游戏区域低端
无
canStepLeft()
canLeft
判断方块能否继续左移,实现方块不穿越游戏区域左端
无
canStepRight()
canRight
判断方块能否继续右移,实现方块不穿越游戏区域右端
无
canStepRotate()
canRotate
判断方块是否可以旋转,实现方块到区域边缘旋转不越界
无
clearFullRows()
无
判断是否满行并消除
无
clearRow
无
实现清除已满行
introwIndex
RowMoveDown
无
实现清除行后上面全部下移
无
isFullRow()
无
判断是否消行
IntrowIndex
gameOver()
无
判断是否结束游戏
无
keyPressed
无
重写KeyListener接口所有方法
KeyEvente
表3Square类数据成员说明表
数据成员
数据类型
说明
默认值
width
int
方格的宽度
20
height
int
方格的高度
20
locationX
int
方格位置的X坐标
100
locationY
int
方格位置的Y坐标
-20
foreColor
Color
方格颜色
Color.white
backColor
Color
方格所在容器的颜色
Color.black
表4Square类方法成员说明表
方法成员
返回值类型
说明
参数
draw
无
在locationX,locationY位置绘制宽为width,高为height的foreColor颜色方格
无
clear
无
在locationX,locationY位置绘制宽为width,高为height的backColor颜色方格从而实现清除功能
无
step
无
移动方格位置坐标
intxStepx轴方向移动步长,intyStepy轴方向移动步长
stepUp
无
上移方格一个方格位
无
stepDown
无
下移方格一个方格位
无
stepLeft
无
左移方格一个方格位
无
stepRight
无
右移方格一个方格位
无
setGraphics
无
设置方格绘制画布对象
Graphicsgraphics
setLocationX
无
设置方格位置坐标
intx
setLocationY
无
设置方格位置坐标
inty
表5Block类数据成员说明表
数据成员
数据类型
说明
默认值
squares[]
一维数组
数组长度:
4
表6Block类方法成员说明表
方法成员
返回值类型
说明
参数
blockDraw()
无
设置绘制方块对象
无
blockClear()
无
设置清除方块对象
无
表77个方块类方法成员说明表
方块类
方法成员
说明
参数
JShapeBlock
JShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
LineShapeBlock
LineShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
LShapeBlock
LShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
SquareBlock
SquareBlock()
设置该方块中各方格坐标
无
SShapeBlock
SShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
TShapeBlock
TShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
ZShapeBlock
ZShapeBlock()
设置该方块中各方格坐标
无
blockRotate()
旋转该方块
无
blockClear()
旋转前清除当前方块
无
blockDraw()
重新画旋转后方块
无
六.界面设计及功能实现
图1
图2
如上图1游戏界面,分别有游戏区域,分数标签和开始、旋转、左移、右移、下移按钮。
1、当鼠标点击开始时,随机产生一个方块然后自动下落
实现随机产生一个方块的代码如下:
intramd;
ramd=(int)(Math.random()*7);//随机产生方块
switch(ramd){
case0:
block=newJShapeBlock();break;
case1:
block=newLineShapeBlock();break;
case2:
block=newLShapeBlock();break;
case3:
block=newSquareBlock();break;
case4:
block=newTShapeBlock();break;
case5:
block=newSShapeBlock();break;
case6:
block=newZShapeBlock();break;
}
block.setGraphics(drawPanel.getGraphics());
block.blockDraw();
}
实现方块自由下落的代码:
publicclassGameTimerTaskextendsTimerTask{//线程,实现方块开始后自行下落
publicvoidrun()
{
if(canStepDown()){//判断方块是否可以下落
block.blockDown();}
else{//在背景二维数组里定义方块
for(inti=0;i { Squares=block.squares[i]; introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; gameFieldSquares[rowIndex][columnIndex]=s; } clearFullRows();//方块满行消除 gameOver(); intramd; ramd=(int)(Math.random()*7);//随机产生方块 switch(ramd){ case0: block=newJShapeBlock();break; case1: block=newLineShapeBlock();break; case2: block=newLShapeBlock();break; case3: block=newSquareBlock();break; case4: block=newTShapeBlock();break; case5: block=newSShapeBlock();break; case6: block=newZShapeBlock();break; } block.setGraphics(drawPanel.getGraphics()); block.blockDraw(); } } } 和 gameTimer=newTimer(); gameTimer.scheduleAtFixedRate(newGameTimerTask(),0,timerPeriod); 2、分数标签栏,当满行并消除后加10分,当同时消除两行时加100分,当同时消三行以上时加(行数*200)分。 实现代码如下: if(fullRowCount==1) { Score+=10; scoreTex.setText(Score+""); } elseif(fullRowCount==2){ Score+=100; scoreTex.setText(Score+""); } elseif(fullRowCount>2){ Score=Score+200*fullRowCount; scoreTex.setText(Score+""); } 2、界面中开始、旋转、左移、右移、下移按钮分别实现相应功能,同时实现了键盘监听旋转、左移、右移、下移功能和实现左、右、下移和旋转不越界功能。 键盘监听功能代码: publicvoidkeyPressed(KeyEvente){//重写KeyListener接口所有方法 inti=e.getKeyCode(); switch(i){ caseKeyEvent.VK_UP: if(this.canStepRotate())block.blockRotate();break; caseKeyEvent.VK_DOWN: if(canStepDown())block.blockDown();break; caseKeyEvent.VK_RIGHT: if(canStepRight())block.blockRigth();break; caseKeyEvent.VK_LEFT: if(canStepLeft())block.blockLeft();break; } } publicvoidkeyTyped(KeyEventa){ } publicvoidkeyReleased(KeyEventa){ 左、右、下移和旋转不越界代码: privatebooleancanStepDown() { booleancanDown=true; for(inti=0;i { Squares; s=block.squares[i]; if(s.getLocationY()>=(rowCount-1)*squareHeight){ canDown=false; break; } introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; if(gameFieldSquares[rowIndex+1][columnIndex]! =null) canDown=false; } returncanDown; } privatebooleancanStepLeft() { booleancanLeft=true; for(inti=0;i Squares=block.squares[i]; if(s.getLocationX()<=0) { canLeft=false; break; } introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; if(gameFieldSquares[rowIndex][columnIndex-1]! =null) canLeft=false; } returncanLeft; } privatebooleancanStepRight() { booleancanRight=true; for(inti=0;i Squares=block.squares[i]; if(s.getLocationX()>=(columnCount-1)*squareWidth) { canRight=false; break; } introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; if(gameFieldSquares[rowIndex][columnIndex+1]! =null) canRight=false; } returncanRight; } privatebooleancanStepRotate()//判断是否可以旋转 { booleancanRotate=true; for(inti=0;i { Squares; s=block.squares[i]; if(s.getLocationX()<20||s.getLocationX()>=(this.columnCount-1)*this.squareWidth||s.getLocationY()>=(this.rowCount-1)*this.squareHeight||s.getLocationY()<=0){ canRotate=false; break; } introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; if(gameFieldSquares[rowIndex][columnIndex+1]! =null) canRotate=false; } returncanRotate; } 3、如上图2当方块下落叠至顶端时弹出游戏失败。 实现游戏结束代码: privatevoidgameOver(){//判断游戏是否结束 for(inti=0;i if(gameFieldSquares[0][i]! =null){ gameTimer.cancel(); drawPanel.setVisible(false); } } 七.遇到问题及解决方案 问题1: 分数不能累加,因为将intScore=0分数的初始化放于clearFullRows()方法下,这样就如同每次消行后将分数置0,以至于每次消行后分数不能累加。 解决: 将intScore=0分数的初始化放在类的数据成员下,这样就不会每次消行后置0。 问题2: 方块穿越游戏区域,当方块落到底端时或当碰到下面一个方块时不能停止下落。 解决: 添加canStepDown()方法,判断方块是否继续下落,实现代码: privatebooleancanStepDown() { booleancanDown=true; for(inti=0;i { Squares; s=block.squares[i]; if(s.getLocationY()>=(rowCount-1)*squareHeight){ canDown=false; break; } introwIndex=s.getLocationY()/squareHeight; intcolumnIndex=s.getLocationX()/squareWidth; if(gameFieldSquares[rowIndex+1][columnIndex]! =null) canDown=false; } returncanDown; 问题3: 旋转越界 解决: 添加canStepRotate方法判断是否旋转可以旋转,实现代码: privatebooleancanStepRotate(){ booleancanStepRotate=false; if(canStepLeft()==true&&canStepRight()==true&&canStepDown()==true){ canStepRotate=true; } returncanStepRotate; } 但以上代码又出现了一个问题就是当方块到游戏区域边缘时就不能再旋转了,这个问题还没有找到解决方案,希望经过以后的学习能得到解决。 问题4: 当有一个方块正在下落时,点击开始按钮时当前下落方块就停止下落,然后出现一个新方块开始下落。 此问题应该是逻辑问题,但一直没有找到解决的方法,希望有机会得到老师的指教。 八.总结及展望 经过一个学期的学习,基本知识基本熟悉了,但总觉得这门课程还是有只脚没有踏进去,个人觉java还是比较难的,但比起其他编程课程,我对java还是比较感兴趣的,我会在以后的课外时间多学习java知识,我的目标是大四时的毕业设计就用java完成一个令自己,老师满意的毕业设计。 此次的程序只是简单的实现了方块的旋转、左移、右移、下移、满行消除和分数记录以及键盘监听和鼠标监听,但还有很多想实现但因为还有一只脚还没有踏入java的门知识不够而未能实现的功能,比如: 暂停、继续、升级、最高分记录、一键到底、随机变换颜色等等。 希望在今后的自我学习中这些问题能够得到解决,为我的目标打好基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 面向 对象 程序设计 课程 综合 作业 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)