/README.md

https://bitbucket.org/dividuum/rocket-scissor-spacegoo · Markdown · 120 lines · 98 code · 22 blank · 0 comment · 0 complexity · a3775e261d1d0eec060c15a14d3cf778 MD5 · raw file

  1. Programmierspiel GPN13
  2. ======================
  3. Worum es geht: 2 Spieler spielen solange bis maximale Anzahl von Runden
  4. erreicht wurde oder einer der Spieler keine Raumschiffe und Planeten mehr
  5. besitzt. Jeder Spieler hat zu Spielbeginn mindestens einen Startplaneten.
  6. Jeder Planet hat eine feste Produktion, welche angibt, wieviele Raumschiffe
  7. pro Runde dort dazukommen.
  8. Beide Spieler verbinden sich per TCP Socket zum zentralen Spielserver. Sobald
  9. 2 oder mehrere Spieler verfuegbar sind, werden diese in ein Spiel geschickt.
  10. Pro Runde bekommt jeder der beiden Spieler den kompletten Spielzustand als
  11. JSON gesendet. Es gibt 2 gueltige Spielzuege: Es kann von einem der eigenen
  12. Planeten eine Menge von Raumschiffen zu einem anderen Planet losgeschickt
  13. werden. Oder es kann in der Runde keine Aktion stattfinden. Wird innerhalb von
  14. 3 Sekunden kein Spielzug uebermittelt, so wird der Spieler dafuer
  15. disqualifiziert.
  16. Flotten bewegen mehrere Runden, bis sie ihren Zielplanet erreichen. Die
  17. Flugzeit haengt von der Entfernung zwischen den Planeten ab. Kommen Flotten
  18. auf einem Planet an, so kaempfen diese, bis ein Spieger uebrig bleibt. Gewinnt
  19. der Angreifer, so geht der Planet in den Besitz des Angreifers ueber.
  20. Protokoll
  21. ---------
  22. Auf den Spielserver per TCP verbinden. Als erster Befehl muss
  23. login <username> <passwort>
  24. geschickt werden. Beim ersten verbinden werden username/passwort gespeichert
  25. und muessen dann beim naechsten Mal einloggen identisch wiederverwendet
  26. werden. Es gibt kein Passwort reset oder Account loeschen.
  27. Weitere beliebige Ausgaben folgen, bis irgendwann ein Spiel anfaengt. In
  28. diesem Moment bekommen beide Spieler den kompletten Spielzustand per JSON
  29. zugeschickt. Spielzustande sind immer per einleitendem '{' erkennbar.
  30. Als Antwort auf einen Spielzustand muss innerhalb von 3 Sekunden eine Antwort
  31. an den Server geschickt werden. Es gibt 2 Antworten:
  32. nop
  33. gibt an, dass keinerlei Aktion stattfinden soll.
  34. send <source_planet_id> <target_planet_id> <num_a> <num_b> <num_c>
  35. gibt an, dass vom eigenen Planet source_planet_id die angegebene Anzahl von
  36. Schiffen zu Planet target_planet_id gesendet werden sollen.
  37. Sobald beide Spieler ihren Spielzug gemacht haben, geht das Spiel in die
  38. naechste Runde und beide Spieler bekommen wieder den kompletten Spielzustand
  39. gesendet.
  40. Ein Spielstand sieht folgendermassen aus:
  41. {
  42. "game_over": false,
  43. "winner": null, // player_id
  44. "round": 2
  45. "max_rounds": 500,
  46. "fleets": [
  47. {
  48. "id": 0,
  49. "owner_id": 1, // player_id
  50. "origin": 1, // planet_id
  51. "target": 2, // planet_id
  52. "ships": [ 3, 1, 1 ], // Anzahlen Typ a, b, c
  53. "eta": 45 // Ankunftsrunde (s.u.)
  54. },
  55. ...
  56. ],
  57. "players": [
  58. {
  59. "id": 1,
  60. "name": "dividuum",
  61. "itsme": true
  62. },
  63. {
  64. "id": 2,
  65. "name": "cupe",
  66. "itsme": false
  67. }
  68. ],
  69. "planets": [
  70. {
  71. "id": 0,
  72. "owner_id": 0, // player_id
  73. "y": 0,
  74. "x": 0,
  75. "ships": [ 20, 20, 20 ], // aktuelle Schiffsanzahl Typ a, b, c
  76. "production": [ 1, 1, 1 ] // Produktion/Runde Typ a, b, c
  77. },
  78. ...
  79. ],
  80. }
  81. Das Spiel ist beendet, sobald in game_over true steht. Nachdem ein solcher
  82. State vom Spieler empfangen wurde, gilt das Spiel als beendet und der Spieler
  83. wird vom Server getrennt. Der Spieler kann sich daraufhin direkt wieder neu
  84. anmelden.
  85. Flotten kommen im Anschluss an die Runde am Zielplanet an. Beispiel: Ist eta
  86. als Runde 10 angegeben, so kommt die Flotte nach Abgabe der Befehle fuer Runde
  87. 10 an. In Runde 11 existiert die Flotte dann nicht mehr.
  88. Planeten gehoeren immer einem Spieler. Zu beginnt gehoert jedem Spieler
  89. mindestens ein Planet. Die anderen Planeten gehoeren dem Spieler mit der
  90. player_id 0. Auf Planeten die diesem NPC Spieler gehoeren ist zwar eine
  91. Produktion angegeben, allerdings waechst die Anzahl der Schiffe dort nicht an.
  92. Dies passiert erst, wenn einer der beiden echten Spieler den Planet
  93. uebernimmt.
  94. Client-Libraries
  95. ----------------
  96. Haskell-Programmierer können das Haskell-Paket
  97. [`haskell-spacegoo`](https://bitbucket.org/nomeata/haskell-spacegoo) verwenden,
  98. um komfortabel Clients zu programmieren.