俄罗斯方块游戏设计Java版Word文档格式.docx
- 文档编号:22240535
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:22
- 大小:265.75KB
俄罗斯方块游戏设计Java版Word文档格式.docx
《俄罗斯方块游戏设计Java版Word文档格式.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块游戏设计Java版Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
finalintsp_WIDTH=20;
//游戏空间宽(单位:
小正方格)
finalintsp_HIGHT=20;
//游戏空间高(单位:
finalinttypes[][][]={
{{-1,0},{0,0},{1,0},{2,0}},
{{-1,0},{0,0},{1,0},{1,-1}},
{{-1,0},{0,0},{1,0},{0,-1}},
{{-1,0},{0,0},{1,0},{-1,-1}}
};
/*四种基本方块的相对坐标*/
//游戏核心数据
intblock_box[][]=newint[4][2];
/*四个正方形的坐标(相对方块中心点)*/
intblock_cx,block_cy;
/*方块中心点在游戏空间中的坐标(相对游戏空间左上角点)*/
intblock_type;
/*方块类属(上图中四种分别为0,1,2,3)*/
intgamespace[][]=newint[sp_HIGHT][sp_WIDTH];
/*空间数据*/
//游戏的其它属性
intm_score=0;
/*游戏得分*/
intm_speed=500;
/*控制游戏,单位:
1/1000秒/步*/
booleanisplaying=false;
/*是否在游戏中*/
publicRussionBlockGame()//构造函数
{…………}
voidmakenewblock(){}//随机生成新的方块数据
voidmovedown(){}/*下移动方块*/
voidmoveleft(){}/*左移动方块*/
voidmoveright(){}/*右移动方块*/
voidturnleft(){}/*左转动方块*/
voidturnright(){}/*右转动方块*/
booleanIsCanChangeTo(intcx,intcy,intbox[][])//判断方块能否走到这位置
booleanIsHitBottom()//判断当前方块是否已触底,并处理
booleanCheckAndCutLine(intLn)/*查某行是否为全填充,如是,消掉并返回true*/
booleanIsGameOver(){}/*true---结束false--没有结束*/
}
classGameWinextendsJFrame
Clolorspacecolor;
//游戏空间背景色
//为增强程序的灵活性,游戏空间坐标、方块尺寸等,可以定义为常变量
finalintORINA_X=100//游戏空间左上角的屏幕坐标X(单位:
象素)
finalintORINA_Y=50//游戏空间左上角的屏幕坐标Y(单位:
finalintBOXSIZE=20//小正方格大小尺寸(单位:
……………….
publicclassTimerRunerimplementsRunnable
………
publicvoidrun()
{
………..
}
二、详细设计
1.俄罗斯方块形状
方块总共有四种基本形,其它形状可由这四种基本形通过旋转得到,如下图:
在程序中,我们是可以用下面变量来描述它们,如下:
finalintboxtypes[4][4][2]={
intbox[4][2];
/*四个正方形的坐标(相对方块中心点)*/
intcx,cy;
/*方块中心点在游戏空间中位置的坐标(相对游戏空间左上角点)*/
inttype;
随机生成新的方块:
voidmakenewblock()//随机生成新的方块数据
block_type=(int)(Math.random()*100)%4;
//产生一个1-4的随机数
for(inti=0;
i<
4;
i++)
block_box[i]=types[block_type][i];
block_cx=sp_WIDTH/2;
block_cy=0;
2.俄罗斯方块的变换(关键算法,同学们自已考虑):
移动、旋转
用户使用← → ↓箭头键来移动方块,移动方式有3种:
左移一格、右移一格、下移一格,对应的俄罗斯方块坐标变换公式如下:
左移一格:
cx1=cx0-1,cy1=cy0
右移一格:
cx1=cx0+1,cy1=cy0
下移一格:
cx1=cx0,cy1=cy0+1
用户使用a、d键来旋转方块,旋转方式有两种:
左转(a键)和右转(d键)
左转90度(逆时针):
每个正方形的坐标变换公式为:
y1=x0,x1=-y0.
右转90度(顺时针):
y1=-x0,x1=y0.
方块变换程序流程:
用变换公式计算变换后的方块中心坐标、各正方正形相对坐标,调用IsCanChangeTo(),判断是否能移到此位置,如能则更新方块坐标。
如下右转90度(顺时针):
voidturnright()/*右转动方块(顺时针)*/
//保存变换后坐标的变量
intbox[][]=newint[4][2];
cx=block_cx;
cy=block_cy;
//中心位置不变
for(inti=0;
i++)//计算变换后的各正方形坐标
box[i][0]=block_box[i][1];
//用公式x1=y0计算正方形的x坐标
box[i][1]=-block_box[i][0];
//用公式y1=-x0计算正方形的y坐标
if(IsCanChangeTo(cx,cy,box)){//如果能变换到些位置,则更新方块的坐标数据
block_cx=cx;
block_cy=cy;
//中心位置不变
block_box=box;
3.游戏空间
游戏空间可以看成由sp_WIDTH×
sp_HIGHT个正方形小格子构成,每格子都有一个相对于左上角的坐标。
可以用一个sp_WIDTH×
sp_HIGHT的二维数组表示游戏空间。
如下:
intgamespace[sp_WIDTH][sp_HIGHT];
某格子对应的数组元素的值为1,表示此格子已被方块填充,为0表示未被填充。
在游戏空间中,被方块填充了的格子为深灰色,未被填充的格子为白色(底色),灰色格子触及空间顶部时,游戏结束。
即gamespace[0](二维数组第一排)中有元素的值为1时,游戏结束。
下面是判断游戏是否结束的程序:
booleanIsGameOver()/*true---结束false--没有结束*/
{booleanflag=false;
for(inti=0;
sp_WIDTH;
i++)
if(gamespace[0][i]==1){flag=true;
break;
returnflag;
4.判断俄罗斯方块是否能进行指定的变换(移动、旋转)
俄罗斯方块中心点在游戏空间中的坐标由方块结构体变量中的cx,cy指定,各小正方形在空间中的坐标等于小正方形相对坐标加上方块中心点坐标,即:
[cx+box[i].x,cy+box[i].y]
能否进行下一步指定变换的判断方法是:
执行指定的变换坐标计算程序(函数),返回(得到)变换后俄罗斯方块的信息体,判断变换后方块中各小正方形格(设坐标为[a,b])是否有超出边界,小正方形所在的位置是否已被填充。
即:
0<=a<=sp_WIDTH b<=sp_HIGHT
且 gamespace[a][b]==0 成立
程序段如下:
{
booleanIsCan=true;
/*标志变量,假设为能进行指定变换*/
intx,y;
{
x=cx+box[i][0];
y=cy+box[i][1];
if(x<
0||x>
=sp_WIDTH||y>
=sp_HIGHT||(y>
0&
&
gamespace[y][x]==1))
{IsCan=false;
}/*设置为不能进行指定变换*/
returnIsCan;
5.判断方块是否已落到底,停止下落
判断方块是否已落到底,就是判断方块中每个小正方形格的正下方位置是否已被填充或出下界。
如已到底,把方块所在的位置(格子)填充(对应gamespace元素值设为1),还要查看是否有某行已被全填充,把被全填充的行消掉,并给用户加分,程序片段如下:
booleanflag=false;
/*标志变量,假设为还没有触底*/
inti,x,y;
/*方块中小正方形格的正下方格式的坐标*/
for(i=0;
i++)/*逐个判断各小正方形格是否已触底*/
x=block_cx+block_box[i][0];
y=block_cy+block_box[i][1]+1;
if(y>
=sp_HIGHT||gamespace[y][x]==1)
{flag=true;
}/*设置为触底*/
if(flag)/*已触底*/
i++)/*逐个填充方块所占格子*/
x=block_cx+block_box[i][0];
y=block_cy+block_box[i][1];
if(y>
=0){gamespace[y][x]=1;
i++)/*逐个检查方块所在行是否全填充*/
y=block_cy+block_box[i][1];
while(y>
=0&
CheckAndCutLine(y))//检查此行是否全填充
m_score+=100;
//加分
isplaying=!
IsGameOver();
/*判断游戏是否结束*/
booleanCheckAndCutLine(intLn)/*检查某一行是否为全填充,如是,消掉并返回1*/
booleanIsFilled=true;
/*假设为全填充*/
i++)/*逐个判断各格是否有没填充的*/
if(gamespace[Ln][i]==0){IsFilled=false;
}/*设置为没有全填充*/
if(IsFilled)//全填充时,消掉此行,把上面的格子值往下移一格
intj,k;
for(j=Ln;
j>
0;
j--)
for(k=0;
k<
k++)//逐个把全填充行上的所有行向下移动一行
gamespace[j][k]=gamespace[j-1][k];
k++)gamespace[0][k]=0;
//顶行
returnIsFilled;
三、编程步骤:
(粗体部分是要操作的具体步骤)
1.用JcreateIDE建立一个新项目。
2.创建界面类:
publicclassGameWinextendsjavax.swing.JFrame{
publicGameWin(){
initComponents();
privatevoidinitComponents(){
getContentPane().setLayout(null);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
pack();
………..
设置窗体的大小:
setSize(550,500);
设置窗体的标题:
setTitle(“超级俄罗斯方块”);
3.把要用到的图形界面的系统类包import到文件开始处
importjava.awt.*;
importjavax.swing.*;
4.将界面设计为如图效果:
5.初始化控件:
在窗体的构造函数中,initComponents()后,写我们的初始化代码,给出组合框中的选项设置,如下:
jComboBox_speed.addItem
(1);
jComboBox_speed.addItem
(2);
jComboBox_speed.addItem(3);
jComboBox_speed.addItem(4);
jComboBox_speed.addItem(5);
jComboBox_bgcolor.addItem("
浅蓝"
);
浅绿"
黑色"
调试运行
6.定义游戏数据管理类RussionBlockGame:
把游戏数据(如:
方块数据、空间数据等)设置为类的成员变量,并在构造函数中写初始化代码,如下:
intgamespace[][]=newint[sp_WIDTH][sp_HIGHT];
intm_speed=5;
intisplaying=0;
cleargamespace();
//初始化游戏空间
makenewblock();
//第一方块
voidcleargamespace()//初始化游戏空间
i<
for(intj=0;
j<
sp_HIGHT;
j++)
gamespace[i][j]=0;
}
7.根据前面的分析,完成下列的功能函数
voidmovedown()/*下移动方块*/
voidmoveleft()/*左移动方块*/
voidmoveright()/*右移动方块*/
voidturnleft()/*左转动方块*/
voidturnright()/*右转动方块*/
8.在窗体类中定义一个游戏数据管理类的成员变量,并实例化,它表示游戏的数据。
如
RussionBlockGamegame=newRussionBlockGame();
//建立游戏数据对象
9.绘制游戏空间
在窗体类中定义常成员变量:
finalintORINA_X=10;
//游戏空间左上角的屏幕坐标X(单位:
finalintORINA_Y=50;
//游戏空间左上角的屏幕坐标Y(单位:
finalintBOXSIZE=20;
//小正方格大小尺寸(单位:
根据相关的宏定义参数、游戏空间数组gamespace[][],绘制并填充游戏空间:
画边界、画空间背景色、画已被填充的格子,程序如下:
voidDrawGameSpace(Graphicsg)//绘制游戏空间
intspace_left=ORINA_X;
//左上角坐标
intspace_top=ORINA_Y;
intspace_width=game.sp_WIDTH*BOXSIZE;
//尺寸(单位象素)
intspace_hight=game.sp_HIGHT*BOXSIZE;
g.setColor(Color.ORANGE);
g.drawRect(space_left-2,space_top-2,space_width+4,space_hight+4);
//画边框
g.setColor(newColor(250,255,255));
g.fillRect(space_left,space_top,space_width,space_hight);
//填空间背景
intx,y;
g.setColor(Color.LIGHT_GRAY);
game.sp_HIGHT;
i++)
j<
game.sp_WIDTH;
j++)
if(game.gamespace[i][j]==1){
x=ORINA_X+j*BOXSIZE;
y=ORINA_Y+i*BOXSIZE;
g.fillRect(x,y,BOXSIZE,BOXSIZE);
//填充游戏空间格子[i,j]
10.定义绘制俄罗斯方块
在游戏空间中画操控中的方块,程序如下:
voidDrawBlock(Graphicsg){//绘制方块
if(!
game.isplaying)
return;
g.setColor(Color.GREEN);
4;
i++){
x=ORINA_X+(game.block_cx+game.block_box[i][0])*BOXSIZE;
y=ORINA_Y+(game.block_cy+game.block_box[i][1])*BOXSIZE;
11.游戏界面的绘制:
在窗体类内重载窗体的paint()方法,在paint()中绘制我们的游戏界面。
publicvoidpaint(Graphicsg){
super.paint(g);
DrawGameSpace(g);
//绘制游戏空间
DrawBlock(g);
//绘制方块
12.在窗体类中处理玩家的按键操作事件
编写键盘事件处理方法代码,对于窗体绑定键盘事件,键盘事件类型为“keyPress”按下键处理方法,其处理代码用于控制游戏方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 游戏 设计 Java