Eine Methode um zu testen ob es ein Nachbar gibt?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

die Methode sieht ähnlich aus wie getNeighborhood(). Allerdings brauchst Du nicht alle 4 Richtungen untersuchen, sondern nur die gewünschte richtung[dir] (wenn dir der dritte Parameter ist).

Also machst Du entweder eine Kopie von getNeighborhood() und wirfst alles unnötige raus:

    private boolean getNeighborhood(final int x, final int y, final int dir)
    {
        final int[][] neighbors = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

        final int[] offset = neighbors[dir];
        return getCell(x + offsets[0], y + offsets[1]) != ' ');
    }

oder du rufst dort getNeighborhood() auf und prüfst, ob deren Rückgabe das dir-Bit gesetzt hat:

    private boolean getNeighborhood(final int x, final int y, final int dir)
    {
        return getNeighborhood(x, y) & (1<<dir) != 0;
    }
Lukas1523 
Fragesteller
 09.12.2022, 20:55

Danke für deine Antwort, nur es wird ein Error angezeigt ich denke es wäre ohne & (1<<dir) richtig oder ?

0
ralphdieter  09.12.2022, 21:08
@Lukas1523

Mein Fehler: & bindet schwächer als !=. Du brauchst also Klammern.

Das "& (1<<dir)" ist nötig, weil getNeighborhood() nur eine Zahl zwischen 0 und 15 liefert. Du musst testen, ob das passende Bit gesetzt ist.

1
Lukas1523 
Fragesteller
 11.12.2022, 15:24

Hallo nochmal, du konntest mir echt am meisten Helfen. Dafür auch nochmal danke! Ich hatte da eine kleine Frage. Unzwar müsste ich die String länge nun in einer anderen Klasse ermitteln und NPCs erzeugen, die sich um +2 rotieren, wenn das Ende des Feldes erreicht wurde. mit dem Code funktioniert das aber nicht da bei Field.field[].length ein Error kommt mit class expected bei .length.

if (Field.field[].length == maxSteps) {
    npc.setRotation(npc.getRotation() + 2);
}
0
ralphdieter  11.12.2022, 15:47
@Lukas1523

„Field.field[]“ ist etwas verunglückt:

  1. Die eckigen Klammern sind völlig fehl am Platz. Das Feld heißt einfach nur „field“.
  2. „field“ ist kein statisches Feld. Deshalb grauchst Du ein konkretes Objekt vom Typ „Field“, um darauf zuzugreifen. Etwa so:
    static void test()
    {
        new GameObject.Canvas(5, 5, 96, 96);
        Field myField = new Field(new String[] { ... };

        if (myField.field.length == maxSteps) { ...

Das scheitert in einer anderen Klasse aber daran, dass field private ist (was auch gut so ist). Du könntest Field um eine Methode erweitern:

    public int getHeight()
    {
        return field.length;;
    }

und die dann in der anderen klasse verwenden.

1
Lukas1523 
Fragesteller
 11.12.2022, 15:57
@ralphdieter

Also ich weiß nicht ob ich etwas falsch gemacht habe, aber mit beiden Beispielen funktioniert es trotzdem nicht, weil es eine non-static Methode sei.

0
ralphdieter  11.12.2022, 16:02
@Lukas1523

Klar, denn jede Instanz von Field hat ihre eigene Feldgröße. Du mußt deshalb die Instanz und nicht die Klasse danach fragen:

    field myfield = new Field( ... );

    if ( myField.getHeight() == maxSteps )
0
Lukas1523 
Fragesteller
 11.12.2022, 16:05
@ralphdieter

Dies ist ja dann in der Field-Klasse oder nicht? Soll ich dann das maxSteps public sein?

0
Lukas1523 
Fragesteller
 11.12.2022, 16:26
@ralphdieter

Sorry das ich dich so nerve, hier es steht aber auch dann bei der if anweisung in der Klasse Field, das die npc Methoden non-static sind

0
ralphdieter  11.12.2022, 16:27
@Lukas1523

Nur getHeight() ist in der Klasse Field. Du sagtest aber, dass Du in einer anderen Klasse mit so einem Field-Objekt arbeiten willst. Dazu brauchst Du dort eine Variable vom Typ Field, für die Du dann getHeight() und alle anderen non-static-Methoden aufrufen kannst.

Also entweder übergibst Du Deiner Methode, die die NPCs erzeugt, das Field, in dem sie herumlaufen, oder Du legst im Konstruktor dieser anderen Klasse eine solche Variable an.

1