Я хочу решить шахматную головоломку с помощью Java. Я кодирую, что фигура коня перемещается из начального поля (1; 1) куда угодно, кроме отрицательных x и y, если все верно, помещает это посещенное поле в список, иначе вернется к предыдущему. Но это вообще не работает, это условие никогда не выполняется, оно всегда отрицательное и не возвращается в предыдущее поле, что может вызвать проблему?
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main
{
static Vector now;
static Vector prev;
static List<Vector> visited = new ArrayList<>();
public static void main(String[] args)
{
now = new Vector(); // sets x = 1, y = 1
prev = now; // also x = 1, y = 1
visited.add(now); // we are already on (1;1)
generate();
}
static void generate()
{
Random rand = new Random();
for (int i = 0; i < 50; i++)
{
int a = rand.nextInt(8);
move(a);
if ((isValid()) && hasNotVisited()) // if x and y > 0 , because the smallest coord is (1;1), and check is we haven't visited that field
{
visited.add(now);
prev = now; // previous coord is now, then make a new step
}
else
{
now = prev; // else, return to previous coord
// For example, we are one (3;2), we move to (1;0), that's not valid, we should move back to (3;2)
}
}
}
static void move(int a)
{
switch (a){
case 0:
now.x += 2;
now.y++;
break;
case 1:
now.x += 2;
now.y--;
break;
case 2:
now.x -= 2;
now.y++;
break;
case 3:
now.x -= 2;
now.y--;
break;
case 4:
now.y += 2;
now.x++;
break;
case 5:
now.y += 2;
now.x--;
break;
case 6:
now.y -= 2;
now.y++;
break;
case 7:
now.y -= 2;
now.y--;
break;
}
}
static boolean hasNotVisited()
{
for (Vector aVisited : visited) {
if (aVisited == now)
return false;
}
return true;
}
static boolean isValid()
{
return (0 < now.x && now.x <= 10) && (0 < now.y && now.y <= 10);
}
}
Спасибо!
Возможный дубликат В чем разница между == vs equals () в Java?




Думаю, проблема в том, что вы используете if (aVisited == now) в своем методе hasNotVisited. Вместо этого вам понадобится if (aVisited.equals(now)).
== вы проверяете, ссылаются ли две переменные на один и тот же экземпляр Vector..equals вы проверяете, касается ли он двух Vector.
с такими же свойствами / ценностями.Обновлено: Я только что заметил, что Vector не отменяет equals. См. Также исходный код Vector. В качестве альтернативы вы можете использовать (if aVisited.x == now.x && aVisited.y == now.y) в своем методе hasNotVisited.
Возможный дубликат Почему мой ArrayList содержит N копий последнего элемента, добавленного в список?