Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在int数组中检查俄罗斯方块、Android/Java的左/右_Java_Android_Tetris - Fatal编程技术网

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

在int数组中检查俄罗斯方块、Android/Java的左/右,java,android,tetris,Java,Android,Tetris,我正在尝试为android制作一个俄罗斯方块游戏,以帮助学习android的游戏编程。当按下按钮时,我的高尔夫/右击将向右打断,向左移动的代码位于一个单独的类中,该类由字段int数组和列表部分数组组成。字段数组由引用变量TetrisWorld TetrisWorld;访问;。而零件列表数组是公共的,因此可以通过可变零件代码进行访问,该零件代码位于goLeft代码中。它在以下位置断开:ifetrisworld.fields[x][part.y]!=左侧0代码: public void goLeft

我正在尝试为android制作一个俄罗斯方块游戏,以帮助学习android的游戏编程。当按下按钮时,我的高尔夫/右击将向右打断,向左移动的代码位于一个单独的类中,该类由字段int数组和列表部分数组组成。字段数组由引用变量TetrisWorld TetrisWorld;访问;。而零件列表数组是公共的,因此可以通过可变零件代码进行访问,该零件代码位于goLeft代码中。它在以下位置断开:ifetrisworld.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--;
        }
    }
}
世界宽度和世界高度都是静态的最终整数,宽度为9,高度为19

我尝试过将ifterisWorld.fields[0][0]==0,但它仍然崩溃,所以我认为这与变量无关。而且,即使我还没有添加代码来检查它,它也不会越界,因为我的三元体在x=5附近繁殖,而且一旦发生这种情况,我就不能向左/向右移动

我已经尝试将goLeft/Right方法移动到gamescreen类,该类的world=TetrisWorld;但它仍然在同一个地方出现

更新:

好的,只需添加:

tetrisworld != null
对于第一个if语句修复了它,我现在的问题是,它为什么要修复它?为什么没有这张支票我不能搬家?据我所知,这显然不是零原因;它现在完全响应了

但解决这个问题的一个更简单的方法是将场改为静态场,这非常简单。。。然后像so: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--;
        }
     }
  }

看起来你正在点击IndexOutOfBoundsException


当您执行x=part.x-1;,您的x变量可以变为0,因此您的代码的行为类似于iftetrisworld.fields[-1][part.y]!=0

在尝试访问tetrisworld中的数组时,您似乎遇到了java.lang.NullPointerException。在您提到的这一行中,有几种可能发生这种情况的方式:

if(tetrisworld.fields[x][part.y] != 0) {
tetrisworld可能为空。 tetrisworld的字段成员可能为空。 使用tetrisworld.fields[x]查找的第二个数组。 零件的值可以为null。 快速浏览一下您的源代码,在我看来,您从未初始化过tetrisworld,或者在声明中使用:

TetrisWorld tetrisworld = new TetrisWorld();

或者在调用您的高尔夫球门方法之前肯定会发生的其他点。

好的,我相信我找到了答案,参考:


显然,如果您没有首先检查NPE(如果您有空引用),java会抛出NPE吗?有没有办法在不做TetrisWorld的情况下初始化它;因为它已经在另一个类中创建,所以我得到了一千个错误,一个实际的堆栈溢出!卢。。。仍然不是100%阳性。请发表评论以验证这一点,并可能建议更好的方法。

Java程序很少崩溃。大多数情况下,它会抛出一个带有类型、消息和堆栈跟踪的异常。阅读它们,如果你不能理解它们,就发布它们。你是如何设置tetrisworld的价值的?一个初学者的游戏?哦,那太麻烦了。在完成这样的任务之前,你应该先学习android的基础知识。根据我的经验,游戏是最难编程的事情之一@FreeI的四驱体以x=5为中心,所以它不会接近x=0,因为我甚至不能做一次高尔夫/右拳,我还没有添加代码,因为我甚至不能像我说的那样去一次,当然应该这么说,那么我需要一个stacktrace。。。仔细查看您的设备logcat并获取跟踪信息。你的应用程序不能无声地失败!好的,添加了我能找到的所有东西,当然其中有几个毫无意义,但不管怎样,还是添加了@OlegasI,正如您所说添加了=新的TetrisWorld;我从中得到了大约50个错误,因此我将左方法和右方法移到gamescreen类中,因为它有一个world=TetrisWorld;但它仍然停在同一个位置,而且按钮现在并不总是注册,需要几次尝试。。。更新了source@free,有一次,我确实添加了一些代码,在goLeft方法的开头将字段[]的所有值设置为0,这样它们就不会为null。我已经尝试将0作为值放入:ifterySworld.fields[0][0]中=0{并且仍然执行相同的操作如果为X和Y值放置0仍然得到相同的错误,那么值得检查tetrisworld和tetrisworld.fields是否为null。如果将If语句更改为ifterySWorld!=null&&tetrisworld.fields!=null&&tetrisworld.fields[X][part.Y]!=0这是否会改变行为?将已创建的TetrisWorld从拥有它的类传递到需要它的类。如果您正在谈论TetrisWorld TetrisWorld;我已经这样做了,并且得到了空指针异常,我只是将字段[][]设为静态,并修复了它
TetrisWorld tetrisworld = new TetrisWorld();