LU-LSP-b11:projekts

From DiLab
Revision as of 17:19, 20 December 2011 by Atis (talk | contribs)
Jump to: navigation, search

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.

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 ^ vai $ simbolus.

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 X 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.