Java--俄罗斯方块
(Java) .
1.1
开发一个俄罗斯方块游戏。游戏者移动和旋转窗口内落下的方块,方块在一行堆满后就
可以消掉,并得到相应的分数;如果方块堆积至窗口顶端,即告负。
1.2
在游戏程序中,我们可以将它看成3个对象,分别是程序窗体主类对象、方
块数据管理对象、控制游戏自动下落的定时器线程对象、三个背景音乐对象。
窗体主类对象:
方块数据管理对象:
控制游戏自动下落的定时器线程对象: 三个背景音乐对象:
1.3
开发工具:Sun NetBeans IDE 6.1
NetBeans IDE 是一个为软件开发者提供的自由、开源的集成开发环境。您可以
从中获得您所需要的所有工具,用 Java、C/C++ 甚至是 Ruby 来创建专业的桌面应用程序、企业应用程序、web 和移动应用程序。此 IDE 可以在多种平台上运行,包括 Windows、Linux、Mac OS X 以及 Solaris;它易于安装且非常方便使用。6.0 发行版包含了重要的增强功能和新特性,包括完全重写的编辑器基础
结构、对扩展语言的支持、新的生产率特性,以及一个能让您根据实际需求安装
并配置 IDE 的简化安装过程。
.
2.1
游戏数据与界面显示相分离,用游戏结构数据描述游戏的状态,玩家操作或
游戏自行走一步,程序中都通过修改游戏数据来体现,即每走一步,程序会修改
当前的游戏数据,判断游戏是否结束了,也是通过对游戏数据的分析来作出结论。
游戏界面是根据当时游戏数据来绘制的,当数据改变时,要清除原图形并重绘。
总之,游戏的逻辑
是针对游戏数据,而不是游戏界面。界面只是间接地向玩
家显示结果。因此,在设计函数时,大致分二类:与玩家操作事件有关的数据处
理函数,与界面效果有关的图形绘制函数。游戏运行过程由窗体监听到的键盘事
件控制主要
图如下:
Class RussionGame
Anthem类
makeblock() clearblock()
制造新的方块 IsCanChangeTo()
formKeyPressed()
movedown() moveleft() Anthem2类
moveright()
turnleft() turnright()
IsHitBottom()
检查某一行是否为全填充,如
是,消掉并返回1 CheckAndCutLine()
TimerRuner
Anthem3类 IsOver()
当游戏结束后启动另一定义一个线程类,在后台自动地
首音乐 按游戏速度,移动方块。
游戏数据管理对象:主要管理着两方面数据:方块的坐标数据和游戏空间数据。用成员
数组变量描述游戏空间状态,根据游戏空间状态判断游戏是否结束。用它的成员变量保存方
块的形状数据及坐标数据,定义当方块走动方块数据变化的处理方法。此外,还把各种游戏
属性数据作为其成员变量。
控制游戏自动下落的定时器线程对象:是一个线程类派生对象,独立运行,每隔一段时
间控制方块下落下格。
窗体界面主类对象:负责绘制游戏图象、包含游戏设置的各种控件(如:设置速度的文
本框、显示得分的标签、开始及暂停按钮),负责游戏的各种属性数据的读入及显示输出,
最重要的是:它还是一个键盘事件处理类,监听玩家的键盘操作,处理键盘事件,在键盘事
件处理函数中调用游戏数据管理对象的方法,控制游戏的运行。我们还把游戏数据管理对象、
控制游戏自动下落的定时器线程对象作为它的成员变量。
往面板中加入需要的控件(2个Jlable,2个JcomboBox,4个Jbottun),并布置好它
们的位置,并重命名控件对象变量的名称,如上图:
2.3
1.
首先对于方块的构造分析,可以用一个三维数组来
示,方块总共有四种基本形,其它
形状可由这四种基本形通过旋转得到,如下图:
class RussionBlockGame
{
final int sp_WIDTH = 20; //
final int sp_HIGHT = 20; //
final int boxtypes[4][4][2]={
{{-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}}
};/**/
int box[4][2]; /**/ int cx, cy; /**/
int type; /*(0,1,2,3)*/
int block_box[][]=new int[4][2]; /**/
/**/ int block_type; /*(0,1,2,3)*/
int gamespace[][] = new int[sp_HIGHT][sp_WIDTH] ; int block_cx, block_cy;
void makeblock()//
{
block_type = (int)(Math.random()*100)%4;//产生一个1-4的随机数
for(int i=0; i<4;i++)
block_box[i] = types[block_type][i];
block_cx=sp_WIDTH/2; block_cy=0;
}
WIDTH
HIGHT
(cx,cy)=
(11,4)
(WIDTH-1,HIGHT-1)
游戏空间可以看成由sp_WIDTH × sp_HIGHT个正方形小格子构成,每格子都有一个相
对于左上角的坐标。可以用一个sp_WIDTH × sp_HIGHT的二维数组表示游戏空间。如下:
int gamespace[sp_WIDTH][sp_HIGHT];
某格子对应的数组元素的值为1,表示此格子已被方块填充,为0表示未被填充。
在游戏空间中,被方块填充了的格子为深灰色,未被填充的格子为白色(底色),灰色格子
触及空间顶部时,游戏结束。即gamespace[0](二维数组第一排)中有元素的值为1时,游戏结束。下面是判断游戏是否结束的程序:
boolean IsGameOver()
{ boolean flag=false;
for(int i=0; i
=sp_WIDTH || y>=sp_HIGHT|| (y>0 && gamespace[y][x]==1))
{ IsCan = false; break;}
}
return IsCan;
}
4.,
判断方块是否已落到底,就是判断方块中每个小正方形格的正下方位置是否已被填充
或出下界。
如已到底,把方块所在的位置(格子)填充(对应gamespace1),还要查
看是否有某行已被全填充,把被全填充的行消掉,并给用户加分,程序片段如下:
boolean IsHitBottom( ) /
{
boolean flag =false ;
int i, x, y;
for (i=0; i<4; 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; break; }
}
if( flag )
{
for (i=0; i<4; i++)
{
x= block_cx + block_box[i][0] ;
y= block_cy + block_box[i][1] ;
if(y>=0) { gamespace[y][x]=1;}
}
for (i=0; i<4; i++)
{
y= block_cy + block_box[i][1] ;
while(y>=0 && CheckAndCutLine(y))
m_score += 100;
}
isplaying = ! IsGameOver();
}
return flag;
}
开始音乐时已被循环播放
w1.audioClips.loop();
Anthem2 w2 = new Anthem();
当触发到按键事件时执行formKeyPressed方法,每当系统取得某一个按键的键码时
程序都会自动执行w2.audioClips2.play();直到游戏结束。
Anthem2 w3 = new Anthem() ;
当触发到game.IsOver方法时证明游戏已结束这时程序会调用 w1.audioClips.stop();
w3.audioClips3.play();
背景音乐消失,结束音乐开始。
6.
游戏窗体的设计视图中,选择“开始游戏”按钮,再右键点击“开始游戏”按钮,从菜
单中选“事件”->“Action”事件类型->“actionPerformed”接口方法,将转到源视图中事件处理代码处,加入我们的处理代码,使得游戏开始,如下:
private void jButton_startActionPerformed(java.awt.event.ActionEvent evt) {
game.isplaying=true;
this.requestFocusInWindow();
new TimerRuner(this);
}
用同样的方法编写“暂停游戏”、“结束游戏”、“退出游戏”的点击事件处理代码,
代码如下:
private void jButton_stopActionPerformed(java.awt.event.ActionEvent evt) {
game.isplaying=false;
}
private void jButton_overActionPerformed(java.awt.event.ActionEvent evt) {
game.isplaying=false;
game.cleargamespace();
}
private void jButton_exitActionPerformed(java.awt.event.ActionEvent evt) {
game.isplaying=false;
System.exit(0);
}
2.4
功能:
具有等级功能,不同的等级游戏的难度不一样; 具有分数功能,消行可以得到分数;
具有声音,有背景音和执行不同的操作出现不同的声音; 具有设置功能,可以用来设置初始等级、开始行数、按键设置等。
3.
/number2方块向下 /number4:方块向下
/number3:方块向右 PageDown方块向右翻传 End方块向左传 Start游戏开始 背景音乐的开关
Stop暂停游戏 over停止游戏
Speed:调整速度 :选择方块的背景色(默认为浅蓝)
程序运行结果大部分按照预期设计一样,但背景色的改变有时响应过慢,而且
每次打开音乐后必须重新按下start键,这是该游戏的缺陷之一。鉴于此,已作出部分修正,
虽然还没有达到游戏更加人性化,但基本上能满足游戏的多方面的需要了。