This is an old revision of the document!


Tema 4 – Pregătire Examen

Responsabili

  • Data publicare: 5 Noiembrie 2019, ora 22:20
  • Deadline: 6 Ianuarie 2020, ora 23:55
Întrebări

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.

Obiective

  • să se respecte formate stricte de intrare/ieșire
  • să se însușească cunoștințele necesare pentru examen
  • să se înțeleagă si sa se utilizeze operații cu pointeri la functii
  • sa se înțeleagă si sa se utilizeze operații cu array-uri de pointeri

Introducere

Topicul temei este jocul “Among us”. Pentru această temă se cere o implementare simplificată a unui model asemănător cu jocul cunoscut.

Cerința

TOATE modificările de cod se vor realiza DOAR in fișierul tema4.c. Modificarea oricărui alt fișier nu va fi luata in considerare.

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”:

  • Location:
    • x – întreg care reprezintă coordonata x a poziției
    • y – întreg care reprezintă coordonata y a poziției
  • Game:
    • name – șir de caractere care reprezintă numele jocului curent
    • killRange – întreg care reprezintă distanța maximă de la care un Impostor poate să omoare un alt jucător
    • numberOfCrewmates – întreg care reprezintă numărul de colegi de echipaj
    • crewmates – vector de referințe la structuri de tip Player care reprezintă colegii de echipaj
    • impostor – referința la structura de tip Player care reprezintă impostorul din joc
  • Player:
    • name – șir de caractere care reprezintă numele jucătorului
    • color – șir de caractere care reprezintă culoarea jucătorului
    • hat – șir de caractere care reprezintă pălăria jucătorului
    • alive – întreg care reprezintă dacă jucătorul este în viață sau nu
    • indexOfLocation – indicele din vectorul de locații care reprezintă locația curentă a jucătorului
    • numberOfLocations – numărul de locații în care se poate afla jucătorul
    • locations – vector de structuri de tip Location
    • playerRole – enum de tip PlayerRoles care reprezintă tipul de jucător
    • ability – referință la funcție de tipul void * task(void *) care reprezintă task-ul jucătorului curent

Rolurile jucătorilor sunt salvate în enum-ul playerRole. Valorile din enum sunt:

  • Rotator
  • Decoder
  • Invertor
  • Impostor

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:

  • se citește de la input un joc si jucătorii lui
  • se inițializează jucătorii lui și se afișează datele importante despre joc la output
  • se calculează ciclurile jocului(rundele)

Jocul se desfășoară pe cicluri(runde). Un ciclu este reprezentat de următoarele acțiuni:

  • fiecare coleg de echipaj se mișcă la următoarea sa locație din vectorul de locații (jucătorii încep de la locația cu indicele 0 din vector și în primul ciclu se duc la locația 1 si așa mai departe)
  • fiecare coleg de echipaj își face task-ul, apelând câmpul ability, care este o referința la o funcție, apoi își afișează rezultatul task-ului său
  • urmează rândul impostorului să se miște la următoarea sa locație și să își facă task-ul adică să încerce să omoare un jucător

Dacă un coleg de echipaj este mort atunci el nu mai face nicio acțiune, ci doar se afișează la output că acesta este mort.

Tema este organizată în următorul fel:

  • 3 task-uri care reprezintă task-urile colegilor de echipaj
  • 5 task-uri care asigură inițializarea și desfășurarea jocului
  • 1 task care reprezintă task-ul impostorului

Pentru primele 3 task-uri se impune următoarea structura:

  • Input-ul este un singur parametru de forma void * care urmează sa îi fie făcut cast la tipul de date specificat de fiecare task în parte
  • Output-ul este un șir de caractere căruia îi este făcut cast la void *

Prin urmare, antetele primelor 3 task-uri sunt de forma: void * task(void *input)

programare/teme_2020/tema4_2020_cbd.1606579845.txt.gz · Last modified: 2020/11/28 18:10 by vlad_matei.draghici
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