Greenfoot/Schiffe-versenken: Wieso schießt der Gegner mehrmals?
Hey, bei meinem Java-Code für Greenfoot spielt man selbst gegen den Computer, der, nachdem man selbst geschoßen hat, auch einen zufälligen Schuss setzt.
Der Gegner schießt momentan allerdings mehrmals. Hat jemand eine Idee, woran das liegt? 🙂
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot und MouseInfo)
import java.util.*;
/**
* Ergänzen Sie hier eine Beschreibung für die Klasse Schiff.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class Schiff extends Actor {
public Schiff(String image) {
setImage(image);
}
/**
* Act - tut, was auch immer Schiff tun will. Diese Methode wird aufgerufen,
* sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden.
*/
public void act() {
mausKlick();
}
public void mausKlick() {
if (Greenfoot.mouseClicked(this)) {
int xPos = Greenfoot.getMouseInfo().getX();
int yPos = Greenfoot.getMouseInfo().getY();
((Schiffeversenken)this.getWorld()).addObject(new Treffer(), xPos, yPos);
}
else if (Greenfoot.mouseClicked(((Schiffeversenken)this.getWorld()).rechts)) {
int xPosi = Greenfoot.getMouseInfo().getX();
int yPosi = Greenfoot.getMouseInfo().getY();
((Schiffeversenken)this.getWorld()).addObject(new KeinTreffer(), xPosi, yPosi);
gegner();
}
}
public void gegner() {
int[] xKoordinate = new int[7];
int[] yKoordinate = new int[7];
int x = 0;
for (int i = 67; i < 326; i = i + 43) {
xKoordinate[x] = i;
x++;
}
int y = 0;
for (int i = 154; i < 398; i = i + 40) {
yKoordinate[y] = i;
y++;
}
Random random = new Random();
int xIndex = random.nextInt(7);
int yIndex = random.nextInt(7);
int zufallx = xKoordinate[xIndex];
int zufally = yKoordinate[yIndex];
List<Schiff> schiffe = getWorld().getObjectsAt(zufallx, zufally, Schiff.class);
if (!schiffe.isEmpty()) // Wenn ein Schiff gefunden wurde
{
((Schiffeversenken)this.getWorld()).addObject(new Treffer(), zufallx, zufally); // Füge ein Treffer-Objekt hinzu
}
else // Wenn kein Schiff gefunden wurde
{
((Schiffeversenken)this.getWorld()).addObject(new KeinTreffer(), zufallx, zufally); // Füge ein NichtTreffer-Objekt hinzu
}
}
}
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.
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.
Ich würde vor allem erst einmal Debug-Nachrichten reinbauen, damit man sieht, was genau eigentlich passiert.
Dann könnte man den Fehler finden.
Ich glaube, die Fallunterscheidung ist dazu da, dass der Spieler bei einem Treffer direkt nochmal dran ist.