This is an old revision of the document!
27 Octombrie 2018: A fost actualizat deadline-ul. Atentie! Nu se mai accepta teme trimise dupa data de 5 Noiembrie 2018, ora 23:55.
Gigel nu este inițiat încă în tainele programării, dar vrea să învețe și să devină expert. Într-o zi i-a venit o idee care este foarte posibil să îi schimbe viața: lui îi plac foarte mult jocurile video și ar putea învăța foarte ușor programare îmbinând utilul cu plăcutul. Astfel, s-a gândit să implementeze cunoscutul joc Tetris folosind cunoștințele dobândite în primele 3 laboratore de la cursul de Programarea Calculatoarelor (cursul lui preferat de până acum).
După ce a învățat în cadrul laboratorului operatorii pe biți, Gigel s-a gândit că se poate folosi de reprezentarea în baza 2 a unui număr pentru a desena harta jocului Tetris astfel:
De asemenea, pentru a avea o harta mai mare la dispoziție, a ales să folosească numere de 64 de biți (de exemplu: unsigned long long sau uint64_t) dimensiunea hărții fiind de 8 linii a câte 8 coloane (8 x 8). În plus, pentru o afișare mai frumoasă a decis să înlocuiască în afișare biții de 1 folosind caracterul ”#“ și biții de 0 folosind caracterul ”.”(punct).
Astfel, pentru numărul “284 803 830 071 167” a cărui reprezentare în bază 2 este:
00000000 00000001 00000011 00000111 00001111 00011111 00111111 01111111
Se poate crea harta:
........ .......# ......## .....### ....#### ...##### ..###### .#######
########
în care toți cei 8 biți sunt setați pe 1.
Gigel s-a gândit să își organizeze implementarea prin stabilirea de la început a tuturor funcționalităților pe care jocul lui este capabil să le realizeze.
Primul pas pe care acesta trebuie să îl efectueze este să afișeze harta primită la intrare.
La fel ca harta, piesele sunt primite ca input sub forma unui număr decimal.
Tipuri de piese:
...#....
| ...#.... ...##... | ...#....
...#.... | ...#.... ..##.... | ...##...
...##... ...##...
.##..... .#......
Fiecare sesiune de joc conține un număr de mutări (numărul de mutări poate să fie și 0). Fiecare mutare conține piesa curentă și transformările care trebuie aplicate acesteia - câte o transformare pentru fiecare linie a hărții. Astfel, o mutare apare în input cu următorul format:
6168 -1 2 -2 0 0 1 1 -3
Unde primul număr reprezintă codificarea în decimal a piesei și următoarele 8 numere sunt transformările care trebuie aplicate asupra piesei. Numărul specific fiecărei transformări reprezintă numărul de poziții cu care piesa trebuie deplasată:
...##... ...##...
o transformare cu -6 produce rezultatul:
##...... ##......
pentru că numărul maxim posibil de deplasări în stânga este 3.
De asemenea, pentru piesa:
....#...
O transformare cu -9, ținând cont că linia pe care trebuie să se deplaseze arată astfel:
#.#.....
Va produce următorul rezultat pe linia mai sus menționată:
#.#.#... -> #.##....
Deci piesa nu poate să treacă peste o zonă deja ocupată, ci trebuie să rămână în ultimul loc disponibil (în cazul curent piesa efecutează o singură deplasare la stanga).
În cazul în care, în drumul spre ultima linie, o piesă întâlnește un obstacol, aceasta trebuie să nu mai execute următoarele transformări și să se oprească în poziția rămasă.
De exemplu, pentru harta:
........ ........ ........ ........ #####... #####... #####... #####...
și piesa:
....##.. ....##..
cu mutarea:
3084 0 0 0 0 2 0 0 0 0
execuția mutării se va opri dupa cea de-a 4-a mutare (a 5-a mutare nu poate fi efectuată din cauză că apare o coliziune și din cauza ordinii operațiilor de mutare a piesei), harta finală fiind:
........ ........ ....##.. ....##.. #####... #####... #####... #####...
În cazul în care, după o mutare care își termină execuția (ajunge la ultima linie sau se oprește din cauza unei coliziuni), o linie de pe hartă devine completă (toți cei 8 biți sunt 1), atunci acea linie trebuie eliminată si toate liniile de deasupra coborâte cu o poziție. De asemenea, dacă mai multe linii devin complete după o mutare, toate trebuie eliminate.
De exemplu, pentru harta:
........ ........ ##...#.. #######. #######. #####.## #####.## #####.##
și piesa:
#....... #.......
cu mutarea:
32896 0 10 0 0 0 0 0 0
secvența de afișări este:
........ ........ ##...#.. #######. #######. #####.## #####.## #####.## #....... ........ ##...#.. #######. #######. #####.## #####.## #####.## .......# .......# ##...#.. #######. #######. #####.## #####.## #####.## ........ .......# ##...#.# #######. #######. #####.## #####.## #####.## ........ ........ ##...#.# ######## #######. #####.## #####.## #####.## ........ ........ ##...#.. ######## ######## #####.## #####.## #####.## ........ ........ ........ ........ ##...#.. #####.## #####.## #####.## GAME OVER! Score:7.89
Un joc poate să se încheie în 2 cazuri:
De exemplu: Pentru harta:
........ #..##### ####..## #.###### ##.##### ####.### #.###### ####.###
și piesa
...##... ...##...
cu mutarea
6168 1 1 1 1 1 1 1 1
Secventa de rulare este:
........ #..##### ####..## #.###### ##.##### ####.### #.###### ####.### ....##.. #..##### ####..## #.###### ##.##### ####.### #.###### ####.### ....##.. #..##### ####..## #.###### ##.##### ####.### #.###### ####.### GAME OVER! Score:4.87
Pentru că un joc de tetris fără scor nu are farmec, Gigel s-a gandit să inventeze o formula de calcul a scorului pentru harta finala. Astfel, după terminarea mutărilor, el calculează scorul folosind următoarea formulă:
\begin{eqnarray*} & & score = \ \sqrt{zerosNumber} + 1.25^{completedLines})\\ \end{eqnarray*}
Unde:
De asemenea, pentru a evita rezultatele lungi, el s-a hotarât să afișeze scorul cu o precizie de 2 zecimale (rotunjit).
H M P1 T1_1 T1_2 T1_3 T1_4 T1_5 T1_6 T1_7 T1_8 P2 T2_1 T2_2 T2_3 T2_4 T2_5 T2_6 T2_7 T2_8 ... PM TM_1 TM_2 TM_3 TM_4 TM_5 TM_6 TM_7 TM_8
unde:
./tema1 <in/test0.in
GAME OVER! Score:S
unde S este scorul calculat folosind formula de mai sus.
TOTAL: 100p
Tema va fi trimisă folosind vmchecker, cursul Programarea Calculatoarelor (CB & CD).
Găsiți checker-ul aici.
Formatul arhivei va fi următorul:
.c
(și fișiere .h
- dacă este cazul).