Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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 I';我在我的粉末模拟游戏中遇到了水物理方面的问题_Java_Simulation - Fatal编程技术网

Java I';我在我的粉末模拟游戏中遇到了水物理方面的问题

Java I';我在我的粉末模拟游戏中遇到了水物理方面的问题,java,simulation,Java,Simulation,所以,基本上,我正在构建一个粉末模拟器,它是一个复杂的细胞自动机。 我在水物理方面有问题。 这就是它的工作原理,如果有自由空间,数字是水粒子移动的顺序,如果没有满足任何要求,那么水就静止不动。 然而,现在水根本不起作用。代码如下: void updateLiquid(int x, int y, Particle[][] next) { boolean B = y < N - 1; boolean R = x < N - 1; boolean L = x > 0; if (

所以,基本上,我正在构建一个粉末模拟器,它是一个复杂的细胞自动机。 我在水物理方面有问题。

这就是它的工作原理,如果有自由空间,数字是水粒子移动的顺序,如果没有满足任何要求,那么水就静止不动。 然而,现在水根本不起作用。代码如下:

void updateLiquid(int x, int y, Particle[][] next) {
boolean B = y < N - 1;
boolean R = x < N - 1;
boolean L = x > 0;


if (B && (grid[x][y + 1] == null || !grid[x][y + 1].updated)) {
  next[x][y + 1] = grid[x][y];
} else if (B && R && (grid[x + 1][y + 1] == null || !grid[x + 1][y + 1].updated)) {
  next[x + 1][y + 1] = grid[x][y];
  next[x + 1][y + 1].updated = true;
} else if (B && L && (grid[x - 1][y + 1] == null || !grid[x - 1][y + 1].updated)) {
  next[x - 1][y + 1] = grid[x][y];
  next[x - 1][y + 1].updated = true;
} else if (R && (grid[x + 1][y] == null || !grid[x + 1][y].updated)) {
  next[x + 1][y] = grid[x][y];
} else if (L && (grid[x - 1][y] == null || !grid[x - 1][y].updated)) {
  next[x - 1][y] = grid[x][y];
} else {
  next[x][y] = grid[x][y];
  next[x][y].updated = true;
}


}
void updateLiquid(int x,int y,Particle[]next){
布尔B=y0;
如果(B&&(网格[x][y+1]==null | | |!网格[x][y+1]。已更新)){
下一个[x][y+1]=网格[x][y];
}else if(B&&R&(网格[x+1][y+1]==null | | |!网格[x+1][y+1]。已更新)){
下一个[x+1][y+1]=网格[x][y];
下一步[x+1][y+1]。已更新=真;
}else if(B&&L&(网格[x-1][y+1]==null | | |!网格[x-1][y+1]。已更新)){
下一个[x-1][y+1]=网格[x][y];
下一步[x-1][y+1]。更新=真;
}else if(R&&(网格[x+1][y]==null | | |!网格[x+1][y]。已更新)){
下一个[x+1][y]=网格[x][y];
}else if(L&&(网格[x-1][y]==null | | |!网格[x-1][y]。已更新)){
next[x-1][y]=网格[x][y];
}否则{
next[x][y]=网格[x][y];
next[x][y]。updated=true;
}
}
“更新”不会影响太多,没有它的问题几乎是一样的,只是为了消除一些视觉缺陷

这里的问题是,当我在地图中“倒”水时,只有两个粒子在最后出现,似乎每个网格检查这两个粒子交换位置,它们从来都不稳定,而且我不能向其中添加更多的水,由于某种原因,它在接触后消失,我认为粒子占据了它的位置

他们经常交换位置

如果我去掉[x+1][y]和[x-1][y]检查,它会消失,但现在水和沙子一样,只是向下移动


这几天我一直在努力解决这个问题,今天我终于写下了这个问题。有办法解决这个问题吗?我知道这很简单,但我的大脑就是想不出一个解决办法。提前感谢。

您是否尝试过交互式调试器来观察阵列发生的情况?我的建议是从一个非常小的网格和少量的粒子开始,并逐步完成代码,确保它按照您的预期进行。