Witam mam taka funkcje. Wyszukuje ona pola na ktore moze stanac gracz. Potrzebuje do tego jego obecnej pozycji (w postaci pola ktore zajmuje) i ilosci krokow ktore moze wykonac.
//Zwraca mozliwe pola w postaci punktow ich srodkow
private Point2D[] getAvailableFields(Field startField, int maxDistance) {
Point2D start = startField.getCenter();
int sx = (int) start.getX();
int sy = (int) start.getY();
List<TestPoint> points = new LinkedList<>();
List<Point2D> correctPoints = new LinkedList<>();
//Dodanie 4 punktow na start
points.add(new TestPoint(sx, sy - GP.FIELD_SIZE, 1));
points.add(new TestPoint(sx + GP.FIELD_SIZE, sy, 1));
points.add(new TestPoint(sx, sy + GP.FIELD_SIZE, 1));
points.add(new TestPoint(sx - GP.FIELD_SIZE, sy, 1));
//Znalezienie wszystkich mozliwych pol
ListIterator<TestPoint> iterator = points.listIterator();
while (iterator.hasNext()) {
TestPoint point = iterator.next();
Field field = getFieldFromPoint(point);
//Jesli punkt jest poza granica gry, nie jest stepable
//lub przekoczyl dystans to go usuwamy
if (field == null || !field.isStepable()
|| point.getDistance() == maxDistance) {
iterator.remove();
continue;
}
//Jezeli nie to punkt jest wlasciwy
correctPoints.add(new Point2D.Double(point.getX(), point.getY()));
//Dalej..
if (field.isVisited()) { //Jesli pole bylo juz odwiedzone to usuwamy
iterator.remove();
continue;
} else { //A jak nie to dodajemy 4 nowe punkty
int px = (int)point.getX();
int py = (int)point.getY();
int dist = point.getDistance() + 1;
iterator.add(new TestPoint(px, py - GP.FIELD_SIZE / 2, dist));
iterator.add(new TestPoint(px + GP.FIELD_SIZE / 2, py, dist));
iterator.add(new TestPoint(px, py + GP.FIELD_SIZE / 2, dist));
iterator.add(new TestPoint(px - GP.FIELD_SIZE / 2, py, dist));
}
}
//Zwrocenie wyniku
return correctPoints.toArray(new Point2D.Double[correctPoints.size()]);
}
Kod nie wyrzuca zadnego wyjatku ale nie dziala poprawnie. Wyglada to troche jakby te cztery punkty (w petli) byly dodawane ale nie byly potem iterowane). Tak wiec mam dwa pytania:
- Jezeli zastapie instrukcje continue instrukcjami *iterator.next() *to dostane blad (null exception). Czemu tak sie dzieje? Czym sie rozni wywolanie continue od iterator.next()?
- Czy z iterator.add() wszystko robie dobrze? Czy moze powinienem po kazdym dodaniu wywolac iterator.next()? Jak tak probowalem to dostawalem NotSuchElementException. Co zrobic zeby dodac te 4 punkty na koncu listy i iterowac dalej? Moze uzycie listy umozliwiajacej random access ułatwiło by sprawe?