Greenfoot/Schiffe-versenken: Wieso schießt der Gegner mehrmals?

2 Antworten

Deine Klick-Methode soll bei jedem Klick ausgelöst werden, nicht nur beim ersten.

Eine Fallunterscheidung macht da keinen Sinn, soweit ich das sehe. Und wenn doch müsstest du "gegner" nach jedem Klick eigentlich aufrufen, du rufst es hier aber nur beim zweitem Fall auf.
Mir ist zwar nicht klar,w as die Fallunterscheidung bewirken soll, aber "gegner" sollte in beiden aufgerufen werden.

in der "gegner"-Funktion ist die Zufallszahlengenerierung auch etwas merkwürdig. Warum erstellst du da ein Array, statt direkt eien passende Zufalsszahl aus dem Zufallszahlengenerator zu ziehen:

zufallX = zufallszahlX * SPAN_X + OFFSET_X;

Ansonsten sehe ich aber nicht, wieso die "gegner"-Funktion mehrfach aufgerufen werden sollte. Entweder wird der Treffer anderswo gesetzt oder der Mausklick ist nicht entprellt oder wird von mehreren Threads abgearbeitet.


speedjajxx  14.04.2025, 16:05

Ich glaube, die Fallunterscheidung ist dazu da, dass der Spieler bei einem Treffer direkt nochmal dran ist.

Destranix  14.04.2025, 16:25
@speedjajxx

Ja, so scheint es. Ist allerdings fraglich, ob das so richtig ist.

Ich weiß jetzt noch nicht, woran es liegt. Könntest du den Fehler vielleicht noch etwas genauer beschreiben?

Schießt der Gegner beliebig oft oder immer z.B. 2-mal? Hängt es davon ab, ob man/der Gegner etwas getroffen hat (wenn ich das richtig sehe, soll er ja nicht schießen, wenn man selbst etwas trifft)? Kann der Spieler danach nochmal schießen oder schießt der Gegner bis man das Spiel neu startet?

Ich würde jetzt einfach ein boolean-Attribut hinzufügen, das speichert, wer dran ist und immer, wenn ein Zug beendet ist, setzt du z.B. playersTurn = !playersTurn. Dann kannst du mit einem if-Statement prüfen, ob derjenige am Zug ist. Das funktioniert aber nicht, wenn der Gegner quasi unendlich oft schießt.


Destranix  14.04.2025, 15:40

Ich würde vor allem erst einmal Debug-Nachrichten reinbauen, damit man sieht, was genau eigentlich passiert.

Dann könnte man den Fehler finden.