Значения массива неожиданно меняются

#java #arrays #recursion

Вопрос:

У меня есть массив с координатными объектами. В начале цикл 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; ilt; 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 gt;0; i--) {  snakePosition[i].x = snakePosition[i-1].x;  snakePosition[i].y = snakePosition[i-1].y;  System.out.printf("index %d: %d.%dn", 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 gt;0; i--) {  System.out.printf("index %d: %d.%dn", i, snakePosition[i].x, snakePosition[i].y);  }  System.out.print("end move methodn");  }   void growTail() {  lengthOfSnake  ;  snakePosition[lengthOfSnake] = snakePosition[lengthOfSnake - 1];  }   boolean didSnakeEatItself() {  for(int i = 1; i lt; lengthOfSnake; i  ) {  if((snakePosition[0].x == snakePosition[i].x) amp;amp; (snakePosition[0].y == snakePosition[i].y)) {  return false;  }  }  return true;  } }  

Комментарии:

1. Вам нужно сделать глубокую копию объектов snakePosition вместо того, чтобы назначать их друг другу.

Ответ №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;  

ваши два объекта pos1 и pos2 будут оба x=0,y=2.

Вы можете сделать следующее и сделать глубокое копирование методом:

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

и использовать его вот так:

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

Другой возможностью было бы прямое копирование значений x и y :

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

Комментарии:

1. Я использовал последнее, и когда змея вырастает до 4 (она начинается с длины 2), возникает та же проблема. Я не думаю, что первый вариант возможен, потому что у меня другой код. Код всего класса добавляется к моему вопросу, можно ли им манипулировать, чтобы первое, что вы предложили, сработало?

2. В качестве альтернативы можно создать конструктор копирования: SnakePosition(SnakePosition p) { this.x = p.x; this.y = p.y; } .

3. Я точно так же настроил другой код, и он действительно работает для прямого копирования значений x и y, спасибо вам всем