#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, спасибо вам всем