Java 我不知道';我不知道赋值运算符是如何工作的[处理]

Java 我不知道';我不知道赋值运算符是如何工作的[处理],java,processing,Java,Processing,我正在编写一个模拟蛇的程序,蛇的每个部分的值都存储在一个数组中。为了模拟snake物理,我需要将后面的部分指定给前面的部分,这是我遇到问题的地方 int bar; int foo; void setup() {} void draw() { foo = bar; bar = mouseX; println(foo); println(bar); } 在本例中,foo输出栏的上一个鼠标位置是否应该?在foo被分配给Bar之后,Bar被分配给mouseX。赋值运算符是否使赋值的

我正在编写一个模拟蛇的程序,蛇的每个部分的值都存储在一个数组中。为了模拟snake物理,我需要将后面的部分指定给前面的部分,这是我遇到问题的地方

int bar;
int foo;

void setup() {}

void draw() {
  foo = bar;
  bar = mouseX;
  println(foo);
  println(bar);
}
在本例中,foo输出栏的上一个鼠标位置是否应该?在foo被分配给Bar之后,Bar被分配给mouseX。赋值运算符是否使赋值的变量发生变化时,被赋值的变量也随之变化?这非常令人沮丧,我认为解决办法应该很简单。如何将一个变量分配给另一个变量,而不考虑被引用变量的未来变化

编辑:下面是一个snake模拟器的示例,它应该可以工作,但由于相同的原因不能工作,所有的段在每个for循环的末尾都是相同的:

int segments = int(random(3, 10));
float springing[] = new float[segments];
float damping[] = new float[segments];
PVector accel[] = new PVector[segments];
PVector[] joints = new PVector[segments];
PVector[] delta = new PVector[segments];
PVector food = new PVector(0,0,0);

void setup() {
  size(500, 500);
  stroke(255);
  for(int n = 0; n < joints.length; n++) {
    if (n == 0) joints[0] = new PVector(random(width), random(height));
    else joints[n] = joints[0];
    delta[n] = new PVector(0,0,0);
    accel[n] = new PVector(0,0,0);
    springing[n] = .05*(.07*(n+1)); 
    damping[n] = .95-(.02*n);
  }
}

void draw() {
  background(0);
  food.x =  mouseX;
  food.y = mouseY;
  for(int n = 0; n < segments; n++) {
    if (n == 0) {
     delta[0] = PVector.sub(food, joints[0]); 
     joints[0].add(delta[0]);
    }
    else {
     delta[n] = PVector.sub(joints[n-1], joints[n]);
     delta[n].mult(springing[n]);
     accel[n].add(delta[n]);
     joints[n].add(accel[n]);
    }
    point(joints[n].x, joints[n].y);
    accel[n].mult(damping[n]);
  }
}
int段=int(随机(3,10));
浮动弹簧[]=新浮动[段];
浮动阻尼[]=新浮动[段];
PVector accel[]=新PVector[段];
PVector[]关节=新PVector[段];
PVector[]增量=新PVector[段];
PVector食品=新PVector(0,0,0);
无效设置(){
大小(500500);
中风(255);
对于(int n=0;n
在您的示例中,
foo
bar
是基本类型,因此结果应该符合您的期望。但是,如果它们是参考文献,那么您所写的内容将是不完整的。在这种情况下,构造函数将帮助您保留变量的旧值

您是否尝试过在输入draw方法时检查bar的值,并查看赋值前后的实际值?

draw()循环每秒运行多次。一旦再次运行,foo就会被bar的值覆盖,该值具有上次执行draw()时的鼠标x位置。如果将println语句更改为:

println("foo: " + foo + " bar: " + bar);
然后,如果在移动鼠标的同时运行草图,您将看到如下条目:

foo: 76 bar: 84
foo: 84 bar: 91
foo: 91 bar: 97
foo: 97 bar: 97

正如所料,每次执行draw()时,foo都会采用上次执行draw()时bar的值(即mouseX),因为draw()循环会将foo设置为bar的当前值。

这并没有什么意义,bar在赋值前后都是一样的。我想这可能是鼠标的功能,所以我尝试了一个随机整数,同样的事情发生了。foo和bar打印相同的数字。当我将bar指定给mousext时,这很有意义。然而,我仍然无法让我的snake代码按预期工作。我更新了问题并加入了代码。谢谢。问题在安装程序()中。对于第一个关节,可以创建具有随机位置的新PVector。然后,将其余图元设置为同一PVector对象。所以现在数组的每个元素都指向同一个对象。在draw()中更改关节[0]时,会更改所有关节,因为它们都是相同的对象。相反,您需要创建独立的对象。您可以将setup()代码更改为以下内容,假设您希望它们都初始化为相同的x-y坐标:float x=random(width);浮动y=随机(高度);对于(intn=0;n