Hallo Forengemeinde, als Hausaufgabe sollte ich ein Memoryspiel derart erweitern, dass zum einem das Spiel beim Aufdecken der letzten Karte nicht sofort beendet wird und zum anderen ausgeben, wer gewonnen hat (Computer oder Spieler)
Der erste Versuch war dies mit einen Alert Dialog (show&wait) vom Typ Information zu lösen... In diesem Fall würde das Programm erst geschlossen werden, wenn ich den Button o.k. drücke. Allerdings scheint sich dies mit dem noch laufenden Timer zum Umdrehen der letzten Karten zu beißen und ich erhalte die Fehlermeldung:
[CODE lang="java" title="statt show&wait"]private void infoMenschGewinnt() {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Spiel Ergebnis:");
alert.setHeaderText("Resultat:");
alert.setContentText("Herzlichen Glückwunsch Du hast Gewonnen !! ");
alert.setOnHidden(evt -> Platform.exit());
alert.show();
}
private void infoComputerGewinnt() {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Spiel Ergebnis:");
alert.setHeaderText("Resultat:");
alert.setContentText("Diesmal hat der Computer gewonnen! Click OK to exit.");
alert.setOnHidden(evt -> Platform.exit());
alert.show();
}[/CODE]
Das funktioniert auch, sofern ich als Spieler die letzten Karten aufdecke einwandfrei. Deckt aber der Computer die letzten Karten auf (egal bei welcher Gewinnkonstellation) wird zwar der Dialog angezeigt, aber sobald ich auf "o.K." drücke reagiert das Spiel nicht mehr (keine Rückmeldung). Von Eclipse wird keine Fehlermeldung angezeigt.
als Ergänzung noch der Code für den Computerzug:
[CODE lang="java" title="Computerzug"]private void computerZug() {
int kartenZaehler = 0;
int zufall = 0;
boolean treffer = false;
//zur Steuerung über die Spielstärke
if ((int)(Math.random() * spielstaerke) == 0) {
//erst einmal nach einem Paar suchen
//dazu durchsuchen wir das Array gemerkteKarten, bis wir in beiden Dimensionen
//einen Wert finden
while ((kartenZaehler < 21) && (treffer == false)) {
//gibt es in beiden Dimensionen einen Wert größer oder gleich 0?
if ((gemerkteKarten[0][kartenZaehler] >=0) && (gemerkteKarten[1][kartenZaehler] >=0)) {
//dann haben wir ein Paar
treffer = true;
//die Vorderseite der Karte zeigen
karten[gemerkteKarten[0][kartenZaehler]].vorderseiteZeigen();
//und dann die Karte öffnen
karteOeffnen(karten[gemerkteKarten[0][kartenZaehler]]);
//die zweite Karte auch
karten[gemerkteKarten[1][kartenZaehler]].vorderseiteZeigen();
karteOeffnen(karten[gemerkteKarten[1][kartenZaehler]]);
}
kartenZaehler++;
}
}
//wenn wir kein Paar gefunden haben, drehen wir zufällig zwei Karten um
if (treffer == false) {
//solange eine Zufallszahl suchen, bis eine Karte gefunden wird, die noch im Spiel ist
do {
zufall = (int)(Math.random() * karten.length);
} while (karten[zufall].isNochImSpiel() == false);
//die erste Karte umdrehen
//die Vorderseite der Karte zeigen
karten[zufall].vorderseiteZeigen();
//und dann die Karte öffnen
karteOeffnen(karten[zufall]);
//für die zweite Karte müssen wir außerdem prüfen, ob sie nicht gerade angezeigt wird
do {
zufall = (int)(Math.random() * karten.length);
} while ((karten[zufall].isNochImSpiel() == false) || (karten[zufall].isUmgedreht() == true));
//und die zweite Karte umdrehen
karten[zufall].vorderseiteZeigen();
karteOeffnen(karten[zufall]);
}
}[/CODE]
Bin ein Anfänger
daher tue ich mich mit der Fehlersuche recht schwer, zumal Eclipse Codeseitig nicht meckert. Ich hoffe jemand hat eine Idee, oder ein Alternative hinsichtlich der Anzeige des Gewinners.
vielen Dank im voraus und viele Grüße
Der erste Versuch war dies mit einen Alert Dialog (show&wait) vom Typ Information zu lösen... In diesem Fall würde das Programm erst geschlossen werden, wenn ich den Button o.k. drücke. Allerdings scheint sich dies mit dem noch laufenden Timer zum Umdrehen der letzten Karten zu beißen und ich erhalte die Fehlermeldung:
showAndWait is not allowed during animation or layout processing
Also habe ich im Netz etwas gesucht und bin auf eine Alternative gestoßen die ich wie folgt adaptiert habe:[CODE lang="java" title="statt show&wait"]private void infoMenschGewinnt() {
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Spiel Ergebnis:");
alert.setHeaderText("Resultat:");
alert.setContentText("Herzlichen Glückwunsch Du hast Gewonnen !! ");
alert.setOnHidden(evt -> Platform.exit());
alert.show();
}
private void infoComputerGewinnt() {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Spiel Ergebnis:");
alert.setHeaderText("Resultat:");
alert.setContentText("Diesmal hat der Computer gewonnen! Click OK to exit.");
alert.setOnHidden(evt -> Platform.exit());
alert.show();
}[/CODE]
Das funktioniert auch, sofern ich als Spieler die letzten Karten aufdecke einwandfrei. Deckt aber der Computer die letzten Karten auf (egal bei welcher Gewinnkonstellation) wird zwar der Dialog angezeigt, aber sobald ich auf "o.K." drücke reagiert das Spiel nicht mehr (keine Rückmeldung). Von Eclipse wird keine Fehlermeldung angezeigt.
als Ergänzung noch der Code für den Computerzug:
[CODE lang="java" title="Computerzug"]private void computerZug() {
int kartenZaehler = 0;
int zufall = 0;
boolean treffer = false;
//zur Steuerung über die Spielstärke
if ((int)(Math.random() * spielstaerke) == 0) {
//erst einmal nach einem Paar suchen
//dazu durchsuchen wir das Array gemerkteKarten, bis wir in beiden Dimensionen
//einen Wert finden
while ((kartenZaehler < 21) && (treffer == false)) {
//gibt es in beiden Dimensionen einen Wert größer oder gleich 0?
if ((gemerkteKarten[0][kartenZaehler] >=0) && (gemerkteKarten[1][kartenZaehler] >=0)) {
//dann haben wir ein Paar
treffer = true;
//die Vorderseite der Karte zeigen
karten[gemerkteKarten[0][kartenZaehler]].vorderseiteZeigen();
//und dann die Karte öffnen
karteOeffnen(karten[gemerkteKarten[0][kartenZaehler]]);
//die zweite Karte auch
karten[gemerkteKarten[1][kartenZaehler]].vorderseiteZeigen();
karteOeffnen(karten[gemerkteKarten[1][kartenZaehler]]);
}
kartenZaehler++;
}
}
//wenn wir kein Paar gefunden haben, drehen wir zufällig zwei Karten um
if (treffer == false) {
//solange eine Zufallszahl suchen, bis eine Karte gefunden wird, die noch im Spiel ist
do {
zufall = (int)(Math.random() * karten.length);
} while (karten[zufall].isNochImSpiel() == false);
//die erste Karte umdrehen
//die Vorderseite der Karte zeigen
karten[zufall].vorderseiteZeigen();
//und dann die Karte öffnen
karteOeffnen(karten[zufall]);
//für die zweite Karte müssen wir außerdem prüfen, ob sie nicht gerade angezeigt wird
do {
zufall = (int)(Math.random() * karten.length);
} while ((karten[zufall].isNochImSpiel() == false) || (karten[zufall].isUmgedreht() == true));
//und die zweite Karte umdrehen
karten[zufall].vorderseiteZeigen();
karteOeffnen(karten[zufall]);
}
}[/CODE]
Bin ein Anfänger
vielen Dank im voraus und viele Grüße