《Java程序设计》实训报告俄罗斯方块Word文档下载推荐.docx
- 文档编号:19923273
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:42
- 大小:70.20KB
《Java程序设计》实训报告俄罗斯方块Word文档下载推荐.docx
《《Java程序设计》实训报告俄罗斯方块Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《Java程序设计》实训报告俄罗斯方块Word文档下载推荐.docx(42页珍藏版)》请在冰豆网上搜索。
在构造方法中以随机的形式生成方块,同时提供了以下几种方法:
reset(),leftTurn(),leftMove(),rightMove(),fallDown(),assertValid(intt,ints,introw,intcol),dispBlock(ints)。
分别实现方块的重画、翻转、左移、右移、下落、同步显示等功能。
2.2、Command,处理控制类。
这是一个实现ActionListener接口的类,主要处理点击按钮事件。
类中定义了三个int型变量:
button_play,button_quit,button_pause,和一个boolean型的变量:
pause_resume,并赋值。
在GameArea类中通过事件响应,在按钮执行方法中调用其值,使用switch语句,根据不同按钮不同的值,来响应不同的事件。
2.3、GameArea,游戏界面类。
GameArea继承了JFrame,是俄罗斯方块的主要游戏界面。
这个类定义了GameSetting类的gameScr对象和ImagePanel类的imagepanel对象作为游戏区域面板和控制区域面板。
在游戏区域,主要是根据相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显示。
2.4、GameSetting,游戏画布类。
这个类生成的对象将作为游戏界面的方块下落区域,画布的设置为15行10列,当中的方格边长为30,类中还定义了一个二维数组int[][]scrArr作为屏幕数组,表示每一个方格。
游戏区域中每一个方格是否存在游戏方块是由该方格的值来决定的,如果该方格的值为1,则表示该方格中存在游戏方块;
如果该方格中的值为0,则表示该方格中不存在游戏方块,因此二维数组用于记录游戏区域中每个小方格的值。
此外,类中还定义了画方块的方法,根据不同的难度画出不同颜色的方块。
单击Play按钮时,系统调用initScr()方法,初始化屏幕,将屏幕数组清零。
当满足满行删除的条件时,系统调用deleteFullLine()方法,进行删行加分,而且每删除十行,难度自动增加一级,方块颜色改变,并在难度显示框中相应显示。
2.5、GameOver,游戏结束弹出提示框类。
当游戏结束时,系统弹出提示,包括玩家分数以及询问玩家要继续游戏还是退出。
2.6、Help,帮助类。
在游戏界面,按F1键,弹出提示窗口,获取帮助。
2.7、ImagePanel,背景图片类。
这个类继承了JPanel类,用来作为游戏界面中控制区域的容器,并添加图片。
2.8、JieMian,主界面类。
这个类继承了JPanel类,作为游戏的第一个界面,也是难度选择界面。
定义了9个单选按钮,当玩家未选任何难度就按Enter时,系统会弹出一个提示框,提示玩家先选难度再进入。
2.9、MyPanel,重写MyPanel类,使Panel的四周留空间。
2.10、MyTimer,定时线程类。
类中定义了一个run()方法,用sleep()函数实现方块下落的快慢,即调节难度。
2.11、PlayMidi,添加音乐类。
在游戏过程中添加背景音乐。
2.12、WinListener,关闭窗口类。
4.主要类的UML类图表示
1.Square
2.int[][]pattern
3.intSquareType
4.intSquareState
5.intblockState
6.introw,col
7.GameSettingscr
8.+voidreset()
9.+voidleftTurn()
10.+voidleftMove()
11.+voidrightMove()
12.+booleanfallDown()
13.booleanassertValid(intt,ints,introw,intcol)
14.+synchronizedvoiddispBlock(ints)
5.(Square类的UML类图表示)
15.GameSetting
16.intunitSize
17.introwNum
18.intcolumnNum
19.intmaxAllowRowNum
20.intSquareInitRo
21.intSquareInitCol
22.int[][]scrArr
23.Squareb
24.initScr()
25.+voidpaint(Graphicsg)
26.+voiddrawUnit(introw,intcol,inttype)
27.+SquaregetBlock()
28.+intgetScrArrXY(introw,intcol)
29.+intgetInitRow()
30.+intgetInitCol()
31.voiddeleteFullLine()
32.booleanisGameEnd()
33.+voidkeyPressed(KeyEvente)
三、详细设计:
1模型层设计
1)图形的产生
通过图形工厂类ShapeFactory的getShape(ShapeListenerlistener)方法随机产生方块的某种状态,这里运用了工厂设计模式,这种设计模式是为了实现高内聚低耦合而存在的,这种设计模式的通俗解释就是:
你想要一个产品,你需要让工厂给你生产一个,你要告诉工厂你要生产什么产品,就把你需要生产的这个产品当做参数传给工厂类的生产产品的方法,然后根据你传进来的产品,而决定工厂人生产什么产品,产生出来产品后,最后要返回您要的这个东西。
2)图形数据结购
定义一个4x4方阵,共16个小格。
用“0”和“1”来表示每个方格是绘制还是空白,由此可以组合出多种图形,如图所示:
其中图一表示为{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}
其中图二表示为{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}
其中图三表示为{0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0}
其中图四表示为{0,0,0,0,0,1,0,1,0,1,1,0,0,0,1,0}
方块的旋转是通过绘制4个方向的方块,在不同旋转角度显示不同方向的方块来完成的。
所以程序要控制方块的旋转方向,只要控制显示哪副图就可以了。
本游戏是用一个三维数组int[][][]shapes=newint[][][];
作为存储方块的数据结构来保存方块的28种状态的。
代码如下:
publicfinalstaticint[][]STYLES={//共28种状态
{0x0f00,0x4444,0x0f00,0x4444},//长条型的四种状态
{0x04e0,0x0464,0x00e4,0x04c4},//'
T'
型的四种状态
{0x4620,0x6c00,0x4620,0x6c00},//反'
Z'
{0x2640,0xc600,0x2640,0xc600},//'
{0x6220,0x1700,0x2230,0x0740},//'
7'
{0x6440,0x0e20,0x44c0,0x8e00},//反'
{0x0660,0x0660,0x0660,0x0660},//方块的四种状态
};
/*
*构造函数
*/
publicRussiaBlock(inty,intx,intlevel,intstyle){
this.y=y;
this.x=x;
this.level=level;
moving=true;
pausing=false;
this.style=style;
canvas=GameCanvas.getCanvasInstance();
boxes=newRussiaBox[ROWS][COLS];
intkey=0x8000;
for(inti=0;
i<
boxes.length;
i++)
for(intj=0;
j<
boxes[i].length;
j++){
booleanisColor=((style&
key)!
=0);
boxes[i][j]=newRussiaBox(isColor);
key>
>
=1;
}
display();
}
以下这段代码是3个子模块的代码,通过实例化按钮,标签,文本域,图形面板等,用add方法进行添加等,具体解释在代码中有体现
publicControlPanel(finalRussiaBlocksGamegame){
this.game=game;
/*
*图形界面部分
*/
setLayout(newGridLayout(3,1,0,4));
//设置控制面板布局方式为网格状布局
tipBlockPanel=newTipBlockPanel();
//新建一个图形界面面板中的子面板
tipPanel=newJPanel(newBorderLayout());
//设置为位置布局方式
tipPanel.add(newJLabel("
NextBlock:
"
),BorderLayout.NORTH);
//添加新的标签在子面板中,设置布局在北部
tipPanel.add(tipBlockPanel,BorderLayout.CENTER);
//添加tipblockpanel面板在子面板中
tipPanel.setBorder(border);
//显示统计面板模块
InfoPanel=newJPanel(newGridLayout(4,1,0,0));
//新建一个显示面板
//设置4行1列的网格状布局
levelField=newJTextField("
+RussiaBlocksGame.DEFAULT_LEVEL);
levelField.setEditable(false);
scoreField=newJTextField("
0"
);
//新建一个得分区域,并设置其值为0
scoreField.setEditable(false);
//文本区域不能被编辑
InfoPanel.add(newJLabel("
当前等级:
));
//信息面板添加新的标签内容为“当前等级”
InfoPanel.add(levelField);
//信息面板添加等级区域
当前分数:
//信息面板添加新的标签内容为“当前分数”
InfoPanel.add(scoreField);
//信息面板添加得分区域
InfoPanel.setBorder(border);
//显示功能按钮面板模块
buttonPanel=newJPanel(newGridLayout(3,1,0,0));
//新建一个按钮面板
//设置布局方式为网格状布局
//为3行1列
playButton=newJButton("
开始"
//添加开始按钮
pauseButton=newJButton("
暂停"
//添加暂停按钮
stopButton=newJButton("
停止"
//添加停止按钮
turnHarderButton=newJButton("
难一级"
//添加难一级按钮按钮功能未实现
turnEasilyButton=newJButton("
简单一级"
//添加简单一级按钮按钮功能未实现
//按钮面板添加功能按钮
buttonPanel.add(playButton);
//按钮面板添加开始按钮
buttonPanel.add(pauseButton);
//按钮面板添加暂停按钮
buttonPanel.add(stopButton);
//按钮面板添加停止按钮
//buttonPanel.add(turnHarderButton);
添加难一级按钮该功能未实现
//buttonPanel.add(turnEasilyButton);
添加简单一级按钮该功能未实现
buttonPanel.setBorder(border);
addKeyListener(newControlKeyListener());
//添加键盘监听事件
add(tipPanel);
add(InfoPanel);
add(buttonPanel);
四、运行调试与分析讨论:
4.1游戏演示
4.1游戏界面演示,如7
图7
4.2开始和结束控制菜单,如图8
图8
4.3游戏窗口控制菜单,如图9
图9
4.2系统测试
4.2.1快捷键测试
1.键盘按“Ctrl+N”
效果:
游戏开始
结果:
正常
2.键盘按“Ctrl+E”
游戏退出
4.2.2右侧快捷按钮测试
1.点击“开始”按钮
2.点击“暂停”按钮
游戏暂停
3.点击“停止”按钮
游戏重置
结果正常
4.2.3界面菜单选项的功能测试
1.“游戏”菜单的测试
点击“游戏”“新游戏”
游戏正常开始
2.点击“游戏”“Exit”
3.“窗口样式”菜单测试
1.点击“窗口样式”“Windows”
切换为Wingdows模式
2.点击“窗口样式”“Motif”
切换为Motif样式
3.点击“窗口样式”“Mentel”
切换为Mentel模式
4.2.4按键事件的功能测试
(1)方块移动测试
游戏过程中,点击“左、右、下”方向键
输出:
方块正常移动,不会移出边界
(2)方块反转测试
游戏过程中,点击向上方向键
方块无边界和障碍物阻挡的情况下可反转
4.2.5方块堆砌与消行测试
(1)当方块下落到最底面或与障碍物接触时
方块成功堆砌在底部
(2)当出现满行现象时
所有满行被消除,方块依次下移
4.2.6测试结果分析
经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。
五、设计体会与小结:
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.
回顾起课程设计,至今我仍感慨颇多,的确,在这一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
通过课程设计之后,把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的指导下,终于迎刃而解。
在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢
六、附录:
1、小组成员及分工情况
系(部):
信息工程系
专业班级:
软件
(1)班
学生姓名:
陈学烽
学号:
1011302101012
完成日期:
2011年12月28日
2、源代码
ControlPanel.java
/*
*虚拟的单个方格类,控制方格的颜色
classRussiaBoximplementsCloneable{
privatebooleanisColor;
publicRussiaBox(booleanisColor){
this.isColor=isColor;
*设置颜色
publicvoidsetColor(booleanisColor){
*返回颜色
publicbooleanisColorBox(){
returnisColor;
publicObjectclone(){
Objecto=null;
try{
o=super.clone();
}catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returno;
}
GameCanvas.java
//游戏中方块显示的画布类
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.border.*;
classGameCanvasextendsJPanel{
privateRussiaBox[][]boxes;
//定义小方块
privateintrows=20,cols=12;
//定义20行12列
privatestaticGameCanvascanvas=null;
privateintboxWidth,boxHeight;
//默认为零需要调用fanning函数设置
privateColorblockColor=Color.RED,bgColor=Color.LIGHT_GRAY;
//定义方块色为红色,背景为浅灰色
privateEtchedBorderborder=newEtchedBorder(EtchedBorder.RAISED,
Color.WHITE,newColor(148,145,140));
//边框颜色白色
*采用单件模式,构造函数私有
privateGameCanvas(){
boxes=newRussiaBox[rows][cols];
j++)
boxes[i][j]=newRussiaBox(false);
setBorder(border);
*获得GameCanvas实例
publicstaticGameCanvasgetCanvasInstance(){
if(canvas==null)
canvas=newGameCanvas();
returncanvas;
*设置画布的背景色
publicvoidsetBgColor(ColorbgColor){
this.bgColor=bgColor;
*获得画布的背景色
publicColorgetBgColor(){
returnbgColor;
*设置方块的颜色
publicvoidsetBlockColor(ColorblockColor){
this.blockColor=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计 Java 程序设计 报告 俄罗斯方块