android 游戏:俄罗斯方块的小结

最近觉得在android上开发游戏是一件很有趣的事情,所以查找了一些资料,自己做出了一个简单俄罗斯方块游戏,现将其总结如下:

1、基础数据模型

一个俄罗斯方块都是以一个4*4的二维数组来存储的,在我的demo游戏中,一共有7种方块类型: I S Z J O L T七种类型。见下图(图形就暂免了)。每种类型都有四种旋转状态, 如何在一个4*4的二位数组表示呢?可以用0和1来表示,1表示该小单元格需要显示,0表示该小单元格不需要显示。
设置屏幕为320*480,每个小单元格是20像素,这样宽就是COLS=16,高就是ROWS=24。

2、涉及到的几个JavaBean

2.1 Shape:把每种图形抽象出来为一个对象,具有的属性是

int的 left(x方向)和top(y方向)、

int的 status 旋转状态,可选择的值是0,1,2,3 默认是0

int[][] body 存储四种旋转状态的数据

int LEFT = 1, RIGHT = 2, DOWN = 3, ROTATE = 4

Shape的最基本方法是checkValue()和checkBound(),checkValue()方法是检查某个单元格的值是1还是0,可传入status,x,y或经过计算后的x,y的值,status作为属性可直接获取。

public boolean chekValue(int x, int y){......}

     或  public boolean checkValue(int xyValue){........}

Shape的checkBound()需要根据执行的动作和地面的单元格的条件来检查是否越界,如果地址没有越界,则返回false,否则返回true。

public boolean checkBound(int action, Ground ground){.........}

Shape的drawMe()方法,该方法应该是无参数的,主要的逻辑是把4*4中值为1的单元格在画布上画出来。

public void drawMe(){.............}

Shape还具有四个玩家可以操作的动作方法:moveLeft() moveRight() moveDown()和rotate()四种基本方法,对应模拟器上的四个方向键。

public void moveLeft(){................}

public void moveRight(){................}

public void moveDown(){.........}

public void rotate(){................}

2.2 Ground:地面类 就是各个小单元格堆放起来的那个地面,我们也把它抽象成为一个JavaBean,经过分析,它也应该具有如下的属性和方法。

int[][] body 这个body就是面板的最大面积COLS * ROWS =16*24

Ground也应该具有最基本的方法checkValue(),这个方法和Shape的方法大同小异,值为1返回true,值为0返回false,但是实现的具体逻辑和使用场景有较大的不同,输入参数可以使x,y ,也可以是left, top, x,y

public boolean checkValue(int x, int y){.........}

public boolean checkValue(int left, int right, int x,int y){.........}  二者实现一个即可。

Ground应该有一个addShape()的方法,用于接纳到达地面的Shape(),

public void addShape(int x, int y, Shape shape){......}

它应该有一个drawMe()的方法,显示他目前已经接纳且未消行的小单元格。

public void drawMe(){..........}

另外它应该有消行和统计分数的方法removeRows()

public void removeRows(){.........}

2.3 定义一个GameView,用来显示Shape和Ground的图形变化,需要重写的方法有

onDraw():主要是画Shape和Ground

onKeyDown():处理方向键按下的事件

在它的构造函数GameView()里面需要实现小单元格的静态资源的获取,

调用setFocusable(true); 以显示图形

在正式运行时需要执行定时器,以3秒钟不停刷新页面的数据。

2.4 MainActivity 将系统的标题栏去掉,调用

//以下去掉标题和全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

然后调用GameView。

相关推荐