Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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
Java 为什么不是';我的if else block有没有被击中过,即使它应该被击中?(只需要另一双眼睛。)_Java_If Statement_Simulation - Fatal编程技术网

Java 为什么不是';我的if else block有没有被击中过,即使它应该被击中?(只需要另一双眼睛。)

Java 为什么不是';我的if else block有没有被击中过,即使它应该被击中?(只需要另一双眼睛。),java,if-statement,simulation,Java,If Statement,Simulation,我正在用Java制作一个下落的沙子风格的游戏,我遇到了一个奇怪的问题,我有一个if-else块。在我的doGravity()方法中,我有各种各样的条件块,它们会导致不同的事情发生,出于某种奇怪的原因,一个块永远不会被击中 当我计算每个条件被命中的次数时,左右两个块的命中率几乎相等: else if(world[x][y+1]==EMPTY && (x-1 >= 0) && world[x-1][y+1] == EMPTY && (x+1 &l

我正在用Java制作一个下落的沙子风格的游戏,我遇到了一个奇怪的问题,我有一个if-else块。在我的doGravity()方法中,我有各种各样的条件块,它们会导致不同的事情发生,出于某种奇怪的原因,一个块永远不会被击中

当我计算每个条件被命中的次数时,左右两个块的命中率几乎相等:

else if(world[x][y+1]==EMPTY && (x-1 >= 0) && world[x-1][y+1] == EMPTY && (x+1 < world.length) && world[x+1][y+1]==EMPTY) {
    int r = rand.nextInt(50);
    if(r == 0) {
        world[x-1][y+1] = world[x][y];
        //System.out.println("GO: right");
        countRight++;
    }
    else if(r == 1) {
        world[x+1][y+1] = world[x][y];
        //System.out.println("GO: left");
        countLeft++;
    }
    else {
        world[x][y+1] = world[x][y];
        countCenter++;
    }
    world[x][y] = EMPTY;
}
else如果(world[x][y+1]==EMPTY&&(x-1>=0)和&world[x-1][y+1]==EMPTY&&(x+1
接下来是这种情况,它也平均地分布在左右两侧

else if((x-1 >= 0) && world[x-1][y+1] == EMPTY && (x+1 < world.length) && world[x+1][y+1]==EMPTY) {
    if(rand.nextBoolean()) {
        world[x-1][y+1] = world[x][y];
        //countLeft++;
    }
    else {
        world[x+1][y+1] = world[x][y];
        //countRight++;
    }
    world[x][y] = EMPTY;
}
else如果((x-1>=0)和世界[x-1][y+1]==空和(x+1
但当我数这些方块时,左边的方块永远不会被击中,即使左边的空间是开放的。我觉得这可能只是一些愚蠢的打字错误,因为某种原因我看不到

else if((x-1 >= 0) && world[x-1][y+1] == EMPTY) {
    world[x-1][y+1] = world[x][y];
    world[x][y] = EMPTY;
    countLeft++;
    System.out.println("Hit Left");
}
else if((x+1 < world.length) && world[x+1][y+1] == EMPTY) {
    world[x+1][y+1] = world[x][y];
    world[x][y] = EMPTY;
    countRight++;
    System.out.println("Hit Right");
}
else if((x-1>=0)和&world[x-1][y+1]==空){
世界[x-1][y+1]=世界[x][y];
世界[x][y]=空;
countLeft++;
System.out.println(“左击”);
}
else if((x+1
更新:如果我在末尾注释掉
左侧的
块,绝对不会有任何变化。沙子的作用完全相同。如果我在末尾注释掉
right
块,其作用与注释掉两个块相同。我想不出来。它应该有用。。。但事实并非如此


更新:以下是完整的源代码。我不知道这可能是什么。事实上,这会让我发疯

我在发布的代码中没有看到任何奇怪的东西。。。然而,第二块开头的“else”使我认为,上述条件可能是在您希望由“left”案例处理的情况下执行的。 该零件前面的
if
中的条件是什么

编辑 在检查了您的全部源代码之后,我终于找到了问题所在。你的
doGravity
update函数总是向左->向右,这就引入了不对称性。通过更改它,使奇偶扫描线的更新方向在左->右和右->左之间交替,不对称性消失

private void doGravity() {
    for(int i = worldHeight - 1; i >= 0; i--) {
        if (i % 2 == 0)
        {
            for(int j = 0; j < worldWidth; j++) {
                if(world[j][i] != EMPTY) {
                    if(hasGravity(world[j][i])) {
                        dropParticle(j, i);
                    }
                }
            }
        } 
        else
        {
            for(int j = worldWidth-1; j >= 0; --j) {
                if(world[j][i] != EMPTY) {
                    if(hasGravity(world[j][i])) {
                        dropParticle(j, i);
                    }
                }
            }
        }
    }
}
private void doGravity(){
对于(int i=世界高度-1;i>=0;i--){
如果(i%2==0)
{
对于(int j=0;j=0;--j){
if(world[j][i]!=空){
if(世界[j][i])){
滴状粒子(j,i);
}
}
}
}
}
}

您的pastebin代码确实显示“左击”,您只需将world(第65行pastebin)的创建更改为

因为y+1部分,我想。除此之外,它会向左和向右生长


编辑:我用你的狗的重力旋转了一下,使水滴更加对称

我从粘贴库下载了你的代码。我做的第一件事是提取这个方法,并使用它来代替所有的嵌入式数组单元格检查,这样我就可以设置断点,查看
x
y
的值以及索引单元格的内容

private boolean isEmpty(final int x, final int y)
{
    return world[x][y] == EMPTY;
}
我会将所有
EMPTY
检查提取为更可读的内容,例如
isLeftEmpty(x,y)
isRightEmpty(x,y)
isNextLeftEmpty(x,y)
它将帮助您推断代码中逻辑的正确性

我还将
(x+1
提取到
isNextXOutsideWorld(x)
,这将有助于记录您的意图,并有助于对您想要的逻辑进行推理

这还有一个副作用,即简化
if/elseif/else
语句中的逻辑

我做了一些简短的调试,让它运行了几分钟,并得出结论,下面的一行总是匹配的,并取代下一个
else if
语句

else if ((x + 1 < world.length) && isEmpty(x + 1, y + 1) && 
         (x - 1 >= 0) && isEmpty(x - 1,y + 1))
我会尝试将每个
else/if
语句分解为具有描述性名称的方法调用,并使用
策略
模式将它们按顺序排列,因为它们都是相互排斥的。这么大的一个方法肯定是一种代码气味,再加上所有那些
else/if
块,臭味系数很高


很难从
if/elseif/else
块中的所有噪声中推断出您的预期行为。

我对其进行了编辑,将块包含在中间。这一块也是均匀分布的。只有左边的方块永远不会被击中。从来没有,我也没看到什么不对劲。。。顶部的
条件是什么?所有这些代码只有在条件为false的情况下才会执行……好吧,所有这些代码肯定都在执行。
if
语句是
if(y==
else if ((x + 1 < world.length) && isEmpty(x + 1, y + 1) && 
         (x - 1 >= 0) && isEmpty(x - 1,y + 1))
else if ((x - 1 >= 0) && isEmpty(x - 1,y + 1))