Kartenspiel mit JavaFX - Allgemeines Vorgehen

Hallo,

ich bin dabei ein Kartenspiel zu implementieren. Bisher habe ich auf simple Textausgabe gesetzt, um mich auf die Implementierung der Regeln zu konzentrieren. Dazu wurde ein Thread gestartet, der die Regeln abarbeitet und auf Benutzereingabe wartet, sobald ein Spieler an der Reihe ist. Durch das Eingeben einfacher Befehle wurde eine Auswahl getroffen und wieder werden so lange die Regeln abgearbeitet, bis ein Spieler seine Eingabe machen kann. So weit so gut.

Nun möchte ich eine GUI drüberstülpen, tue mir aber etwas schwer. In die Grundlagen von JavaFX und den SceneBuilder habe ich mich eingearbeitet. Bei der Kommunikation mit dem eventgetriebenen Spielthread tue ich mir aber noch etwas schwer. Es gibt sicherlich Klassen/Verfahren, die mich bei meinem Vorhaben gut unterstützen, momentan fehlen mir aber ein bisschen die Stichworte und ich habe mich glaub etwas verrant.

Fest steht:
[ul]
[li]In einem eigenen Thread laufen die Spielberechnungen und warten an vorgegeben Stellen auf Benutzereingabe.
[/li][li]Die Benutzereingabe erfolgt durch das Klicken von Buttons oder Zellen in ListViews (so werden Karten aktuell dargestellt)
[/li][li]Während Berechnungen im Spielthread laufen, soll die Benutzereingabe nicht möglich sein/verworfen werden.
[/li][/ul]

Das ist jetzt alles bisschen abstrakt beschrieben, allerdings strauchle ich auch gerade auf der konzeptionellen Ebene und nicht an einem konkreten Code-Problem.

Grüße,
TheChemist

kann man im Zweifel auch einfach gestalten ohne groß bestimmte Mechanismen vorauszusetzen:

GUI abschalten/ Eingaben verhindern musst du können, das wäre ein ‚konkretes Code-Problem‘, wenn nicht bekannt für sich nachzuschlagen
→ der Spielethread muss entsprechend Zugriff haben und schaltet dies ein/ aus wann er es für richtig hält,
kann vielleicht noch eine deutlichere Anzeige veranlassen wenn es weitergeht


bei Eingaben rüber zu einem unabhängigen Thread ist der einfache Standard, die Informationen dort nur in eine Variable zu schreiben,

  • wahrscheinlich noch den Thread aufwecken,
    anders als vielleicht bisher sollte der nicht an der Eingabe warten sondern mit sleep oder wait/ notify, bekannt oder informieren

mehr ist nicht unbedingt zu tun, der Thread muss dann selber aktiv werden,
evtl. an dieser Stelle sofort die GUI deaktivieren, nicht warten bis der Thread das macht


falls wie bei Swing der Fall vorliegt, dass die GUI blockiert ist, während eine Eingabe verarbeitet wird,
könnte man das hier für dich nutzen:
dem GUI-Thread bei einem Event die gesamte weitere Arbeit überlassen, kein separater Thread,
den du ja anscheinend auch nicht für sonstige Zeiten zwischendurch brauchst,

von einem Listener oder ähnlichem aus mit den neuen Eingaben zusammen mit alten Stand alles nötige berechnen

solange der GUI-Thread arbeitet ist die GUI blockiert (allerdings auch kein Neuzeichnen, evtl. Grafikfehler bei Überlappen mit anderen Fenstern, keine Zwischenanzeige möglich),
wenn fertig dann GUI wieder verfügbar,
GUI-ändernde Befehle währenddessen problemlos, bei einem separaten Thread muss man immer vorsichtig sein, zumindest in Swing

auf Eingaben wird ansonsten durch die GUI sowieso ‚gewartet‘, macht erwartungsvolle Pause,
alle gewünschten Features ganz natürlich und einfach erreicht :wink:

[QUOTE=SlaterB]kann man im Zweifel auch einfach gestalten ohne groß bestimmte Mechanismen vorauszusetzen:

GUI abschalten/ Eingaben verhindern musst du können, das wäre ein ‘konkretes Code-Problem’, wenn nicht bekannt für sich nachzuschlagen
-> der Spielethread muss entsprechend Zugriff haben und schaltet dies ein/ aus wann er es für richtig hält,
kann vielleicht noch eine deutlichere Anzeige veranlassen wenn es weitergeht
[/QUOTE]

Das Programm ist bisher weitestgehend nach dem MVP-Pattern aufgebaut. Das heißt, der Spielthread sollte von der GUI angestoßen werden und “reinschauen” können, ob gerade gerechnet wird.

[QUOTE=SlaterB;123955]
bei Eingaben rüber zu einem unabhängigen Thread ist der einfache Standard, die Informationen dort nur in eine Variable zu schreiben,

  • wahrscheinlich noch den Thread aufwecken,
    anders als vielleicht bisher sollte der nicht an der Eingabe warten sondern mit sleep oder wait/ notify, bekannt oder informieren

mehr ist nicht unbedingt zu tun, der Thread muss dann selber aktiv werden,
evtl. an dieser Stelle sofort die GUI deaktivieren, nicht warten bis der Thread das macht


falls wie bei Swing der Fall vorliegt, dass die GUI blockiert ist, während eine Eingabe verarbeitet wird,
könnte man das hier für dich nutzen:
dem GUI-Thread bei einem Event die gesamte weitere Arbeit überlassen, kein separater Thread,
den du ja anscheinend auch nicht für sonstige Zeiten zwischendurch brauchst,

von einem Listener oder ähnlichem aus mit den neuen Eingaben zusammen mit alten Stand alles nötige berechnen

solange der GUI-Thread arbeitet ist die GUI blockiert (allerdings auch kein Neuzeichnen, evtl. Grafikfehler bei Überlappen mit anderen Fenstern, keine Zwischenanzeige möglich),
wenn fertig dann GUI wieder verfügbar,
GUI-ändernde Befehle währenddessen problemlos, bei einem separaten Thread muss man immer vorsichtig sein, zumindest in Swing

auf Eingaben wird ansonsten durch die GUI sowieso ‘gewartet’, macht erwartungsvolle Pause,
alle gewünschten Features ganz natürlich und einfach erreicht ;)[/QUOTE]

Einfach alles im GUI-Thread machen und ihn somit für die nötige Zeit blockieren, möchte ich nicht machen. Ich verfolge auch das Ziel zu lernen, wie man sauber Programme mit JavaFX aufbaut, da ist das eher kontraproduktiv.

Was man bei JavaFX immer im Hinterkopf behalten muss (vorallem bei sparaten Threads), dass eine Änderung an der GUI außerhalb des GUI Threads viel stärker bestraft wird.

Desweiteren kann man für solche “Komponenten informieren” sachen, die Properties nutzen. Z.B. im Spielethread ein Booleanproperty haben und wenn eine Änderung gemacht wird (diese dann wohl auf dem GUI Thread auch wenn ich nicht 100% sicher bin wie sehr es doch nötig ist in einem solchen Fall) kriegt die GUI das automatisch mit. So könnte man das disable property der nötigen Komponenten da dran binden. So wäre der Spielethread dann wohl auch relativ unabhänig von der GUI (nicht direkt vom Framework wegen dem GUI-Thread).

Hoffe das hilft dir eventuell

MfG
Clayn