Difference between revisions of "LU-LSP-b11:projekts"
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{TocRight}} |
{{TocRight}} |
||
Uzdevums: izstrādāt |
Uzdevums: izstrādāt klienta-servera sistēmu reālā laika daudzlietotāju stratēģiskai datorspēlei "Tanciņi". |
||
= Spēle = |
= Spēle = |
||
Line 42: | Line 42: | ||
* Kartes informācijas saņemšana no servera |
* Kartes informācijas saņemšana no servera |
||
* Spēles pasaules pārzīmēšana |
* Spēles pasaules pārzīmēšana |
||
Šāviņu trajektorijas rēķināšanu ieteicams realizēt arī klienta pusē. Ja no servera pēc tam tomēr tiek saņemta konfliktējoša kartes informācija, jāizmanto tā. |
|||
= Direktorijas serveris = |
= Direktorijas serveris = |
||
Uztur informāciju par aktīvajiem serveriem. |
Uztur informāciju par aktīvajiem serveriem. |
||
Atbalsta šādas komandas: |
|||
==== Komanda SERVER LIST ==== |
==== Komanda SERVER LIST ==== |
||
Line 74: | Line 78: | ||
Komandas piemērs: |
Komandas piemērs: |
||
^ |
^G U$ |
||
Nozīme: "go up" - virzīties uz augšu. |
Nozīme: "go up" - virzīties uz augšu. |
||
Komandu parameterus vienu no otra atdala ar kādu no whitespace simboliem: tukšumu, tab ('\t'), newline ('\n') vai carriage return ('\r') simboliem. Ja ir vairāki whitespace simboli pēc kārtas, tie jāuztver analoģiski vienam. |
Komandu parameterus vienu no otra atdala ar kādu no whitespace simboliem: tukšumu, tab ('\t'), newline ('\n') vai carriage return ('\r') simboliem. Ja ir vairāki whitespace simboli pēc kārtas, tie jāuztver analoģiski vienam. |
||
Pa soketiem bez komandām var tikt pārsūtīta arī cita veida informācija. Piemēram, atkļūdošanas printf() funkciju rezultāti. Tādu informāciju var ignorēt, kamēr vien tā nesatur ^ |
Pa soketiem bez komandām var tikt pārsūtīta arī cita veida informācija. Piemēram, atkļūdošanas printf() funkciju rezultāti. Tādu informāciju var ignorēt, kamēr vien tā nesatur ^ simbolu. |
||
=== Komandas === |
=== Komandas === |
||
Line 104: | Line 108: | ||
Map info komandas parametri: |
Map info komandas parametri: |
||
* Kartes dimensijas: divi skaitļi N (platums) un M (augstums). |
* Kartes dimensijas: divi skaitļi N (platums) un M (augstums). |
||
* NxM burtus gara karte ar terrain type. piemēram: "R R R R |
* NxM burtus gara karte ar terrain type. piemēram: "R R R R O R ...". Karti sūta, sākot no augšējās rindas, no kreisās puses uz labo. |
||
* Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi: |
* Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi: |
||
"O-burts Tips X-koordināta Y-koordināta [citi paramteri]" |
"O-burts Tips X-koordināta Y-koordināta [citi paramteri]" |
Latest revision as of 18:25, 20 December 2011
Uzdevums: izstrādāt klienta-servera sistēmu reālā laika daudzlietotāju stratēģiskai datorspēlei "Tanciņi".
Spēle
Ir pasaules karte ar NxM šūnām. Katrā šūnā ir kāds konkrēts zemes tips (terrain type).
Katrā šūnā var būt viens objekts (tanks vai šāviņš).
Spēle notiek līdz "last tank standing" - brīdim, kad palicis tikai viens tanciņš.
Serveris
Serverim jābūt savietojamam ar kopējo komunikācijas protokolu - tā, lai visu grupu klienti varētu pie tā slēgties!
Serveris uztur informāciju par klientiem - katram klientam viens atvērts TCP sokets. Ieteicams (bet ne obligāti) katram klientam uzturēt savu pavedienu. Par klientu ieteicams ASCII formātā saglabāt informāciju: IP adrese un ports - iegūstama ar getpeername() + inet_ntoa() funkcijām.
Ieteicams lietot nebloķējošos soketus. Atbloķēšana notiek, atvērtam socket descriptoram 'fd' uzstādot O_NONBLOCK karodziņu:
fcntl(fd, F_SETFL, O_NONBLOCK);
Ieteicams uzstādīt SO_REUSEADDR opciju.
Servera programmā ir "galvenais cikls" (while (1)
vai for (;;)
), tajā notiek:
- No klientiem saņemto datu apstrāde (pati saņemšana var tikt realizēta klientu pavedienos)
- Spēles pasaule pārrēķināšana
Šeit, vai arī atsevišķā pavedienā tiek realizēta arī jaunu klientu konekciju akceptēšana.
Klients
Klients parāda spēles pasauli un statusu uz ekrāna, ielasa ievadi no klaviatūras un komunicē ar serveri.
Klientam jābūt savietojamam ar kopējo komunikācijas protokolu - tā, lai tas spētu slēgties pie visu grupu serveriem!
Ieteicams lietot nebloķējošos soketus.
Par sevi ieteicams ASCII formātā saglabāt informāciju: IP adrese un ports - iegūstama ar getsockname() + inet_ntoa() funkcijām.
Klienta programmā ir "galvenais cikls", tajā notiek:
- Ievades ielasīšana no klaviatūras
- Komandu nosūtīšana uz serveri
- Kartes informācijas saņemšana no servera
- Spēles pasaules pārzīmēšana
Šāviņu trajektorijas rēķināšanu ieteicams realizēt arī klienta pusē. Ja no servera pēc tam tomēr tiek saņemta konfliktējoša kartes informācija, jāizmanto tā.
Direktorijas serveris
Uztur informāciju par aktīvajiem serveriem.
Atbalsta šādas komandas:
Komanda SERVER LIST
- Virziens: C->D
- Apraksts: Klients prasa direktoriju serverim pieejamo serveru sarakstu.
- Pieprasījums: ^L $
- Pieprasījuma piemērs: ^L $
- Atbilde: ^<IP>\t<PORTS>\r<IP>\t<PORTS>$
- Atbildes piemērs: ^192.168.1.101 1337 192.168.1.102 1338$
Komanda ADD SERVER
- Virziens: S->D
- Apraksts: Serveris piesaka sevi direktoriju serverim, lai citi spēlētāji varētu atrast šo serveri. Direktoriju serveris pats noskaidros servera ip. Serveris tiek automātiski izņemts no saraksta 30 sekunžu laikā, tāpēc šī komanda serverim jāizsauc, piemēram, reizi 25 sekundēs.
- Pieprasījums: ^A <PORTS>$
- Pieprasījuma piemērs: ^A 1337$
- Atbilde: ^<SUCCESS>$
- Atbildes piemērs: ^:)$ ^:($
Datu apmaiņas protokols
Izmanto TCP protokola soketus, ports 1337.
ASCII formāts datiem.
Komandas sākumu apzīmē ar '^'.
Komandas beigas apzīmē ar '$'.
Komandas piemērs:
^G U$
Nozīme: "go up" - virzīties uz augšu.
Komandu parameterus vienu no otra atdala ar kādu no whitespace simboliem: tukšumu, tab ('\t'), newline ('\n') vai carriage return ('\r') simboliem. Ja ir vairāki whitespace simboli pēc kārtas, tie jāuztver analoģiski vienam.
Pa soketiem bez komandām var tikt pārsūtīta arī cita veida informācija. Piemēram, atkļūdošanas printf() funkciju rezultāti. Tādu informāciju var ignorēt, kamēr vien tā nesatur ^ simbolu.
Komandas
Klients -> serverim
- S - start game Parametri: nav
- E - disconnect (end game) Parametri: nav
- G - go Parametri: virziens (U, B, L, vai R burti)
- F - shoot (fire) Parametri: nav
- T - stobra kustība (turret movement) (opcionāls) Parametri: virziens (U, B, L, vai R burti)
Serveris -> klientam
- M - map info
Map info parametri
Kartes lauciņi var būt:
- šķērslis (necaurejams tankiem, obstacle) - O
- masīvs šķērslis (necauršaujaums & necaurejams tankiem) - X
- ceļš (road) - R
- zāle (grass, kustība notiek 2x lēnāk, nekā pa ceļu) (opcionāls) - G
- purvs (swamp, kustība notiek 5x lēnāk, nekā pa ceļu) (opcionāls) - S
Map info komandas parametri:
- Kartes dimensijas: divi skaitļi N (platums) un M (augstums).
- NxM burtus gara karte ar terrain type. piemēram: "R R R R O R ...". Karti sūta, sākot no augšējās rindas, no kreisās puses uz labo.
- Nenoteikta garuma saraksts ar objektiem. Objekts tiek aprakstīts šādi:
"O-burts Tips X-koordināta Y-koordināta [citi paramteri]"
Tips:
- T - tanks
- S - shot (šāviņš)
"Citus parametrus" norāda tikai tankam. Tie ir:
- Tanka īpašnieka IP adrese un ports
- Tanka virziens (U, B, L, R)
- Tanka stobra virziens (U, B, L, R)
- Health-status (0-100%)
Objekta piemērs: "O T 1 2 10.0.0.1 33780 L L 100" - tanks lauciņā (1,2), piederošs klientam ar adresi 10.0.0.1 un portu 33780, pavērsts pa kreisi, ar stobru pavērstu pa kreisi, ar 100% veselību.
Koordināta 0 0 atbilst augšējam kreisajam stūrim.