Valósítsd meg az alábbi játékot, amelyben világutazókat ábrázolunk.
A játék fő osztálya a WorldMain
, ez induláskor elindít egy szervert a 4321
porton. A szerver egyszerre több klienst is ki tud szolgálni. A szerverrel szövegesen lehet kommunikálni, és a következő utasításokat lehet kiadni egy-egy sorban:
city <név>
: a megadott nevű város létrejön, mint célpont
35000..35010
intervallumból véletlenszerűen választ számára egy portot
failed
, és nem jön létre a városcityinfo <név>
: a szerver elküldi a megadott nevű város portját (vagy a none
üzenetet, ha nincsen ilyen város)citylist
: a szerver elküldi egy-egy sorban a létező városok nevét, majd egy üres sortperson <név>
: létrejön egy új utazó a megadott névvel
failed
üzenetet, és nem jön létre az utazó36000..37000
intervallumból a legkisebb, még nem foglalt portot neki
3
, ha a 36003
portra került az utazó<név> <sorszám>
, pl. Joe 3
, ha Joe
a 36003
portra kerültpersons.txt
fájl sorai közül véletlenszerűen választ egy nevet nekido <név vagy port vagy sorszám> <akció>
: az utazó a megadott akciót teszi meg
Joe
vagy 3
vagy 36003
a fenti utazó esetén
failed
done
üzenetet küld vissza a kliensnekfinished <név>
: az utazó így jelzi, hogy befejezte a működését
exit
üzenetben leírtak megvalósítása részben ide kerül majdexit
: a szerver leállít minden várost és utazót (kapcsolódik a portjaikra és elküldi nekik az exit
üzenetet), majd kilép
finished
üzenetet, és utána állítja le a városokatinfo
adatokat a városról, és kiírja a városokat kétszer a sztenderd kimenetre:
Best city to take a selfie
üzenet után sorolja fel őket a városban készült szelfik darabszáma szerinti csökkenő sorrendben (egyenlőség esetén ábécésorrendben), a darabszámokat is kiírvaBest city to spend money in
üzenet után sorolja fel őket, ekkor az összköltés szerinti sorrendbenexit
működés megkezdődött, a city
és person
üzenetekre failed
választ küld a szerverHa a WorldMain
osztály kap egy parancssori paramétert is, akkor a fenti szerver elindítása mellett a következő tevékenységet is végzi.
3..5
várost (a neveiket véletlenszerűen választja a cities.txt
fájlból).4..8
utazót.exit
üzenetet a szervernek. Ennek hatására a programnak rövid időn belül ki kell lépnie.A városok létrehoznak egy city-<városnév>-<port>.txt
naplófájlt, pl. city-Budapest-35008.txt
.
A városok szekvenciálisan fogadják a kliensek kapcsolódását a portjukon, és a következő utasításokat lehet kiadni a számukra egy-egy sorban:
arrive <név>
: a naplóba bekerül az <idő>: <név> arrived
bejegyzésleave <név>
: a naplóba bekerül az <idő>: <név> left
bejegyzésspend <név> <összeg>
: a naplóba bekerül az <idő>: <név> spent <összeg>
bejegyzésselfie <név>
: a naplóba bekerül az <idő>: <név> took a selfie
bejegyzésinfo
: a szerver egy-egy sorban elküldi, mennyi pénzt költöttek a városban összesen, és hány szelfit készítettekexit
: a város szervere leáll, szála kilép
people have spent <összeg> in total
üzenet, ahol az összeg a látogatók teljes költéseA fentiekben az idő
a város szálának elindulása óta eltelt idő ezredmásodpercben.
Az utazó, amikor elindul, véletlenszerűen választ egy várost a lehetségesek közül, és belép oda (elküldi az arrive
üzenetet).
Az utazók a következő üzeneteket fogadják, ezek a lehetséges akcióik.
go
: az utazó elmegy egy véletlenszerű városba
leave
, az új városnak arrive
üzenetet küldgo <név>
alakban is hívható az akció (ha a felhasználó kézzel kapcsolódik a portra), ekkor a megadott nevű városba megy az utazóspend
és selfie
: a város szerverének a megfelelő üzenetet küldi (spend
esetén 10..1000
közötti véletlen számmal)exit
: az utazó szervere leáll, szála kilép
finished
üzenetetAz utazók önállóan is cselekszenek: 2..5
másodperc elteltével megtesznek egy véletlenszerűen kiválasztott akciót (az exit
kivételével). Amikor az exit
üzenetet megkapják, még megtehetik az utolsó akciójukat, aztán kilépnek.