俄罗斯方块Java课程设计.docx
《俄罗斯方块Java课程设计.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块Java课程设计.docx(39页珍藏版)》请在冰豆网上搜索。
俄罗斯方块Java课程设计
《面向对象程序设计》
课程设计报告
题目:
俄罗斯方块软件设计与实现
院(系):
信息科学与工程学院
专业班级:
计算机科学与技术1201班
******
学号:
*********11
******
2014年12月29日至2015年1月9日
华中科技大学武昌分校制
面向对象程序设计课程设计任务书
一、设计(调查报告/论文)题目
俄罗斯方块软件设计与实现
二、设计(调查报告/论文)主要内容
内容:
一款俄罗斯方块的游戏,玩家可控制掉落物的形状和位置,当一行垒满后会消除,玩家获得一定分数,当掉落物堆积到达顶部时,提示gameover,有窗口最大最小化的功能,设置掉落物和背景色,改变窗口模式,游戏中能够暂停、停止,提高降低难度。
基本功能与要求:
1.随机给出不同的形状,下落至填充给定的区域,若填满一条便消除,计分,达到一定分数时升级,设置不同难度等级,不同等级下落速度不同,可自行调节.
2.设计良好的用户接口,有关分数和难度等级的显示,方块在背景给定区域内运动和变形,能明显区分方块和背景
3.方块可以实现变形,绘制7种基本的图形
4.方块下落时,可以通过键盘进行操作,上,下,左,右分别对应操作:
变形,加速下落,左移,右移。
三、原始资料
1.《面向对象程序设计课程设计》指导书
2.耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
四、要求的设计(调查/论文)成果
1.课程设计报告
2.课程设计软件
五、进程安排
布置任务,查找数据、需求分析1天
总体设计1天
详细设计1.5天
编制源程序实现3.5天
测试与修改1天
撰写课设报告2天
六、主要参考数据
[1]张广彬.Java课程设计案例精编(第二版).北京:
清华大学出版社,2011.
[2]耿祥义.Java课程设计(第二版).北京:
清华大学出版社,2008.
[3]耿祥义.JAVA大学实用教程.北京:
清华大学出版社,2009.
[4]邹林达.陈国君Java2程序设计基础.北京:
清华大学出版社,2010.
[5]邹林达.Java2程序设计基础实验指导.北京:
清华大学,2010.
指导教师(签名):
20年月日
1需求与总体设计
1.1需求与设计目的
本系统俄罗斯方块是是一款小游戏,玩家可控制掉落物的形状和位置,当一行垒满后会消除,玩家获得一定分数,当掉落物堆积到达顶部时,提示gameover,有窗口最大最小化的功能,设置掉落物和背景色,改变窗口模式,游戏中能够暂停、停止,提高降低难度.
1.2总体设计
1.2.1ErsBlocksGame.java
游戏主类,继承自JFrame类,负责游戏的全局控制。
内含:
1.一个GameCanvas画布类的实例引用,
2.一个保存当前活动块(ErsBlock)实例的引用,
3.一个保存当前控制面板(ControlPanel)实例的引用;
1.2.2ControlPanel.java
控制面板类,继承自JPanel.上边安放预显窗口、等级、得分、控制按钮主要用来控制游戏进程。
1.2.3ErsBlock.java
块类,继承自线程类(Thread),由4*4个方格(ErsBox)构成一个块,控制块的移动、下落、变形等
1.2.4ErsBox.java
方格类,是组成块的基本元素,用自己的颜色来表示块的外观
1.2.5GameCanvas.java
画布类,内有<行数>*<列数>个方格类实例。
继承自JPanel类。
ErsBlock线程类动态改变画布类的方格颜色,画布类通过;检查方格颜色来体现ErsBlock块的移动情况。
1.3系统主要功能图
本游戏系统包含5个分类如图1-1所示:
图1-1
1.4主要类图
2详细设计
2.1ErsBlocksGame类
2.1.1成员变量与方法
ErsBlocksGame()//主游戏类的构造函数
reset()//游戏复位
isPlaying()//判断游戏是否还在进行
getCurBlock()//得到当前活动的块
getCanvas()//得到当前画布
playGame()//开始游戏
pauseGame()//暂停游戏
resumeGame()//让暂停中的游戏继续
stopGame()//停止游戏
getLevel()//得到当前游戏者设置的游戏难度
setLevel(intlevel)//让用户设置游戏难度
getScore()//得到游戏积分
getScoreForLevelUpdate()//得到自上次升级以来的游戏积分,升级以后,此积分清零
levelUpdate()//当分数累计到一定的数量时,升一次级
play()//游戏开始
reportGameOver()//报告游戏结束了
createMenu()//建立并设置窗口菜单
setWindowStyle(Stringplaf)//根据字符串设置窗口外观
checkFullLine()//检查画布中是否有全填满的行,如果有就删除之
isGameOver()//根据最顶行是否被占,判断游戏是否已经结束了
main()//程序入口函数
2.1.2详细类图
2.2ControlPanel类
2.2.1成员变量与方法
ControlPanel()//控制面板类的构造函数
setTipStyle()//设置预显窗口的样式
getLevel()//取得用户设置的游戏等级
setLevel()//让用户修改游戏难度等级
setPlayButtonEnable()//设置"开始"按钮的状态
reset()//重置控制面板
fanning()//重新计算TipPanel里的boxes[][]里的小框的大小
TipPanel()//预显窗口类构造函数
fanning()//根据窗口的大小,自动调整方格的尺寸
2.2.2详细类图
2.3ErsBlock类
2.3.1成员变量与方法
run()//线程类的run()函数覆盖,下落块,直到块不能再下落
moveLeft()//块向左移动一格
moveRight()//块向右移动一格
moveDown()块向下落一格
turnNext()//块变型
pauseMove()//暂停块的下落,对应游戏暂停
resumeMove()//继续块的下落,对应游戏继续
stopMove()//停止块的下落,对应游戏停止
earse()//将当前块从画布的对应位置移除,要等到下次重画画布时才能反映出来
display()//让当前块放置在画布的对应位置上,要等到下次重画画布时才能看见
2.3.2详细类图
2.4GameCanvas类
2.4.1成员变量和方法
setBackgroundColor()//设置游戏背景色彩
getBackgroundColor()//取得游戏背景色彩
setBlockColor()//设置游戏方块色彩
getBlockColor()//取得游戏方块色彩
getRows()//取得画布中方格的行数
getCols()//取得画布中方格的列数
getScore()//取得游戏成绩
getScoreForLevelUpdate()//取得自上一次升级后的积分
resetScoreForLevelUpdate()//升级后,将上一次升级以来的积分清0
fanning()//根据窗口的大小,自动调整方格的尺寸
reset()//重置画布,置积分为0
2.4.2详细设计
2.5ErsBox类
2.5.1成员方法与变量
isColorBox()//此方格是不是用前景色表现
setColor()//设置方格的颜色,
getSize()//得到此方格的尺寸
setSize()//设置方格的尺寸
Objectclone()//覆盖Object的Objectclone(),实现克隆
2.5.2详细设计
3编码实现
详细代码:
package俄罗斯方块;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.border.Border;
importjavax.swing.border.EtchedBorder;
publicclassErsBlocksGameextendsJFrame{
publicstaticvoidmain(String[]args){
newErsBlocksGame("RussiaBlocksby*******************");
}
publicfinalstaticintPER_LINE_SCORE=100;
publicfinalstaticintPER_LEVEL_SCORE=PER_LINE_SCORE*20;
publicfinalstaticintMAX_LEVEL=10;
publicfinalstaticintDEFAULT_LEVEL=5;
privateGameCanvascanvas;
privateErsBlockblock;
privatebooleanplaying=false;
privateControlPanelctrlPanel;
privateJMenuBarbar=newJMenuBar();
privateJMenu
mGame=newJMenu("游戏"),
mControl=newJMenu("控制"),
mWindowStyle=newJMenu("窗口风格"),
mInfo=newJMenu("信息");
privateJMenuItem
miNewGame=newJMenuItem("新游戏"),
miSetBlockColor=newJMenuItem("选择方块颜色"),
miSetBackColor=newJMenuItem("选择背景颜色"),
miTurnHarder=newJMenuItem("提高等级"),
miTurnEasier=newJMenuItem("降低等级"),
miExit=newJMenuItem("推出"),
miPlay=newJMenuItem("开始"),
miPause=newJMenuItem("暂停"),
miResume=newJMenuItem("继续"),
miStop=newJMenuItem("停止"),
miAuthor=newJMenuItem("作者:
计科1201_程伟"),
miSourceInfo=newJMenuItem("2014.java课程设计");
privateJCheckBoxMenuItem
miAsWindows=newJCheckBoxMenuItem("Windows"),
miAsMotif=newJCheckBoxMenuItem("Motif"),
miAsMetal=newJCheckBoxMenuItem("Metal",true);
/***主游戏类的构造函数,窗口标题*/
publicErsBlocksGame(Stringtitle){
super(title);
setSize(315,392);
DimensionscrSize=Toolkit.getDefaultToolkit().getScreenSize();
setLocation((scrSize.width-getSize().width)/2,
(scrSize.height-getSize().height)/2);
createMenu();
Containercontainer=getContentPane();
container.setLayout(newBorderLayout(6,0));
canvas=newGameCanvas(20,12);
ctrlPanel=newControlPanel(this);
container.add(canvas,BorderLayout.CENTER);
container.add(ctrlPanel,BorderLayout.EAST);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEventwe){
stopGame();
System.exit(0);
}
});
addComponentListener(newComponentAdapter(){
publicvoidcomponentResized(ComponentEventce){
canvas.fanning();
}
});
show();
canvas.fanning();
}
/***让游戏“复位”*/
publicvoidreset(){
ctrlPanel.reset();
canvas.reset();
}
publicbooleanisPlaying(){
returnplaying;
}
publicErsBlockgetCurBlock(){
returnblock;
}
publicGameCanvasgetCanvas(){
returncanvas;
}
publicvoidplayGame(){
play();
ctrlPanel.setPlayButtonEnable(false);
miPlay.setEnabled(false);
ctrlPanel.requestFocus();
}
publicvoidpauseGame(){
if(block!
=null)block.pauseMove();
ctrlPanel.setPauseButtonLabel(false);
miPause.setEnabled(false);
miResume.setEnabled(true);
}
publicvoidresumeGame(){
if(block!
=null)block.resumeMove();
ctrlPanel.setPauseButtonLabel(true);
miPause.setEnabled(true);
miResume.setEnabled(false);
ctrlPanel.requestFocus();
}
publicvoidstopGame(){
playing=false;
if(block!
=null)block.stopMove();
miPlay.setEnabled(true);
miPause.setEnabled(true);
miResume.setEnabled(false);
ctrlPanel.setPlayButtonEnable(true);
ctrlPanel.setPauseButtonLabel(true);
}
publicintgetLevel(){
returnctrlPanel.getLevel();
}
publicvoidsetLevel(intlevel){
if(level<11&&level>0)ctrlPanel.setLevel(level);
}
publicintgetScore(){
if(canvas!
=null)returncanvas.getScore();
return0;
}
publicintgetScoreForLevelUpdate(){
if(canvas!
=null)returncanvas.getScoreForLevelUpdate();
return0;
}
publicbooleanlevelUpdate(){
intcurLevel=getLevel();
if(curLevelsetLevel(curLevel+1);
canvas.resetScoreForLevelUpdate();
returntrue;
}
returnfalse;
}
privatevoidplay(){
reset();
playing=true;
Threadthread=newThread(newGame());
thread.start();
}
privatevoidreportGameOver(){
JOptionPane.showMessageDialog(this,"GameOver!
");
}
privatevoidcreateMenu(){
bar.add(mGame);
bar.add(mControl);
bar.add(mWindowStyle);
bar.add(mInfo);
mGame.add(miNewGame);
mGame.addSeparator();
mGame.add(miSetBlockColor);
mGame.add(miSetBackColor);
mGame.addSeparator();
mGame.add(miTurnHarder);
mGame.add(miTurnEasier);
mGame.addSeparator();
mGame.add(miExit);
mControl.add(miPlay);
mControl.add(miPause);
mControl.add(miResume);
mControl.add(miStop);
mWindowStyle.add(miAsWindows);
mWindowStyle.add(miAsMotif);
mWindowStyle.add(miAsMetal);
mInfo.add(miAuthor);
mInfo.add(miSourceInfo);
setJMenuBar(bar);
miPause.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_P,KeyEvent.CTRL_MASK));
miResume.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0));
miNewGame.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
stopGame();
reset();
setLevel(DEFAULT_LEVEL);
}
});
miSetBlockColor.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
ColornewFrontColor=
JColorChooser.showDialog(ErsBlocksGame.this,
"Setcolorforblock",canvas.getBlockColor());
if(newFrontColor!
=null)
canvas.setBlockColor(newFrontColor);
}
});
miSetBackColor.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
ColornewBackColor=
JColorChooser.showDialog(ErsBlocksGame.this,
"Setcolorforblock",canvas.getBackgroundColor());
if(newBackColor!
=null)
canvas.setBackgroundColor(newBackColor);
}
});
miTurnHarder.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
intcurLevel=getLevel();
if(curLevel}
});
miTurnEasier.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
intcurLevel=getLevel();
if(curLevel>1)setLevel(curLevel-1);
}
});
miExit.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
System.exit(0);
}
});
miPlay.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae){
playGame();