Differences

This shows you the differences between two versions of the page.

Link to this comparison view

egc:teme:2023:01 [2023/10/29 18:53]
mihnea.tudor
egc:teme:2023:01 [2023/11/03 20:25] (current)
andrei.lambru [Reguli generale de joc]
Line 1: Line 1:
-<​hidden>​ 
 ===== Tema 1 - Romburi vs hexagoane ===== ===== Tema 1 - Romburi vs hexagoane =====
-  * **Responsabili:​**+  * **Responsabili:​** ​Andrei Voicu, Mihnea Tudor, Anca Cristea, Cristian Lambru
   * **Lansare:​** 30 octombrie 2023   * **Lansare:​** 30 octombrie 2023
   * **Termen de predare:** 19 noiembrie 2023, ora 23:59   * **Termen de predare:** 19 noiembrie 2023, ora 23:59
Line 7: Line 6:
   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**   * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!**
  
-În cadrul temei 1, veți avea de implementat un joc similar cu "​Plants vs Zombies",​ dar adaptat pentru a conține o geometrie mult mai simplă :) . Puteți viziona un mic demo construit pe baza framework-ului de laborator, care acoperă cerințele și are un aspect vizual minimal.+În cadrul temei 1, veți avea de implementat un joc similar cu [[https://​youtu.be/​XENla8M3910?​feature=shared&​t=314 | "​Plants vs Zombies"​]], dar adaptat pentru a conține o geometrie mult mai simplă :) . Puteți viziona un mic demo construit pe baza framework-ului de laborator, care acoperă cerințele și are un aspect vizual minimal.
  
 <​html>​ <​html>​
Line 16: Line 15:
  
 De asemenea, puteți descărca demo-ul ​{{egc:​teme:​2023:​jocrvsh.zip | aici}} pentru a-l testa și a înțelege mai clar comportamentul de joc. De asemenea, puteți descărca demo-ul ​{{egc:​teme:​2023:​jocrvsh.zip | aici}} pentru a-l testa și a înțelege mai clar comportamentul de joc.
 +
 +<note tip>
 +Implementarea din demo-ul pus la dispoziție nu identifică corect poziția cursorului, în situația în care se modifică dimensiunea ferestrei. Aceasta rămâne de implementat la latitudinea voastră și este considerată cerință bonus :) .
 +</​note>​
  
 Pe scurt, jocul se va desfășura în cadrul a 3 linii, cu 3 coloane fiecare. Din partea dreaptă, din afara ecranului, apar la intervale aleatoare de timp inamici "​răi"​ de tip hexagon ce parcurg o linie până în partea stângă a ecranului. Odată ce un hexagon parcurge toată linia, jucătorul pierde o viață :( . La 3 vieți pierdute, jocul este pierdut. Pe scurt, jocul se va desfășura în cadrul a 3 linii, cu 3 coloane fiecare. Din partea dreaptă, din afara ecranului, apar la intervale aleatoare de timp inamici "​răi"​ de tip hexagon ce parcurg o linie până în partea stângă a ecranului. Odată ce un hexagon parcurge toată linia, jucătorul pierde o viață :( . La 3 vieți pierdute, jocul este pierdut.
Line 33: Line 36:
 Vom numi romburi, din acest moment până la final, elementele plasate de jucător. Vom numi romburi, din acest moment până la final, elementele plasate de jucător.
  
-În interfața grafică cu utilizatorul,​ sau GUI, în partea stânga-sus a ecranului, se regăsesc 4 chenare, cu câte un tip de romb în fiecare. Prin procesul de drag & drop, descris mai sus, se selectează un anumit tip de romb și se plasează într-una din celulele de joc valide, în care nu se regăsește niciun alt romb.+În interfața grafică cu utilizatorul,​ sau GUI, în partea stânga-sus a ecranului, se regăsesc 4 chenare, cu câte un tip de romb în fiecare. Prin procesul de drag & drop, descris mai jos, se selectează un anumit tip de romb și se plasează într-una din celulele de joc valide, în care nu se regăsește niciun alt romb.
  
 Jucatorului i se va permite selecția unui tip de romb, doar dacă acesta are resurse suficiente pentru plasarea tipului respectiv. Numărul de resurse stabilit de noi este: Jucatorului i se va permite selecția unui tip de romb, doar dacă acesta are resurse suficiente pentru plasarea tipului respectiv. Numărul de resurse stabilit de noi este:
Line 45: Line 48:
 === Comportament romburi și inamici === === Comportament romburi și inamici ===
  
-Din partea dreaptă, la intervale aleatoare de timp, se deplasează un inamic de-alungul unei linii alese aleator. Inamicul face parte din unul din cele 4 tipuri posibile. În situația în care un romb de același tip se regăsește într-una din cele 3 celule ale liniei, acesta începe să lanseze proiectile la intervale regulate. În situația în care există și **alte tipuri** de romburi pe linie, acestea **nu lansează proiectile**.+Din partea dreaptă, la intervale aleatoare de timp, se deplasează un inamic de-alungul unei linii alese aleator. Inamicul face parte din unul din cele 4 tipuri posibile. În situația în care un romb de același tip se regăsește într-una din cele 3 celule ale liniei, acesta începe să lanseze proiectile la intervale regulate. ​În situația în care un romb **nu are un inamic de același tip cu el pe linie**, rombul respectiv **nu lansează proiectile**,​ chiar dacă pe linie sunt inamici de alte tipuri. 
 + 
 +<​hidden>​ 
 +În situația în care există și **alte tipuri** de romburi pe linie, acestea ​din urmă **nu lansează proiectile**. 
 +</​hidden>​
  
 === GUI === === GUI ===
Line 58: Line 65:
 ==== Barem ==== ==== Barem ====
  
 +<note tip>
 +În cadrul temei, puteți implementa o formă simplă de joc, doar prin realizarea cerințelor de bază. Mecanismul de plasare a unui romb poate fi implementat prin identificarea selecției cu butonul stânga de la mouse a unei celule valide și plasarea unui romb în interiorul celulei. În această situație, nu este necesar să se țină cont de numărul de resurse strânse până la un moment dat, ceea ce înseamnă că se permite jucătorului să plaseze oricâte romburi dorește în celulele disponibile :) .
 +</​note>​
  
 === Funcționalități de bază (150 puncte) === === Funcționalități de bază (150 puncte) ===
Line 73: Line 83:
   * Comportament de joc (50p in total)   * Comportament de joc (50p in total)
     * Detecția selecției unei celule de joc prin apăsarea butonului stânga al mouse-ului și plasarea unui romb în celulă 10p     * Detecția selecției unei celule de joc prin apăsarea butonului stânga al mouse-ului și plasarea unui romb în celulă 10p
-    * Apariție inamici la intervale ​regulate ​5p+    * Apariție inamici la intervale ​aleatoare ​5p
     * Detecția faptului că un inamic a traversat în totalitate o linie 5p     * Detecția faptului că un inamic a traversat în totalitate o linie 5p
     * Apariție proiectil de lânga un romb în momentul în care există inamic pe linie 10p     * Apariție proiectil de lânga un romb în momentul în care există inamic pe linie 10p
Line 100: Line 110:
     * Detecția coliziunii proiectil-inamic,​ doar în situația în care proiectilul are aceeași culoare ca cea a inamicului 2.5p     * Detecția coliziunii proiectil-inamic,​ doar în situația în care proiectilul are aceeași culoare ca cea a inamicului 2.5p
  
-==== Exemple de funcționalități bonus ==== +===== Detalii de implementare ​=====
- +
-<note warning>​Orice funcționalitate suplimentară implementată (care nu este inclusă în cerințele obligatorii) poate fi considerată ca punctaj bonus dacă este suficient de complexă. Funcționlitățile bonus se iau în considerare doar dacă funcționalitățile obligatorii au fost realizate.</​note>​ +
- +
-  * Romburi mai speciale (ex: romburi care generează, la un anumit interval, resurse care se pot culege; romburi care explodează;​ romburi care atacă mai multe linii de-odata) +
-  * Hexagoane mai speciale (ex: hexagoane care își schimbă culoarea la fiecare '​hit';​ hexagoane mai slabe sau puternice, cu indicatori vizuali) +
-  * Creșterea dificultății pe măsură ce avansați în timp +
-  * Implementare de "​niveluri"​ cu durate stabilite, avansarea la următorul nivel în urma terminării celui anterior +
-  * Sistem de "​waves"​ (ca în jocul original): în anumite momente ale jocului, un grup mare de hexagoane este trimis către romburi +
-  * Resurse care cad din cer și se așază undeva în scena +
-  * Lawnmowers, ca în plants vs zombies? (TODO: dacă vreți să păstrăm asta sau nu) +
- +
-==== Întrebări și răspunsuri ==== +
- +
-Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student! +
- +
-==== Notare ==== +
- +
-Baremul este orientativ. Fiecare asistent are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii,​ cât și pentru bonusuri. +
- +
-<note warning>​ +
-Tema trebuie încărcată pe moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​ +
- +
- +
- +
-==== Detalii de implementare ====+
  
 ==== Construcție elemente vizuale ==== ==== Construcție elemente vizuale ====
Line 200: Line 185:
 În momentul în care un proiectil se intersectează cu un inamic, acesta din urmă dispare din scenă printr-o animație de micșorare față de centrul comun al celor două hexagoane care formează geometria inamicului. Această animație poate fi realizată, similar cu cea de micșorare a rombului, printr-o transformare de scalare. Proiectilul dispare și el la intersecția lui cu inamicul, doar că nu realizează nicio animație, doar nu se mai afișează de la cadrul următor după detecția intersecției. În momentul în care un proiectil se intersectează cu un inamic, acesta din urmă dispare din scenă printr-o animație de micșorare față de centrul comun al celor două hexagoane care formează geometria inamicului. Această animație poate fi realizată, similar cu cea de micșorare a rombului, printr-o transformare de scalare. Proiectilul dispare și el la intersecția lui cu inamicul, doar că nu realizează nicio animație, doar nu se mai afișează de la cadrul următor după detecția intersecției.
  
-=== Detecție coliziuni === +==== Detecție coliziuni ====
- +
-==== Detecție coliziuni ​între obiecte ​====+
  
 Mecanismul de detecție a coliziunilor între diverse obiecte din scenă reprezintă un feature esențial în cam orice joc la care vă puteți gândi. În [[https://​www.youtube.com/​watch?​v=fiShX2pTz9A|Pong]] trebuie verificată coliziunea mingii, atât cu ecranul jocului, cât și cu "​paleta"​ fiecărui jucător. În jocurile [[https://​www.youtube.com/​watch?​v=QLF0FXcW25E|Mario]],​ trebuie verificată coliziunea dintre jucător și toate obiectele înconjurătoare:​ cuburi, inamici, power-ups etc. În jocul nostru, avem nevoie de o implementare puțin mai simplificată a coliziunilor. Mecanismul de detecție a coliziunilor între diverse obiecte din scenă reprezintă un feature esențial în cam orice joc la care vă puteți gândi. În [[https://​www.youtube.com/​watch?​v=fiShX2pTz9A|Pong]] trebuie verificată coliziunea mingii, atât cu ecranul jocului, cât și cu "​paleta"​ fiecărui jucător. În jocurile [[https://​www.youtube.com/​watch?​v=QLF0FXcW25E|Mario]],​ trebuie verificată coliziunea dintre jucător și toate obiectele înconjurătoare:​ cuburi, inamici, power-ups etc. În jocul nostru, avem nevoie de o implementare puțin mai simplificată a coliziunilor.
Line 222: Line 205:
 <note important>​Aveți grijă cum definiți formele geometrice: proiectil, romb, hexagon. Dacă ați definit obiectul original astfel încât centrul formei geometrice să se afle în punctul (0, 0), atunci centrul cercului va coincide cu centrul formei. Altfel, este posibil să intervină niște deplasări care trebuie luate în calcul. De asemenea, fiți atenți la eventuale rotații și translații ale obiectelor în scenă.</​note>​ <note important>​Aveți grijă cum definiți formele geometrice: proiectil, romb, hexagon. Dacă ați definit obiectul original astfel încât centrul formei geometrice să se afle în punctul (0, 0), atunci centrul cercului va coincide cu centrul formei. Altfel, este posibil să intervină niște deplasări care trebuie luate în calcul. De asemenea, fiți atenți la eventuale rotații și translații ale obiectelor în scenă.</​note>​
  
-==== Detecție coliziuni între obiecte și cursor ​====+==== Interacțiune jucător ​====
  
 Un alt aspect esențial este interacțiunea jucătorului cu obiectele din scenă, în acest caz, prin intermediul mouse-ului. Avem două astfel de interacțiuni:​ Un alt aspect esențial este interacțiunea jucătorului cu obiectele din scenă, în acest caz, prin intermediul mouse-ului. Avem două astfel de interacțiuni:​
   * colectarea de resurse, prin apăsarea unui buton pe mouse   * colectarea de resurse, prin apăsarea unui buton pe mouse
   * plasarea romburilor în celule, prin intermediul drag & drop   * plasarea romburilor în celule, prin intermediul drag & drop
 +  * ștergerea romburilor din celule
  
 Modul de funcționare este similar cu cel de la coliziunea obiect-obiect,​ fiind nevoie să determinăm marginile fiecărui obiect. În schimb, în acest caz, trebuie determinată poziția curentă a cursorului pe ecran, după care verificăm dacă se află în interiorul marginilor obiectului. Modul de funcționare este similar cu cel de la coliziunea obiect-obiect,​ fiind nevoie să determinăm marginile fiecărui obiect. În schimb, în acest caz, trebuie determinată poziția curentă a cursorului pe ecran, după care verificăm dacă se află în interiorul marginilor obiectului.
Line 232: Line 216:
 În funcțiile callback care sunt apelate la mișcări sau apăsări de buton ale mouse-ului ('​OnMouseMove()',​ '​OnMouseBtnPress()'​),​ coordonatele cursorului sunt date ca parametri, astfel că poziția cursorului este (mouseX, mouseY). Cele două valori sunt numere **întregi** ce reprezintă poziția cursorului în spațiul de vizualizare (pe fereastra jocului) pe orizontală,​ respectiv pe verticală. În funcțiile callback care sunt apelate la mișcări sau apăsări de buton ale mouse-ului ('​OnMouseMove()',​ '​OnMouseBtnPress()'​),​ coordonatele cursorului sunt date ca parametri, astfel că poziția cursorului este (mouseX, mouseY). Cele două valori sunt numere **întregi** ce reprezintă poziția cursorului în spațiul de vizualizare (pe fereastra jocului) pe orizontală,​ respectiv pe verticală.
  
-<note important>​Poziția cursorului pe fereastra jocului are ca punct de origine **colțul din stânga sus**, în timp ce spațiul de joc/logic are ca punct de origine **colțul din stânga jos**. Din acest motiv, pentru a folosi coordonata y a cursorului pentru obiectele din scena de joc, trebuie să utilizăm următorul calcul: //​y_scena_joc = 720 - y_cursor//. Valoarea 720 este înălțimea ferestrei.</​note>​+<note important>​Poziția cursorului pe fereastra jocului are ca punct de origine **colțul din stânga sus**, în timp ce spațiul de joc/logic are ca punct de origine **colțul din stânga jos**. Din acest motiv, pentru a folosi coordonata y a cursorului pentru obiectele din scena de joc, trebuie să utilizăm următorul calcul: //​y_scena_joc = 720 - y_cursor//. Valoarea 720 reprezintă ​înălțimea ferestrei.</​note>​
  
-Pentru ​coliziunile cursor-obiect, vom folosi dreptunghiuri încadratoare aliniate cu axele (axis-aligned bounding boxes, mai multe detalii [[https://​developer.mozilla.org/​en-US/​docs/​Games/​Techniques/​2D_collision_detection#​axis-aligned_bounding_box|aici]]) pentru obiecte. Pe scurt, ne vom imagina un dreptunghi (în locul cercului de la coliziunile obiect-obiect) cu laturile paralele cu axele Ox și Oy, și cu centrul în cel al obiectului.+Pentru ​detecția situației în care poziția cursorului se află în interiorul unui element vizual din joc, vom folosi dreptunghiuri încadratoare aliniate cu axele (axis-aligned bounding boxes, mai multe detalii [[https://​developer.mozilla.org/​en-US/​docs/​Games/​Techniques/​2D_collision_detection#​axis-aligned_bounding_box|aici]]) pentru obiecte. Pe scurt, ne vom imagina un dreptunghi (în locul cercului de la coliziunile obiect-obiect) cu laturile paralele cu axele Ox și Oy, și cu centrul în cel al obiectului.
  
 Pentru a verifica apăsarea unui buton de la mouse, când cursorul se află în interiorul unui obiect, trebuie să: Pentru a verifica apăsarea unui buton de la mouse, când cursorul se află în interiorul unui obiect, trebuie să:
-  - Traducem ​coordonatele cursorului de pe ecran în coordonatele scenei de joc+  - Transformăm ​coordonatele cursorului de pe ecran în coordonatele scenei de joc
   - Calculăm marginile dreptunghiului,​ în urma eventualelor aplicări de translații și scalări   - Calculăm marginile dreptunghiului,​ în urma eventualelor aplicări de translații și scalări
   - Verificăm dacă poziția cursorului este între marginile dreptunghiului   - Verificăm dacă poziția cursorului este între marginile dreptunghiului
  
-<note tip>Daca vreti sa functioneze corect detectia si in cazul redimensionarii ferestrei de joc, lucrurile se complica putin.+==== Drag & drop ====
  
-Initialdaca incepeti ​cu scheletul ​din laboratorul 3spatiul logic coincide 1:1 cu spatiul de vizualizare,​ adica toate pozitiile obiectelor coincid cu coordonata respectiva de pe ecranMarginea dreapta a spatiului logic va coincide cu marginea dreapta a ferestrei ​de joc, adica lungimea ferestrei (resolution.x),​ iar marginea de sus cu inaltimea ferestrei (resolution.y).+Pentru a plasa un romb pe una dintre celuleacesta trebuie selectat ​cu mouse-ul ​din bara romburilor disponibiledupă care trebuie tras deasupra unei celule **libere**O celulă liberă este o celulă care nu este deja ocupată ​de un romb.
  
-Sa zicem ca vrem sa jucam in modul fullscreen. Vom nota rezolutia initiala (cea aleasa in functia '​main()'​) cu (init_widthinit_height),​ iar cea noua cu (new_width, new_height). Spatiul logic ramane cel initialintre coordonatele (00) si (init_width, init_height), dar spatiul ​de vizualizare se mareste, fiind intre (0, 0si (new_widthnew_height). De aceea, pentru o functionare corecta, este necesara o transformare fereastra-poarta din noul spatiu ​de vizualizare in cel initial, pentru a coincide iarasi cu spatiul logic initial.+Pentru a crea acest mecanismtrebuie realizați următorii pași: 
 +  - Detecția apăsării butonului stâng al mouse-ului 
 +  - Detecția poziției cursorului într-una dintre căsuțele ​cu romburi disponibile ​(pentru care avem suficiente resurse) 
 +  - Randarea rombului la poziția cursoruluiîn fiecare framecât timp butonul rămâne apăsat 
 +  - Detecția eliberării ​(releaseal aceluiași buton de mouse (cel stâng) 
 +  - Detecția poziției cursorului într-una dintre celulele libere 
 +  - Plasarea rombului în celulă 
 +  - Reducerea resurselor disponibileîn funcție ​de costul rombului
  
-Aceasta transformare trebuie aplicata pentru oricare alt fragment de cod sau logica ce se folosesc de marginile ecranului.</​note>​+{{ :​egc:​teme:​2023:​drag-n-drop.gif?300 |}}
  
-=== Drag & drop ===+<​note>​În cazul în care utilizatorul apasă pe un romb pentru care nu are suficiente resurse, algoritmul se oprește la pasul 2. De asemenea, dacă butonul mouse-ului este eliberat într-o poziție invalidă (oriunde în afara unei celule libere), desenarea rombului la poziția cursorului este oprită, iar resursele **nu** sunt consumate (practic, plasarea rombului într-o pozitie invalidă nu are niciun efect).</​note>​
  
-Pentru a plasa un romb pe una dintre celule, acesta trebuie selectat cu mouse-ul din bara romburilor disponibile,​ dupa care trebuie tras deasupra unei celule **libere**. O celula libera este o celula care nu este deja ocupata ​de un romb.+==== Exemple ​de funcționalități bonus ====
  
-Pentru a crea acest mecanism, trebuie realizati urmatorii pasi: +<note warning>​Orice funcționalitate suplimentară implementată ​(care nu este inclusă în cerințele obligatoriipoate fi considerată ca punctaj bonus dacă este suficient ​de complexă. Funcționlitățile bonus se iau în considerare doar dacă funcționalitățile obligatorii au fost realizate.</​note>​
-  - Detectia apasarii butonului stang al mouse-ului +
-  - Detectia pozitiei cursorului intr-una dintre casutele cu romburi disponibile ​(pentru ​care avem suficiente resurse) +
-  - Randarea rombului la pozitia cursorului, in fiecare frame, cat timp butonul ramane apasat +
-  - Detectia eliberarii (release) al aceluiasi buton de mouse (cel stang) +
-  - Detectia pozitiei cursorului intr-una dintre celulele libere +
-  - Plasarea rombului in celula +
-  - Reducerea resurselor disponibile,​ in functie ​de costul rombului+
  
-{{ :egc:teme:2023:​drag-n-drop.gif?​300 |}}+  * Geometrie mai complexă față de cea din cerința de bază pentru elementele vizuale din joc 
 +  * Utilizarea transformării fereastră-poartă pentru detecția corectă a poziției cursorului, la orice dimensiune a ferestrei 
 +  * Romburi mai speciale (exromburi care generează, la un anumit interval, resurse care se pot culege; romburi care explodează;​ romburi care atacă mai multe linii de-odata) 
 +  * Hexagoane mai speciale (exhexagoane care își schimbă culoarea la fiecare '​hit';​ hexagoane mai slabe sau puternice, cu indicatori vizuali) 
 +  * Creșterea dificultății pe măsură ce avansați în timp 
 +  * Implementare de "​niveluri"​ cu durate stabilite, avansarea la următorul nivel în urma terminării celui anterior 
 +  * Sistem de "​waves"​ (ca în jocul original)în anumite momente ale jocului, un grup mare de hexagoane este trimis către romburi 
 +  * Resurse care cad din cer și se așază undeva în scenă 
 +  * Lawnmowers, ca în Plants vs Zombies 
 +  * Orice aduce îmbunătățiri vizuale jocului
  
-<​note>​In cazul in care utilizatorul apasa pe un romb pentru care nu are suficiente resursealgoritmul ​se opreste la pasul 2De asemeneadaca butonul mouse-ului ​este eliberat intr-pozitie invalida ​(oriunde in afara unei celule libere), desenarea rombului la pozitia cursorului este opritaiar resursele **nu** sunt consumate ​(practicplasarea rombului intr-o pozitie invalida ​nu are niciun efect).</​note>​+<​note ​tip>Dacă vreți să funcționeze corect detecția în cazul redimensionării ferestrei de joc, se va aplica următoarea abordare: 
 + 
 +Inițial, dacă începeți cu scheletul din laboratorul 3, spațiul logic coincide 1:1 cu spațiul de vizualizare,​ adică toate pozițiile obiectelor coincid cu coordonata respectivă de pe ecranMarginea dreaptă a spațiului logic va coincide cu marginea dreaptă a ferestrei de joc, adică lungimea ferestrei (resolution.x),​ iar marginea de sus cu înălțimea ferestrei (resolution.y). 
 + 
 +Dacă vrem să redimensionăm fereastra, este nevoie să aplicăm ​transformare fereastră-poartă din noua rezoluție în cea inițială. Mai exact, daca notăm noua rezoluție cu coordonatele ​(new_width, new_height), vrem să traducem noul spațiu de coordonatecuprins între ​(00) (new_width, new_height),​ în cel inițial (corespunzător celui logic), cuprins între (0, 0) - (1280, 720). De notat este faptul că (1280, 720) este rezoluția inițială a ecranului, și este setată în funcția //​main()//​. 
 + 
 +Această transformare trebuie aplicată pentru oricare alt fragment de cod sau logică ce se folosesc de marginile ecranului.</​note>​ 
 + 
 +==== Întrebări și răspunsuri ==== 
 + 
 +Pentru întrebări vom folosi forumurile de pe moodle. Orice nu este menționat în temă este la latitudinea fiecărui student! 
 + 
 +==== Notare ==== 
 + 
 +Baremul este orientativ. Fiecare asistent ​are o anumită libertate în evaluarea temelor (de exemplu, să dea punctaj parțial pentru implementarea incompletă a unei funcționalități sau să scadă pentru hard coding). Același lucru este valabil atât pentru funcționalitățile obligatorii,​ cât și pentru bonusuri. 
 + 
 +<note warning>​ 
 +Tema trebuie încărcată pe moodle. Pentru a fi punctată, tema trebuie prezentată la laborator. Vor exista laboratoare speciale de prezentare a temelor (care vor fi anunțate).</​note>​
  
 ==== Indicații suplimentare ==== ==== Indicații suplimentare ====
Line 280: Line 290:
 </​note>​ </​note>​
  
-</​hidden>​ 
egc/teme/2023/01.1698598390.txt.gz · Last modified: 2023/10/29 18:53 by mihnea.tudor
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