Hallo,
ich habe in JavaFX versucht ein Memory-Spiel zu erstellen. Leider werden diverse Exceptions geworfen bei der Ausführung. Ich kann aber den Fehler nicht finden. Wäre super, wenn mir einer helfen könnte:
[CODE lang="java" title="MemoryKarte.java"]import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.image.ImageView;
//die Klasse für eine Karte des Memory-Spiels
//Sie erbt von Button
public class MemoryKarte extends Button {
//die Instanzvariablen
//eine eindeutige ID zur Identifizierung des Bildes
private int bildID;
//für die Vorder- und Rückseite
private ImageView bildVorne, bildHinten;
//wo liegt die Karte im Spielfeld
private int bildPos;
//ist die Karte umgedreht?
private boolean umgedreht;
//ist die Karte noch im Spiel?
private boolean nochImSpiel;
//die innere Klasse für den Eventhandler
class KartenListener implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent arg0) {
//ist die Karte überhaupt noch im Spiel?
if (nochImSpiel == false)
return;
//wenn die Rückseite zu sehen ist, die Vorderseite anzeigen
if (umgedreht == false) {
setGraphic(bildVorne);
umgedreht = true;
}
}
}
//der Konstruktor
//er setzt die Bilder
public MemoryKarte(String vorne, int bildID) {
//die Vorderseite, der Dateiname des Bildes wird an
//den Konstruktor übergeben
bildVorne = new ImageView(vorne);
//die Rückseite, sie wird fest gesetzt
bildHinten = new ImageView("Grafik/back.jpg");
setGraphic(bildHinten);
//die Bild-ID
this.bildID = bildID;
//die Karte ist erst einmal umgedreht und noch im Feld
umgedreht = false;
nochImSpiel = true;
//die Action setzen
setOnAction(new KartenListener());
}
//die Methode zeigt die Rückseite der Karte an
public void rueckseiteZeigen(boolean rausnehmen) {
//soll die Karte komplett aus dem Spiel genommen werden?
if (rausnehmen == true) {
//das Bild aufgedeckt zeigen und die Karte aus dem Spiel nehmen
setGraphic(new ImageView("Grafik/aufgedeckt.jpg"));
nochImSpiel = false;
}
else {
//sonst nur die Rückseite zeigen
setGraphic(bildHinten);
umgedreht = false;
}
}
//die Methode liefert die Bild-ID einer Karte
public int getBildID() {
return bildID;
}
//die Methode liefert die Position einer Karte
public int getBildPos() {
return bildPos;
}
//die Methode setzt die Position einer Karte
public void setBildPos(int bildPos) {
this.bildPos = bildPos;
}
}[/CODE]
[CODE lang="java" title="MemoryFeld.java"]import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
public class MemoryFeld {
//das Array für die Karten
private MemoryKarte[] karten;
//das Array für die Namen der Grafiken
private String[] bilder = {"Grafik/apfel.jpg", "Grafik/birne.jpg", "Grafik/blume.jpg", "Grafik/blume2.jpg", "Grafik/ente.jpg", "Grafik/fisch.jpg", "Grafik/fuchs.jpg", "Grafik/igel.jpg", "Grafik/kaenguruh.jpg", "Grafik/katze.jpg", "Grafik/kuh.jpg", "Grafik/maus1.jpg", "Grafik/maus2.jpg", "Grafik/maus3.jpg", "Grafik/melone.jpg", "Grafik/pilz.jpg", "Grafik/ronny.jpg", "Grafik/schmetterling.jpg","Grafik/sonne.jpg", "Grafik/wolke.jpg", "Grafik/maus4.jpg"};
//für die Punkte
private int menschPunkte, computerPunkte;
//zwei Labels für die Punkte
private Label menschPunkteLabel, computerPunkteLabel;
//wie viele Karten sind aktuell umgedreht?
private int umgedrehteKarten;
//für das aktuell umdrehte Paar
private MemoryKarte[] paar;
//für den aktuellen Spieler
private int spieler;
//das Gedächtnis für den Computer
//er speichert hier, wo das Gegenstück liegt
private int[][] gemerkteKarten;
//der Konstruktor
public MemoryFeld() {
//das Array für die Karten erstellen, insgesamt 42 Stück
karten = new MemoryKarte[42];
//für das Paar
paar = new MemoryKarte[2];
//für das Gedächtnis
//es speichert für jede Karte paarweise die Position im Spielfeld
gemerkteKarten = new int[2][21];
//keiner hat zu Beginn einen Punkt
menschPunkte = 0;
computerPunkte = 0;
//es ist keine Karte umgedreht
umgedrehteKarten = 0;
//der Mensch fängt an
spieler = 0;
//es gibt keine gemerkten Karten
for (int aussen = 0; aussen < 2; aussen++)
for (int innen = 0; innen < 21; innen++)
gemerkteKarten[aussen][innen] = -1;
}
//die Methode erstellt die Oberfläche und zeichnet die Karten über eine eigene Methode
//übergeben wird ein FlowPane
public FlowPane initGUI(FlowPane feld) {
//für die Ausgaben
kartenZeichnen(feld);
menschPunkteLabel = new Label();
computerPunkteLabel = new Label();
menschPunkteLabel.setText(Integer.toString(menschPunkte));
computerPunkteLabel.setText(Integer.toString(computerPunkte));
//in zwei Spalten anzeigen
GridPane tempGrid = new GridPane();
//und einfügen, dabei werden die Koordinaten angegeben
tempGrid.add(new Label("Mensch: "), 0 , 0 );
tempGrid.add(menschPunkteLabel, 1, 0);
tempGrid.add(new Label("Computer: "), 0, 1);
tempGrid.add(computerPunkteLabel, 1 ,1);
feld.getChildren().add(tempGrid);
return feld;
}
//das eigentliche Spielfeld erstellen
private void kartenZeichnen(FlowPane feld) {
int count = 0;
for (int i = 0; i <= 41; i++) {
//eine neue Karte erzeugen
karten = new MemoryKarte(bilder[count], count);
//bei jeder zweiten Karte kommt auch ein neues Bild
if ((i + 1) % 2 == 0)
count++;
}
//die Karten ins Spielfeld gesetzt
for (int i = 0; i <= 41; i++) {
feld.getChildren().add(karten);
//die Position der Karte setzen
karten.setBildPos(i);
}
}
}[/CODE]
[CODE lang="java" title="MemoryFX.java"]import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class MemoryFX extends Application{
@Override
public void start(Stage meineStage) throws Exception {
//den obersten Knoten erzeugen
//hier verwenden wir ein FlowPane
//erzeugt wird die Oberfläche über eine eigene
//Methode in der Klasse MemoryFeld
FlowPane rootNode = new MemoryFeld().initGUI(new FlowPane());
//die Szene erzeugen
//an den Konstruktor werden der oberste Knoten und
//die Größe übergeben
Scene meineScene = new Scene(rootNode, 480, 550);
//den Titel über stage setzen
meineStage.setTitle("Memory");
//die Szene setzen
meineStage.setScene(meineScene);
//Größenänderungen verhindern
meineStage.setResizable(false);
//und anzeigen
meineStage.show();
}
public static void main(String[] args) {
//der Start
launch(args);
}
}[/CODE]
ich habe in JavaFX versucht ein Memory-Spiel zu erstellen. Leider werden diverse Exceptions geworfen bei der Ausführung. Ich kann aber den Fehler nicht finden. Wäre super, wenn mir einer helfen könnte:
[CODE lang="java" title="MemoryKarte.java"]import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.image.ImageView;
//die Klasse für eine Karte des Memory-Spiels
//Sie erbt von Button
public class MemoryKarte extends Button {
//die Instanzvariablen
//eine eindeutige ID zur Identifizierung des Bildes
private int bildID;
//für die Vorder- und Rückseite
private ImageView bildVorne, bildHinten;
//wo liegt die Karte im Spielfeld
private int bildPos;
//ist die Karte umgedreht?
private boolean umgedreht;
//ist die Karte noch im Spiel?
private boolean nochImSpiel;
//die innere Klasse für den Eventhandler
class KartenListener implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent arg0) {
//ist die Karte überhaupt noch im Spiel?
if (nochImSpiel == false)
return;
//wenn die Rückseite zu sehen ist, die Vorderseite anzeigen
if (umgedreht == false) {
setGraphic(bildVorne);
umgedreht = true;
}
}
}
//der Konstruktor
//er setzt die Bilder
public MemoryKarte(String vorne, int bildID) {
//die Vorderseite, der Dateiname des Bildes wird an
//den Konstruktor übergeben
bildVorne = new ImageView(vorne);
//die Rückseite, sie wird fest gesetzt
bildHinten = new ImageView("Grafik/back.jpg");
setGraphic(bildHinten);
//die Bild-ID
this.bildID = bildID;
//die Karte ist erst einmal umgedreht und noch im Feld
umgedreht = false;
nochImSpiel = true;
//die Action setzen
setOnAction(new KartenListener());
}
//die Methode zeigt die Rückseite der Karte an
public void rueckseiteZeigen(boolean rausnehmen) {
//soll die Karte komplett aus dem Spiel genommen werden?
if (rausnehmen == true) {
//das Bild aufgedeckt zeigen und die Karte aus dem Spiel nehmen
setGraphic(new ImageView("Grafik/aufgedeckt.jpg"));
nochImSpiel = false;
}
else {
//sonst nur die Rückseite zeigen
setGraphic(bildHinten);
umgedreht = false;
}
}
//die Methode liefert die Bild-ID einer Karte
public int getBildID() {
return bildID;
}
//die Methode liefert die Position einer Karte
public int getBildPos() {
return bildPos;
}
//die Methode setzt die Position einer Karte
public void setBildPos(int bildPos) {
this.bildPos = bildPos;
}
}[/CODE]
[CODE lang="java" title="MemoryFeld.java"]import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
public class MemoryFeld {
//das Array für die Karten
private MemoryKarte[] karten;
//das Array für die Namen der Grafiken
private String[] bilder = {"Grafik/apfel.jpg", "Grafik/birne.jpg", "Grafik/blume.jpg", "Grafik/blume2.jpg", "Grafik/ente.jpg", "Grafik/fisch.jpg", "Grafik/fuchs.jpg", "Grafik/igel.jpg", "Grafik/kaenguruh.jpg", "Grafik/katze.jpg", "Grafik/kuh.jpg", "Grafik/maus1.jpg", "Grafik/maus2.jpg", "Grafik/maus3.jpg", "Grafik/melone.jpg", "Grafik/pilz.jpg", "Grafik/ronny.jpg", "Grafik/schmetterling.jpg","Grafik/sonne.jpg", "Grafik/wolke.jpg", "Grafik/maus4.jpg"};
//für die Punkte
private int menschPunkte, computerPunkte;
//zwei Labels für die Punkte
private Label menschPunkteLabel, computerPunkteLabel;
//wie viele Karten sind aktuell umgedreht?
private int umgedrehteKarten;
//für das aktuell umdrehte Paar
private MemoryKarte[] paar;
//für den aktuellen Spieler
private int spieler;
//das Gedächtnis für den Computer
//er speichert hier, wo das Gegenstück liegt
private int[][] gemerkteKarten;
//der Konstruktor
public MemoryFeld() {
//das Array für die Karten erstellen, insgesamt 42 Stück
karten = new MemoryKarte[42];
//für das Paar
paar = new MemoryKarte[2];
//für das Gedächtnis
//es speichert für jede Karte paarweise die Position im Spielfeld
gemerkteKarten = new int[2][21];
//keiner hat zu Beginn einen Punkt
menschPunkte = 0;
computerPunkte = 0;
//es ist keine Karte umgedreht
umgedrehteKarten = 0;
//der Mensch fängt an
spieler = 0;
//es gibt keine gemerkten Karten
for (int aussen = 0; aussen < 2; aussen++)
for (int innen = 0; innen < 21; innen++)
gemerkteKarten[aussen][innen] = -1;
}
//die Methode erstellt die Oberfläche und zeichnet die Karten über eine eigene Methode
//übergeben wird ein FlowPane
public FlowPane initGUI(FlowPane feld) {
//für die Ausgaben
kartenZeichnen(feld);
menschPunkteLabel = new Label();
computerPunkteLabel = new Label();
menschPunkteLabel.setText(Integer.toString(menschPunkte));
computerPunkteLabel.setText(Integer.toString(computerPunkte));
//in zwei Spalten anzeigen
GridPane tempGrid = new GridPane();
//und einfügen, dabei werden die Koordinaten angegeben
tempGrid.add(new Label("Mensch: "), 0 , 0 );
tempGrid.add(menschPunkteLabel, 1, 0);
tempGrid.add(new Label("Computer: "), 0, 1);
tempGrid.add(computerPunkteLabel, 1 ,1);
feld.getChildren().add(tempGrid);
return feld;
}
//das eigentliche Spielfeld erstellen
private void kartenZeichnen(FlowPane feld) {
int count = 0;
for (int i = 0; i <= 41; i++) {
//eine neue Karte erzeugen
karten = new MemoryKarte(bilder[count], count);
//bei jeder zweiten Karte kommt auch ein neues Bild
if ((i + 1) % 2 == 0)
count++;
}
//die Karten ins Spielfeld gesetzt
for (int i = 0; i <= 41; i++) {
feld.getChildren().add(karten);
//die Position der Karte setzen
karten.setBildPos(i);
}
}
}[/CODE]
[CODE lang="java" title="MemoryFX.java"]import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
public class MemoryFX extends Application{
@Override
public void start(Stage meineStage) throws Exception {
//den obersten Knoten erzeugen
//hier verwenden wir ein FlowPane
//erzeugt wird die Oberfläche über eine eigene
//Methode in der Klasse MemoryFeld
FlowPane rootNode = new MemoryFeld().initGUI(new FlowPane());
//die Szene erzeugen
//an den Konstruktor werden der oberste Knoten und
//die Größe übergeben
Scene meineScene = new Scene(rootNode, 480, 550);
//den Titel über stage setzen
meineStage.setTitle("Memory");
//die Szene setzen
meineStage.setScene(meineScene);
//Größenänderungen verhindern
meineStage.setResizable(false);
//und anzeigen
meineStage.show();
}
public static void main(String[] args) {
//der Start
launch(args);
}
}[/CODE]