Ich arbeite an einem allgemeinen Spieleserver, der Spiele für eine beliebige Anzahl von TCP-Socket-vernetzten Clients verwaltet, die ein Spiel spielen. Ich habe ein Design zusammen mit Klebeband gehackt, das funktioniert, aber gleichzeitig fragil und unflexibel zu sein scheint. Gibt es ein etabliertes Muster für das Schreiben von Client / Server-Kommunikation, das robust und flexibel ist? (Wenn nicht, wie würden Sie verbessern, was ich unten habe?)
Grob habe ich das:
- Während der Einrichtung eines Spiels verfügt der Server über einen Thread für jeden Player-Socket, der synchrone Anforderungen von einem Client und Antworten vom Server verarbeitet.
- Sobald das Spiel läuft, werden jedoch alle Threads mit Ausnahme von einem Schlaf-Thread durch alle Spieler nacheinander durchlaufen, um über ihren Zug zu kommunizieren (in umgekehrter Anfrage-Antwort-Reihenfolge).
Hier ist ein Diagramm von dem, was ich derzeit habe; Klicken für größere / lesbare Version oder 66kB PDF .
Probleme:
- Die Spieler müssen genau nacheinander mit genau der richtigen Nachricht antworten. (Ich nehme an, ich könnte jeden Spieler mit zufälligem Mist antworten lassen und erst weitermachen, wenn er mir einen gültigen Zug gibt.)
- Es erlaubt Spielern nicht, mit dem Server zu sprechen, es sei denn, sie sind an der Reihe. (Ich könnte sie vom Server über andere Spieler informieren lassen, aber keine asynchrone Anfrage bearbeiten.)
Endgültige Anforderungen:
Leistung ist nicht von größter Bedeutung. Dies wird hauptsächlich für Nicht-Echtzeit-Spiele verwendet, und hauptsächlich, um AIs gegeneinander auszuspielen, nicht für nervöse Menschen.
Das Spiel wird immer rundenbasiert sein (auch wenn die Auflösung sehr hoch ist). Jeder Spieler erhält immer einen Zug, bevor alle anderen Spieler an die Reihe kommen.
Die Implementierung des Servers geschieht in Ruby, wenn das einen Unterschied macht.