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