Futtatás:
python3 arena.py
A két kliens a 'localhost' 10000 portra kell csatlakozzon ahhoz, hogy tudjanak kommunikálni a szerverrel.
Valósítsunk meg egy klienst úgy, hogy a bot játékos tudjon csatlakozni egy szerverhez socketen keresztül és JSON formátumú üzenetekkel kommunikáljon vele. A kliens több játékot (kört) kell tudjon játszani egy másik (bot) játékos ellen egy K*K méretű pályán. A pálya sorai, illetve oszlopai 0-tól (K - 1)-ig vannak számozva.
A kliens a localhost:10000 címre kell csatlakozzon (tcp kapcsolattal). A sikeres csatlakozás esetén a szerver küld egy inicializációs üzenetet, amelyben szerepel a pálya mérete, és az éppen csatlakozó játékos sorszáma. A játékosok lehetséges sorszámai: 1 vagy 2. Az üzenet struktúrája a következő:
{
"cmd": "init",
"K": <pálya mérete>,
"id": <játékos id-ja>
}
Példa: {"cmd": "init", "K": 7, "id": 2}
A kliens jelzi, hogy megkapta az üzenetet:
{
"status": "OK"
}
Minden új kör elején a szerver küld egy "start" üzenetet, a játékosok kezdő pozícióival:
{
"cmd": "start",
"coords": [<x1>, <y1>], // az aktuális játékos koordinátája
"op_coords": [<x2>, <y2>] // az ellenfél játékos koordinátája
}
Példa: {"cmd": "start", "coords": [0, 2], "op_coords": [4, 2]}
Ez az üzenet jelzi, hogy egy új kör kezdődött, a szerver nem küld egy külön üzenetet, hogy befejeződött az előző kör. A kliens ebben az esetben is jelzi, hogy megkapta az üzenetet:
{
"status": "OK"
}
Amikor a kliens kell lépjen, akkor ezt a szerver jelzi egy üzenettel, amelyben szerepel az ellenfél előző lépése is. Ha ez az első lépés, azaz az ellenfélnek nem volt még előző lépése, akkor a "move" és "exclude" mezők null-t tartalmaznak.
{
"cmd": "move",
"move": [<x1>, <y1>],
"exclude": [<x2>, <y2>]
}
Példa: {"cmd": "move", "move": [1, 3], "exclude": [4, 1]}
A kliens ezután válaszol egy hasonló json objektummal, amiben jelzi az ő lépését a "move"
és "exclude"
mezőkkel:
{
"move": [<x1>, <y1>],
"exclude": [<x2>, <y2>]
}
Példa: {"move": [2, 2], "exclude": [4, 4]}
Amiután az összes játszma véget ért, ezt az üzenetet kapják a játékosok:
{
"cmd": "over",
"winner": <játékos id> // null-t tartalmaz döntetlen esetén
}
Amikor a kliens nem megfelelő mezőre akar lépni, vagy olyan mezőt akar kizárni, amelyet nem lehet, akkor a szerver mindkét játékosnak üzenetet küld. Amikor a játékos hibás mezőre akar lépni, vagy hibás mezőt akar kizárni, akkor automatikusan elveszíti azt a kört és új játék kezdődik.
{
"cmd": "error",
"msg": <üzenet>, // a hibát leiró specifikusabb üzenet
"id": <játékos id> // az a játékos, aki hibás mezőt jelölt meg
}
Példa: {"cmd": "error", "msg": "invalid input", "id": 1}
Hogyha a kliens futása során valamilyen hiba (exception) lép fel, akkor küldjön egy üzenetet, amelyben szerepel a "client_error"
mező.
Példa:
{
"client_error": true,
"msg": <üzenet>
}