11积木游戏的设计Word文档格式.docx
《11积木游戏的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《11积木游戏的设计Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
2.运行环境6
4.模块分析7
4.1主界面模块7
4.2方块的各种形状模块9
4.3画布的设计模块10
4.4块的操作设计模块11
4.5消除行的模块13
5.系统测试15
6.结论19
致谢20
参考文献21
摘要
近来,随着计算机的快速发展,以计算机作为对战平台,各种游戏如雨后春笋般纷纷冒出,俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·
帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
Java是面向对象的编程语言。
面向对象技术较好地适应了当今软件开发过程中新出现的种种传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维护量增大经及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。
面向对象技术的核心是以更接近人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、继承;
这种方法非常有利于提高程序的可维护性和可重用性,大大提高了开发效率和程序的可管理性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。
本程序用java语言,实现了一个简单的俄罗斯方块。
关键字:
俄罗斯方块、JAVA、
1引言
1.1问题的提出
电子游戏机产生于20世纪70年代。
1971年,麻省理工学院的学生NolanBushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。
这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。
但是最后他在电子游戏的发展上取得了非凡的成就。
上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。
在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。
这个程序被公认为是最早的电脑游戏程序
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·
1.2国内外研究的现状
近来,随着计算机的快速发展,小方块的魅力经久不衰。
截至2009年,俄罗斯方块发售了1.25亿份,受到50多个国家和地区的玩家喜爱,有超过50种语言的版本,运行在几十种游戏平台上,从掌机、街机、个人电脑,到手机和PDA。
罗杰斯说,移动设备已经成为俄罗斯方块新的主要平台,该领域的发售量已超过7500万份,并且还在快速增长。
在俄罗斯方块网络版的北美和欧洲官方网站上,每天超过100万人次玩这个游戏。
俄罗斯方块获得许多奖励,在多项评选中被评为最经典游戏之一。
它还创造了一些世界纪录,比如它是在最多平台上运行的视频游戏,也是直接连累玩家坐牢时间最长的游戏。
2002年,一名过分沉迷的英国玩家不听机组人员的劝阻,在飞机上用手机玩俄罗斯方块,结果被判刑入狱4个月。
俄罗斯方块成功的奥妙在哪里?
它的创造者帕基特诺夫认为,可能在于这个游戏非常简单,而且拼图的过程有“从混乱中寻找秩序”的成就感。
罗杰斯则说,俄罗斯方块是一个建设性的游戏,这一点与中国的围棋相似,“国际象棋就是杀杀杀,围棋则重视构建领地,是建设性的,俄罗斯方块也是”。
25年过去了,电脑业和电子游戏业都发生了巨大变化,拥有华丽画面、震撼音效和丰富剧情的大型游戏包括网络游戏纷纷出现,开辟并占据了新的市场。
俄罗斯方块这样的游戏还有前途吗?
帕基特诺夫认为还很有前途。
他说,俄罗斯方块是一个休闲游戏,它面对的是那些没有精力或兴趣玩大型游戏的玩家,这些人需要一类简单好玩的游戏,拿起来就能进入状态,在忙碌的生活中寻求片刻放松。
帕基特诺夫表示,将对俄罗斯方块进行改进,使人们能够更容易从中获得休闲乐趣。
罗杰斯说,今后的努力方向包括发展俄罗斯方块的竞技性,开发能够适应玩家特点的“智能”俄罗斯方块,并使来自世界各地、说不同语言的人们能够一起娱乐,通过这个游戏寻求共同点。
对于中国市场,罗杰斯说,他正在与中国腾讯公司商谈,研究将俄罗斯方块集成到即时通讯软件QQ中去的事宜。
他还将参加今年7月份举行的中国国际数码互动娱乐展览会,与联众等中国游戏企业探讨合作前景。
1.4任务与分析
1.设计内容:
设计完成一个多情况积木游戏。
2.设计要求:
(1)完成积木为矩形块,区间是矩形的设计;
(2)完成积木为矩形块,T形块、L形块,区间是矩形的设计;
(3)完成积木为矩形块,T形块、L形块,区间是凸边形的设计;
(4)完成积木为矩形块,T形块、L形块,区间是矩形的设计;
(5)积木为矩形块,T形块、L形块,区间是口袋的设计;
2.总体设计方案
2.1算法设计
2.1.1总体框架图
根据分析,积木游戏这个程序一共要实现如下几个功能,开始游戏、游戏的暂停\继续、游戏控制和退出游戏。
其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。
暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。
程序结构如图2-1-1所示。
图2-1-1整体框架图
2.1.2程序流程图
根据分析后的程序结构图设计出相应的流程图。
积木游戏的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;
根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。
下落方块满一行时,消去该行,根据消去行数得到相应分数,如图2-1-2所示:
图2-1-2具体流程图
3程序运行平台
1.开发环境
●AMD4600+42.0GHz,1G内存,160G硬盘
●Microsoft®
Windows™XPProfessional
●语言:
JAVA
●平台:
Eclipse
2.运行环境
●Intel®
Pentium®
2及以上处理器,32M以上内存,4G以上硬盘
Windows™9X/NT操作系统
●800*600或以上的屏幕分辨率
4.模块分析
4.1主界面模块
该模块设计思想是:
定义一个类实现主界面,在主窗口分成两份,左边画布类,右边添加开始、分数、暂停、退出按钮。
//俄罗斯方块类的构造方法
ERS_Block(Stringtitle){
super(title);
setSize(600,480);
setLayout(newGridLayout(1,2));
gameScr=newGameCanvas();
gameScr.addKeyListener(gameScr);
timer=newMyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
PanelrightScr=newPanel();
rightScr.setLayout(newGridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
//右边信息窗体的布局
MyPanelinfoScr=newMyPanel();
infoScr.setLayout(newGridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
//定义标签和初始值
Labelscorep=newLabel("
分数:
"
Label.LEFT);
Labellevelp=newLabel("
级数:
scoreField=newTextField(8);
levelField=newTextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(newDimension(20,60));
scoreField.setSize(newDimension(20,60));
levelp.setSize(newDimension(20,60));
levelField.setSize(newDimension(20,60));
scoreField.setText("
0"
);
levelField.setText("
1"
//右边控制按钮窗体的布局
MyPanelcontrolScr=newMyPanel();
controlScr.setLayout(newGridLayout(5,1,0,5));
rightScr.add(controlScr);
//定义按钮play
Buttonplay_b=newButton("
开始游戏"
play_b.setSize(newDimension(50,200));
play_b.addActionListener(newCommand(Command.button_play,gameScr));
//定义按钮LevelUP
Buttonlevel_up_b=newButton("
提高级数"
level_up_b.setSize(newDimension(50,200));
level_up_b.addActionListener(newCommand(Command.button_levelup,gameScr));
//定义按钮LevelDown
Buttonlevel_down_b=newButton("
降低级数"
level_down_b.setSize(newDimension(50,200));
level_down_b.addActionListener(newCommand(Command.button_leveldown,gameScr));
//定义按钮LevelPause
Buttonpause_b=newButton("
游戏暂停"
pause_b.setSize(newDimension(50,200));
pause_b.addActionListener(newCommand(Command.button_pause,gameScr));
//定义按钮Quit
Buttonquit_b=newButton("
退出游戏"
quit_b.setSize(newDimension(50,200));
quit_b.addActionListener(newCommand(Command.button_quit,gameScr));
controlScr.add(play_b);
controlScr.add(level_up_b);
controlScr.add(level_down_b);
controlScr.add(pause_b);
controlScr.add(quit_b);
setVisible(true);
gameScr.requestFocus();
}
}
4.2方块的各种形状模块
这个实现了方块的各种形状,初始化的时候是随机生成方块的形状:
staticint[][]pattern={
{0x0f00,0x4444,0x0f00,0x4444},//用十六进至表示,本行表示长条四种状态
{0x04e0,0x0464,0x00e4,0x04c4},//|-
{0x4620,0x6c00,0x4620,0x6c00},//反Z
{0x2640,0xc600,0x2640,0xc600},//Z
{0x6220,0x1700,0x2230,0x0740},//7
{0x6440,0x0e20,0x44c0,0x8e00},//L
{0x0660,0x0660,0x0660,0x0660}//田
};
intblockType;
//块的模式号(0-6)
intturnState;
//块的翻转状态(0-3)
intblockState;
//快的下落状态
introw,col;
//块在画布上的坐标
GameCanvasscr;
//块类的构造方法
Block(GameCanvasscr){
this.scr=scr;
blockType=(int)(Math.random()*1000)%7;
turnState=(int)(Math.random()*1000)%4;
blockState=1;
row=scr.getInitRow();
col=scr.getInitCol();
4.3画布的设计模块
定义一个类(classGameCanvasextendsCanvasimplementsKeyListener)这个类中画当前的方块状态,当生成一个随机块后需要对块进行在画布上画,采用了一个线程,每隔N毫秒之后画一次当前画布上的所有块:
(关键代码):
//画方块的方法
publicvoiddrawUnit(introw,intcol,inttype){
scrArr[row][col]=type;
Graphicsg=getGraphics();
switch(type){//表示画方快的方法
case0:
g.setColor(Color.black);
break;
//以背景为颜色画
case1:
g.setColor(Color.blue);
//画正在下落的方块
case2:
g.setColor(Color.magenta);
//画已经落下的方法
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true);
g.dispose();
//定时线程
classMyTimerextendsThread{
publicMyTimer(GameCanvasscr){
publicvoidrun(){
while(true){
try{
sleep((10-ERS_Block.level+1)*100);
catch(InterruptedExceptione){}
if(!
scr.getBlock().fallDown()){
scr.deleteFullLine();
if(scr.isGameEnd()){
ERS_Block.isPlay=false;
suspend();
}else
scr.getBlock().reset();
}
4.4块的操作设计模块
当把块画出来了之后,就需要添加对键盘的操作监听模块(方向键:
向上键实现对块的翻转,向左键实现对块的向左移动,向右键实现对块的向右移动,向下键实现对块的加速下落):
//处理键盘输入的方法
publicvoidkeyPressed(KeyEvente){
ERS_Block.isPlay)
return;
switch(e.getKeyCode()){
caseKeyEvent.VK_DOWN:
b.fallDown();
caseKeyEvent.VK_LEFT:
b.leftMove();
caseKeyEvent.VK_RIGHT:
b.rightMove();
caseKeyEvent.VK_UP:
b.leftTurn();
//实现“块”翻转的方法
publicvoidleftTurn(){
if(assertValid(blockType,(turnState+1)%4,row,col)){
dispBlock(0);
turnState=(turnState+1)%4;
dispBlock
(1);
//实现“块”的左移的方法
publicvoidleftMove(){
if(assertValid(blockType,turnState,row,col-1)){
col--;
//实现块的右移
publicvoidrightMove(){
if(assertValid(blockType,turnState,row,col+1)){
col++;
//实现块落下的操作的方法
publicbooleanfallDown(){
if(blockState==2)
return(false);
if(assertValid(blockType,turnState,row-1,col)){
row--;
return(true);
}else{
blockState=2;
dispBlock
(2);
4.5消除行的模块
当块下落后要实现对所有的行遍历,如果一行的颜色都是一样的,着对当前的行记录,如果有一行或多行,则全部消除。
//满行删除方法
voiddeleteFullLine(){
intfull_line_num=0;
intk=0;
for(inti=0;
i<
rowNum;
i++){
booleanisfull=true;
L1:
for(intj=0;
j<
columnNum;
j++)
if(scrArr[i][j]==0){
k++;
isfull=false;
breakL1;
if(isfull)full_line_num++;
if(k!
=0&
&
k-1!
=i&
!
isfull)
for(intj=0;
j<
columnNum;
j++){
if(scrArr[i][j]==0)
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j]=scrArr[i][j];
for(inti=k-1;
i<
rowNum;
i++){
drawUnit(i,j,0);
scrArr[i][j]=0;
ERS_Block.score+=full_line_num;
ERS_Block.scoreField.setText("
+ERS_Block.score);
}
for(intj=0;
11;
j++){//竖
if(chess[x][j]==temp&
chess[x][j+1]==temp
&
chess[x][j+2]==temp&
chess[x][j+3]==temp
chess[x][j+4]==temp){
returntrue;
}
5.系统测试
1.运行Eclipse,打开ERS_Block.java文件,点击运行,出现主界面:
图5-1主界面
2.点击开始游戏按钮,则可以开始游戏(游戏界面会出现各种形状的方块):
图5-2各种形状的方块
3.、当有一行或多行的块的颜色相同,则消除该行,并更新分数:
图5-3行消除前图5-4行消除后
6.结论
首先我对Java游戏开发只是停留在理论知识的水平上,是“纸上谈兵”,缺乏实际的软件开发经验。
这次通过做毕业设计,我完成了俄罗斯游戏的软件开发任务。
在整个开发过程中遇到了很多问题,如方块的装载和变形、屏幕太闪烁的问题、满行判断及消行的处理。
但最终都被我一一解决,对其中比较主要的几点体会总结如下。
第一,为了熟悉俄罗斯方块的相关运作,我经常在玩街机和游戏机上的俄罗斯方块,慢慢去发现它所有的功能,然后再思考和查阅资料进行分析,经过逐步的设计与反复的修改论证,才完成了整个游戏的开发。
第二,完成了从“小而全”,到“全而精”的转变。
设计过程中,经常会遇到困难,我学会通过反复思考和测试,然后