This is an old revision of the document!
Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat temei de casă nr. 4.
La orice întrebare vom răspunde în maxim 24 de ore.
Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
Topicul temei este jocul “Among us”. Pentru această temă se cere o implementare simplificată a unui model asemănător cu jocul cunoscut.
Urmăriți indicațiile din fișierul tema4.c si completați funcțiile notate cu TODO. In fișierul tema4.c se pot implementa si funcții adiționale.
Pentru implementarea temei trebuie înțelese următoarele 3 structuri prezente în “utils.h”:
Rolurile jucătorilor sunt salvate în enum-ul playerRole. Valorile din enum sunt:
Task-urile pe care jucătorii trebuie să le facă sunt salvate în vectorul de referințe la funcții: void* (* Abilities[4])(void* x) = {RotateMatrix, DecodeString, InvertArray, KillPlayer};.
Valorile din playerRole corespund indicilor din vectorul de referințe la funcții.
Jocul constă în prezența unei structuri de tip Game în care sunt prezente setările jocului, vectorul de colegi de echipaj si impostorul. Fiecare jucător, inclusiv impostorul, este o structura de tipul Player si are date despre numele, culoarea si pălăria sa. Acesta mai conține si dacă jucătorul este sau nu în viață și traseul lui în joc (un vector de structuri de tip Location, un număr de locații pentru acel jucător care reprezintă lungimea vectorului de locații și un indice care reprezintă locația din vector în care se afla jucătorul acum). Pe lângă acestea, un jucător mai are un rol (Rotator, Decoder, Invertor sau Impostor) care îi definește rolul lui în joc și, prin urmare task-ul pe care îl are de făcut. Task-ul lui este salvat ca o referință la o funcție.
Fiecare jucător se mișcă circular prin vectorul de locații. Dacă un jucător are 3 locații, în următoarele 5 cicluri de joc se va mișca astfel:
0 -> 1 -> 2 -> 0 -> 1-> 2
Jocul se desfășoară în modul următor:
Jocul se desfășoară pe cicluri(runde). Un ciclu este reprezentat de următoarele acțiuni:
Tema este organizată în următorul fel:
Pentru primele 3 task-uri se impune următoarea structura:
Prin urmare, antetele primelor 3 task-uri sunt de forma: void * task(void *input)
Funcția primește un void * care este un pointer la un int (n). Să se creeze o matrice n*n cu elementele de forma ij cu i, j indicii elementului curent (i și j pornesc de la 1) și apoi să se rotească matricea la dreapta. Output-ul este un șir de caractere care reprezintă afișarea matricei de sus in jos, de la stânga la dreapta.
Input
3
Output
31 21 11 32 22 12 33 23 13
Funcția primește un void * care este un șir de caractere. Șirul este de forma a1_a2_a3_…_an, unde ai este un întreg. Să se calculeze suma elementelor ai. Output-ul este un șir de caractere care reprezintă suma calculată.
Input
4_3_7_15_1_5
Output
35
Funcția primește un void * care reprezintă un vector. Primul element al vectorului este numărul de elemente rămase în vector. Dacă lungimea vectorului rămas este număr par să se interschimbe elementele de pe pozițiile 2k + 1 cu elementele de pe pozițiile 2k + 2. Dacă lungimea vectorului rămas este număr impar să se inverseze vectorul. Output-ul este vectorul fără primul element sub formă de sir de caractere.
Input
4 1 2 3 4
Output
2 1 4 3
Input
3 1 2 3
Output
3 2 1