ElfUnknown's - Glacierfight

Responsabili:

Deadline: 08.01.2019 23:55

Actualizări

  • 18.12.2018 - Actualizăre enunț.
  • 20.12.2018 - Adăugare checker.
  • 03.01.2019 - Actualizare checker.

Obiective Temă

  • să se realizeze un program urmând anumite cerințe
  • să se utilizeze funcţii, pentru a modulariza programul
  • să se utilizeze și să se înțeleagă structurile
  • să se însușească cunoștințele din primele 10 laboratoare.

Enunţ

Spiridușii lui Moș Crăciun au ieșit la o bătaie cu bulgări de zăpadă pe un ghețar ce are o suprafață sub formă de cerc, centrat și înscris într-o matrice pătratică cu dimensiuni impare. La început aceștia sunt uscați, fiind caracterizați printr-o valoare specifică $hp$, dar pe măsură ce se bulgăresc, această valoare scade, culminând cu momentul când ajunge la 0 (ud leoarcă) și când spiridușul respectiv va trebui să părăsească ghețarul în spinarea lui Rudolf. Pe lângă gradul de uscare, aceștia mai au și o valoare pentru odihnă (energie) $stamina$ ce va fi explicată mai jos. Fiecare spiriduș poate face bulgări de o anumită dimensiune $dmg$, valoare dată de dimensiunea mănușilor pe care spiridușul le are. În fiecare celulă din ghețar se poate găsi o pereche de mănuși cu o dimensiune mai mare, caz în care spiridușul va arunca în celula respectivă vechile lui mănuși, și le va echipa pe cele noi. Deoarece spiridușii sunt foarte firavi, aceștia pot arunca cu bulgări unii în alții doar atunci când se afla în aceeași celulă. Fiind foarte competitivi, niciunul dintre ei nu vrea să renunțe prea ușor, dorind să îl trimită pe adversar acasă. Când doi spiriduși ajung în aceeași celulă, atacă cel cu stamina mai mare (la stamină egală atacă jucătorul care intră în celula respectivă), scăzând dmg din hp-ul celui de al doilea. Cel de al doilea atacă la rândul său în același mod. Evenimentele se repetă pană când un spiriduș se udă leoarcă și este nevoit să plece. Spiridușul care rămâne, câștigă stamina spiridușului pe care l-a trimis acasă (stamina jucătorului eliminat va fi 0). Ghețarul nu este plat ci are denivelări, astfel pentru ca un spiriduș să se deplaseze de la o celulă la alta, acesta va consuma modulul diferenței înălțimilor dintre cele două celule stamină. Dacă nu are suficientă stamină acesta nu se va mișca în direcția respectivă.

Moș Crăciun știe că spiridușii se joacă pe ghețar și vrea să le aducă aminte din când în când că trebuie să vină înapoi în atelierul de jucării să îl ajute. Așa că el trimite o furtună de bulgări de zăpadă ce va avea epicentrul într-o celulă $x$, $y$ și va scădea $dmg$ din $hp$-ul tuturor spiridușilor ce se află în raza circulară $R$ de epicentru.

Din cauza încălzirii globale, ghețarul se topește, pierzând o unitate din rază. Toți spiridușii ce ies înafară ghețarului vor cădea în apă și se vor uda, fiind nevoiți să plece.

Moș Crăciun este ocupat cu împachetarea cadourilor, așa că are nevoie de voi pentru a urmări distracția spiridușilor. Astfel, Moșul vrea un raport ($scoreboard$) cu cei mai puternici (și în același timp, chiulangii) spiriduși și vă poate suna oricând pentru a-i transmite acest lucru.

Jocul se încheie când mai există un singur jucător pe ghețar.

Date de intrare si iesire:

Fișierul este dat în primul argument al liniei de comandă.

Voi va trebui să citiți din fișierul [nume].in și să afișați în fișierul [nume].out.

Pe prima linie se vor găsi două numere, $R$ și $P$, $R$ reprezentând raza inițială a ghețarului, iar $P$, numărul de jucători.

Pe următoarele $2 * R + 1$ linii se găsesc câte $2 * R + 1$ perechi de numere, separate prin spațiu, $A$ $B$, ce corespund caracteristicilor unei celule din ghețar: $A$ - altitudine, $B$ - dimensiune mănuși.

Pe următoarele $P$ linii se găsesc caracteristicile spiridușilor: $nume$ (începe mereu cu majusculă), $x$, $y$, $hp$, $stamina$. $(x, y)$ reprezintă poziția inițială a spiridușului (linia $x$, coloana $y$). Id-urile jucătorilor se vor considera în ordinea citirii, numerotarea începând de la 0. Inițial jucătorii nu au mănuși, deci vor lua mănușa din celula în care aterizează.

Exemplu Intrare

Exemplu Intrare

1 2 // Raza ghetarului și numărul de jucători
1 1 2 2 3 3 
4 4 5 5 6 6 // 3x3 perechi de inaltimi și dimensiuni de manuși
7 7 8 8 9 9
Miclaus 2 2 100 100 // jucătorul 0
Cristofor 1 1 100 100 // jucătorul 1

Dacă jucătorul apare în afara ghețarului se va afișa:

[name] has missed the glacier.

Pe următoarele linii se vor citi comenzi de diverse tipuri, câte una pe linie, până la sfârșitul fișierului:

Comanda MOVE [id] [UDLR]+

  • Mută jucătorul cu id-ul [id] după secventa indicată.
  • Un caracter din secvență reprezintă o mutare.
  • id este un număr.
  • Secvența [UDLR]+ înseamnă că pot fi unul din caracterele indicate de oricâte ori, cel puțin o dată. Citirea se face până la sfârșitul rândului.
  • Codificare:
    • U- sus
    • D - jos
    • L - stanga
    • R - dreapta
  • Fiecare mutare se face dacă jucătorul id are suficientă stamina, dacă nu, mutarea respectiva nu se face.

Dacă în urma mutării unul dintre jucători a plecat pe spinarea lui Rudolf, mutările celui care a plecat nu se vor mai face și se va afișa în fișierul indicat:

[name1] sent [name2] back home.

  • Mutările unui jucător care a plecat nu se mai fac.

Dacă în urma mutărilor jucătorul cade de pe ghețar se va afișa:

[name] fell off the glacier.

Comanda SNOWSTORM [K]

  • [K] este un întreg pe 32 biți.
  • Numărul [K] are 4 octeți [DMG][R][Y][X].
  • Numerele X, Y, R, DMG iau valori de la 0 la 255.
  • Perechea X, Y reprezintă epicentrul furtunii de zăpadă
  • R reprezintă rază circulară a furtunii.
  • O furtună de raza 0 afectează doar epicentrul.

Dacă în urma furtunii unii jucători sunt nevoiți să plece se vor afișa în ordinea citirii:

[name] was hit by snowstorm.

  • DMG reprezintă dimensiunea bulgărilor ce vor afecta jucătorii ce se află pe raza furtunii

Atenție la Endianness! Sursele se vor testa pe o arhitectura Little Endian. Mai multe detalii aici.

Comanda PRINT_SCOREBOARD

  • Realizează un clasament al tuturor jucătorilor pe baza următoarelor criterii de sortare:
    1. jucătorul este încă pe ghețar sau a plecat: [DRY/WET]
    2. Numărul de jucători eliminați de jucătorul în cauză: [ELIMINATED]
    3. Numele jucătorilor în ordine lexicografică

Modelul de afișare este:

SCOREBOARD:
[name]	[DRY/WET]	[ELIMINATED] (yes, those are tabs!)
. . .

Comanda MELTDOWN [STAMINA]

  • Reduce raza ghețarului cu o unitate.
  • Harta se va realoca astfel încât noul ghețar să fie înscris hărții.
  • Toți jucătorii rămași pe ghețar vor primi [STAMINA] energie.

Dacă în urma topirii unii jucători cad în apă se vor afișa în ordinea citirii:

[name] got wet because of global warming.

Sfarsitul jocului:

Când mai există un singur jucător pe ghețar, jocul se încheie și se va afișa:

[name] has won!

Exemplu

Rulare: ./snowfight snowfight
snowfight.in
2 6
99 100 14 15 1 4 29 43 15 15
31 24 2 0 2 0 2 0 12 12
1 5 2 6 3 50 2 0 1 100
31 24 2 0 2 0 2 0 12 12
99 100 14 15 1 4 29 43 15 15
Lucky 0 0 100 100
James 2 0 100 100
Jerry 2 4 100 100
Cristofor 0 2 100 100
Chris 2 3 100 100
Miclaus 2 1 100 100
MOVE 1 RRUUU
MOVE 3 DL
SNOWSTORM -2130705662
MOVE 2 L
MELTDOWN 10
PRINT_SCOREBOARD
MOVE 2 L
SNOWSTORM 838992641
MOVE 5 R
snowfight.out
Lucky has missed the glacier.
Miclaus sent James back home.
Chris was hit by snowstorm.
Cristofor got wet because of global warming.
SCOREBOARD:
Miclaus	DRY	1
Jerry	DRY	0
Chris	WET	0
Cristofor	WET	0
James	WET	0
Lucky	WET	0
Miclaus sent Jerry back home.
Miclaus has won.

Testare

Checker-ul temei poate fi descarcat de aici.

Nu uitati sa acordati permisiuni scriptului! Checker-ul se ruleaza cu:

./check.sh

Regulament

Copierea parţială sau totală a unei rezolvări din altă sursă va atrage după sine anularea punctajelor pentru toate temele de casă , atât pentru cel care a copiat, cât şi pentru sursa acestuia.

  • Regulamentul general se gășeste aici.
  • Tema se va implementa DOAR în limbajul C. Va fi compilat și testat DOAR într-un mediu LINUX. Nerespectarea acestor reguli aduce un punctaj NUL.
  • Temele vor fi trimise OBLIGATORIU pe vmchecker ȘI pe site-ul de curs (moodle), in sectiunea dedicata temei respective.
  • Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip '.zip', cu numele Grupa_NumePrenume_Tema3.zip (exemplu: 316CA_PopescuValentin_Tema3.zip).
  • Arhiva va trebui să conţină in directorul RADACINA doar urmatoarele:
    • 1. Codul sursă al programului vostru (fișierele .c și eventual .h).
    • 2. Un fișier Makefile care să conțină regulile build și clean. Regula build va compila programul într-un executabil cu numele snowfight. Regula clean va șterge executabilul și eventual toate binarele intermediare (fișiere obiect) generate de voi.
    • 3. Un fișier README care să conțină prezentarea implementării alese de voi. NU copiați bucăți din enunț în README.
    • Nerespectarea regulilor 1 și 2 aduce un punctaj NUL pe temă.
  • Arhiva temei NU va conține fișiere binare. Nerespectarea acestei reguli aduce un punctaj NUL.
  • O temă care NU compilează pe vmchecker NU va fi punctată.
  • O temă care compilează, dar care NU trece niciun test pe vmchecker, NU va fi punctată. Punctele pe teste sunt cele de pe vmchecker. Ultima temă submisă pe vmchecker poate fi rulată de către responsabili de mai multe ori în vederea verificării faptului că nu aveți buguri în sursă. Vă recomandăm să verificați local tema de mai multe ori pentru a verifica că punctajul este mereu același.
programare/teme_2018/tema3_2018_ca.txt · Last modified: 2019/01/06 23:28 by andrei.olteanu0401
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0