【问题标题】:Array values change unexpectedly数组值意外更改
【发布时间】:2022-01-04 01:22:18
【问题描述】:

我有一个包含坐标对象的数组。一开始,一个 for 循环分配值,使 v(1] 变为 v[0] (也是我想要的)。然后我独立更改 v[0],但 v(1] 现在也在更改。这不是假设会发生什么。你怎么解决这个问题?使用的输入:方向 = "R",宽度 = 26,高度 = 26。(屏幕截图下的代码)。

代码:

  package Snake;

import java.util.Random;
import java.util.Locale;
import java.util.Scanner;
import ui.Event;
import ui.SnakeUserInterface;
import ui.UserInterfaceFactory;

public class Snake {

    int lengthOfSnake;
    Coordinate[] snakePosition = new Coordinate[20];

    Snake() {
        lengthOfSnake = 2;
    }

    void initializeSnake() {
        for(int i = 0; i< 20; i++) {
            snakePosition[i] = new Coordinate();
        }
        snakePosition[0].x = 1;
        snakePosition[0].y = 0;
    }

    void move(String direction, int width, int height) {
        for(int i = lengthOfSnake - 1; i >0; i--) {
            snakePosition[i].x = snakePosition[i-1].x;
            snakePosition[i].y = snakePosition[i-1].y;
            System.out.printf("index %d: %d.%d\n", i, snakePosition[i].x, snakePosition[i].y);
        }
        System.out.println();
        if(direction.equals("R")) {
            snakePosition[0].x += 1;
            snakePosition[0].x = snakePosition[0].x % width;
        }
        else if(direction.equals("L")) {
            snakePosition[0].x -= 1;
            if(snakePosition[0].x ==- 1) {
                snakePosition[0].x = width - 1;
            }
        }
        else if(direction.equals("U")) {
            snakePosition[0].y -= 1;
            if(snakePosition[0].y ==- 1) {
                snakePosition[0].y = height - 1;
            }
        }
        else {
            snakePosition[0].y += 1;
            snakePosition[0].y =snakePosition[0].y % height;
        }
        for(int i = lengthOfSnake - 1; i >0; i--) {
            System.out.printf("index %d: %d.%d\n", i, snakePosition[i].x, snakePosition[i].y);
        }
        System.out.print("end move method\n");
    }

    void growTail() {
        lengthOfSnake++;
        snakePosition[lengthOfSnake] = snakePosition[lengthOfSnake - 1];
    }

    boolean didSnakeEatItself() {
        for(int i = 1; i < lengthOfSnake; i++) {
            if((snakePosition[0].x == snakePosition[i].x) && (snakePosition[0].y == snakePosition[i].y)) {
                return false;
            }
        }
        return true;
    }
}

【问题讨论】:

  • 您需要对对象snakePosition进行深拷贝,而不是相互分配。

标签: java arrays recursion


【解决方案1】:

我假设您的 snakePosition 数组由这样的对象组成:

public class SnakePosition {
 public int x;
 public int y;
 public SnakePosition(int x, int y) {
  this.x=x;
  this.y=y;
 }
 public String toString() {
  return "x="+x+",y="+y;
 }
}

当你必须SnakePosition 对象时:

var pos1 = new SnakePosition(1,1);
var pos2 = new SnakePosition(2,2);

并进行以下分配和对象更改

pos1 = pos2;
pos1.x = 0;

您的两个对象 pos1pos2 都将是 x=0,y=2。

您可以执行以下操作并制作深拷贝方法:

public class SnakePosition {
 ..

 public SnakePosition deepCopy() {
   return new SnakePosition(this.x, this.y);
 }
}

并像这样使用它:

for(int i = lengthOfSnake - 1; i >0; i--) {
    snakePosition[i] = snakePosition[i-1].deepCopy();
}

另一种可能性是直接复制 xy 值:

for(int i = lengthOfSnake - 1; i >0; i--) {
    snakePosition[i].x = snakePosition[i-1].x;
    snakePosition[i].y = snakePosition[i-1].y;
}

【讨论】:

  • 我使用了后者,当蛇长到 4 时(它从长度 2 开始),同样的问题会出现。我认为第一个选项是不可能的,因为我有不同的代码。整个班级的代码添加到我的问题中,可以对其进行操作,以便您建议的第一件事可以工作吗?
  • 或者,可以创建一个复制构造函数:SnakePosition(SnakePosition p) { this.x = p.x; this.y = p.y; }
  • 我用同样的方法调整了不同的代码,实际上直接复制x和y值确实有效,谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多