检查俄罗斯方块,Android / Java的int数组中的左/右

时间:2012-01-22 08:34:22

标签: java android tetris

我正在尝试为Android制作一个俄罗斯方块游戏,以帮助学习Android的游戏编程。当按下按钮时,我的goLeft / Rights会中断,左边的代码位于字段int数组和列表部件数组中。 fields数组由引用的变量(TetrisWorld tetrisworld;)访问。部分列表数组是公共的,因此通过变量(部分)代码访问,该代码位于goLeft()代码中。它打破:if(tetrisworld.fields [x] [part.y]!= 0)左边的代码:

public void goLeft() {
    int x = 0;
    for(int i = 0; i < 4; i++) {
        TetrisParts part = parts.get(i);
        x = part.x - 1;
        if(tetrisworld.fields[x][part.y] != 0) {
            noleft = true;
            break;
        }
    }
    if(noleft == false) {
        for(int i = 0; i < 4; i++) {
            TetrisParts part = parts.get(i);
            part.x--;
        }
    }
}

字段int数组的代码:

int fields[][] = new int[WORLD_WIDTH][WORLD_HEIGHT];

WORLD_WIDTH和WORLD_HEIGHT都是静态最终整数,宽度为9,高度为19

我试过把if(tetrisworld.fields [0] [0] == 0)并且它仍然崩溃所以我不认为它与变量有关。即使我还没有添加代码来检查它,它也不会超出限制,因为我在x = 5附近产生了teroid,因为一旦没有机会我就不能左/右发生

我尝试将goLeft / Right方法移动到具有“world = TetrisWorld();”的gamescreen类中。它仍然在同一个地方出错

更新:

好的只是添加:

tetrisworld != null

到第一个if语句修复它,我现在的问题是,为什么要修复它?没有这张支票,为什么我不能搬家?据我所知,这显然不是空的原因;它现在已经完全响应了。

但是更容易解决这个问题的方法就是将fields更改为静态...然后访问它lika所以:TetrisWorld.fields所以我更新的代码是:

public void goLeft()
  {
  noleft = false;
  for (int i = 0; i < 4; i++)
     {
     part = parts.get(i);
     if (part.x - 1 < 0 || TetrisWorld.fields[part.x - 1][part.y] != 0)
        {
        noleft = true;
        break;
        }
     }
  if (noleft == false)
     {
     for (int i = 0; i < 4; i++)
        {
        part = parts.get(i);
        part.x--;
        }
     }
  }

3 个答案:

答案 0 :(得分:0)

看起来你正在击中IndexOutOfBoundsException。

当您执行x = part.x - 1;时,您的x变量可能会变为零点,因此您的代码将像if(tetrisworld.fields[-1][part.y] != 0

答案 1 :(得分:0)

在尝试访问java.lang.NullPointerException中的数组时,您似乎获得了tetrisworld。在你提到的那一行中,有几种方法可以实现:

if(tetrisworld.fields[x][part.y] != 0) {
  1. tetrisworld可以为null。
  2. fields的{​​{1}}成员可以为空。
  3. 使用tetrisworld查找的第二个数组。
  4. tetrisworld.fields[x]的值可以为null。
  5. 快速浏览一下您的源代码,我认为您永远不会初始化part,无论是在声明时使用:

    tetrisworld

    或者在调用TetrisWorld tetrisworld = new TetrisWorld(); 方法之前肯定会发生的其他一些事情。

答案 2 :(得分:0)

好的,我相信我找到了答案,参考:http://en.wikipedia.org/wiki/Null_Object_pattern

如果你有一个空引用,如果你不先检查它,那么java会抛出一个NPE吗?有没有办法在不执行TetrisWorld tetrisworld = new TetrisWorld();的情况下初始化它,因为它已经在不同的类中创建,所以我得到了一千个错误,一个实际的堆栈溢出! lul ...仍然没有100%积极。请评论以验证并可能建议更好的方法来解决这个问题。