PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spiel in Java


Sephiroth
2006-05-02, 18:00:08
Ich soll in Java "Stein, Schere, Papier" als Server-Client Version programmieren.

Dabei dachte ich an zunächst an Threads. Zwei Clients sollen miteinander spielen: Stein, Schere oder Papier wählen, dann wird ausgewertet (mit Punkten ala Fußball) und schließlich die Frage, ob weitergespielt werden soll oder nicht.

Zunächst: zwei Spieler verbinden sich mit dem Server, warten ggf. auf den 2. Spieler und dann geht's los.

Später (vielleicht): Spieler verbinden sich zum Server und können ein Spiel erstellen oder beitreten. Je Spiel immer zwei Spieler. Verläßt der Eröffner des Spiels das Spiel, so soll auch der 2. Spieler rausgeworfen werden und das Spiel soll "verschwinden". Geht der 2. Spieler, wird dies auch dem "Eröffner" mitgeteilt und er muß warten bis ein neuer Mitspieler kommt oder er verläßt auch das Spiel.


Ich hab seit einem Jahr nix mehr mit Java gemacht und bin für jede Hilfe dankbar.

Bereits erstellt habe ich den Server (Thread), der einfach auf einem Socket auf Verbindungen von Clients lauscht. Verbindet sich einer, wird ein weiterer Thread erstellt, der sich dann um den Client kümmert.

Irgendwie würde ich gerne immer zwei Clients eine Art Session zuweisen (der erste erstellt sie und der zweite wird dieser autom. zugewiesen). Clients gleicher Session spielen dann immer miteinander. Wobei ich auch überlegt habe das anfangs sein zu lassen und der Server wartet einfach bis sich 2 Leute verbunden haben und legt dann los. :|

Senior Sanchez
2006-05-02, 18:40:25
Sephiroth[/POST]']
Irgendwie würde ich gerne immer zwei Clients eine Art Session zuweisen (der erste erstellt sie und der zweite wird dieser autom. zugewiesen). Clients gleicher Session spielen dann immer miteinander. Wobei ich auch überlegt habe das anfangs sein zu lassen und der Server wartet einfach bis sich 2 Leute verbunden haben und legt dann los. :|

Na dann erzeuge ne UID und speichere zu jeder ID die existenten Verbindungen. UIDs mit nur einer aktiven Verbindung werden logischerweise zuerst dann abgearbeitet wenn sich ein neuer Client verbindet.

Monger
2006-05-02, 22:30:09
Ich würde an deiner Stelle erstmal sauber alle Methoden ausarbeiten, die die Clients an den Server stellen können.

So auf Anhieb fällt mir da ein:

- Anfrage auf Spiel starten (wird nur ausgeführt, wenn mindestens zwei Mitspieler drin sind)
- Anfrage auf neue Runde (optional?!?)
- Übermitteln des eigenen Spielzugs (d.h. eben Schere-Stein-Papier)
- Ergebnis abfragen

Am besten geht alle Initiative vom Client aus, d.h. der Client fragt, der Server antwortet, niemals umgekehrt. So erspart man sich viel Ärger. Der Worker Thread des Servers antwortet also immer nur, und wartet dann wieder auf die nächste Frage.

Ich denke, das hier sollte dir weiterhelfen:
http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

Sephiroth
2006-05-02, 23:19:26
Senior Sanchez[/POST]']Na dann erzeuge ne UID und speichere zu jeder ID die existenten Verbindungen. UIDs mit nur einer aktiven Verbindung werden logischerweise zuerst dann abgearbeitet wenn sich ein neuer Client verbindet. ähm, und wie? Der Server verwaltet die Sessions (ID, Anzahl Clients, und Client Verbindungen). Wie lasse ich nun die beiden Threads für die beiden Clients miteinander zusammenarbeiten? Ich mein Client #1 schickt an seinen ServerThread #1, ob er einer Sitzung beitreten will oder eröffnen und dann irgendwann welchen Spielzug er gemacht hat. Analog für Client #2. Müssen die ServerThreads der Clients diese Angaben dann an einen dritten Thread senden, der eine solche Sitzung verwaltet? Wie ginge das?

Monger
2006-05-03, 08:29:56
Sephiroth[/POST]']ähm, und wie? Der Server verwaltet die Sessions (ID, Anzahl Clients, und Client Verbindungen). Wie lasse ich nun die beiden Threads für die beiden Clients miteinander zusammenarbeiten? Ich mein Client #1 schickt an seinen ServerThread #1, ob er einer Sitzung beitreten will oder eröffnen und dann irgendwann welchen Spielzug er gemacht hat. Analog für Client #2. Müssen die ServerThreads der Clients diese Angaben dann an einen dritten Thread senden, der eine solche Sitzung verwaltet? Wie ginge das?

An deiner Stelle würde ich erst einen Session Thread machen. Wie in dem Knock Knock Beispiel, nur dass du eben auf zwei (drei, vier...) Connection Accepts wartest. Dann machst du damit einen neuen Thread auf. Dieser Thread kennt jetzt alle Verbindungen, und bildet sozusagen die gemeinsame Wissensplattform dieser beiden Connections. Dieser Thread erzeugt selbst jetzt wieder eigene Threads, um jede Verbindung mit Informationen zu füttern.