software-challenge / gui

Software-Challenge GUI since 2020/21
https://software-challenge.de
10 stars 3 forks source link

Überlappung von Spielsegmenten #99

Closed jgeramb closed 8 months ago

jgeramb commented 8 months ago

Problem

Das 8. Segment teilt sich ein Feld mit dem 3. Segment auf dem Spielfeld, wodurch dem Feld kein eindeutiges Segment zugewiesen werden kann.

Screenshot mit markierter Überlappung

Erwartetes Ergebnis

Die Richtung wird so lange neu ausgelost, bis es keine Überlappungen mehr gibt.

1. Lösungsansatz

Alle neuen Felder-Koordinaten berechnen und überprüfen, ob Koordinaten bereits bestehender Felder mit den neuen Koordinaten übereinstimmen.

2. Lösungsansatz

Die absolute Summe aller ∆direction der Indizes i - 4 bis i darf nicht größer als 4 werden. i ist hierbei der Index des letzten Segments und es muss jeweils die Differenz zum vorherigen Segment bestimmt werden.

Beispielhafte Implementation in Java:

private final List<Segment> segments = new ArrayList<>();

public List<Direction> getPossibleDirections(Direction current) {
    final Direction[] nextDirections = { current.rotate(-1), current, current.rotate(1) };
    final int segmentCount = segments.size();

    if (segmentCount >= 5) {
        int sum = 0;

        for (int i = segments.size() - 4; i < segments.size(); i++)
            sum += segments.get(i).direction().delta(segments.get(i - 1).direction());

        if (sum == -4)
            return Arrays.copyOfRange(nextDirections, 1, 3);
        else if (sum == 4)
            return Arrays.copyOfRange(nextDirections, 0, 2);
    }

    return nextDirections;
}

Dein Betriebssystem?

Windows

xeruf commented 8 months ago

Danke für die detaillierte Info, da hast du echt den letzten kleinen edge case erwischt, ich hatte mir dazu nämlich auch schon Gedanken gemacht :sweat_smile:

xeruf commented 8 months ago

Meine Lösungsidee: Ein Segment darf niemals die entgegengesetzte Richtung des Segmentes drei Positionen vorher einnehmen. Ich denke das sollte das ganze elegant lösen.

jgeramb commented 8 months ago

Dadurch wird allerdings eine U-förmige Map ebenfalls verhindert. Ich würde noch einen weiteren Check hinzufügen, ob dasselbe auch für i - 1 und i - 4 gilt. Dann würde ausschließlich der Kreis vermieden werden.

jgeramb commented 8 months ago

Ein Unit-Test für den Edge-Case wäre vermutlich auch angebracht ;)

xeruf commented 8 months ago

Thanks, wir besprechen das im PR :)