Introducere

Tema proiectului din anul universitar 2011-2012 presupune realizarea clasicului joc Tetris pe Linux folosind biblioteca grafică TLI curses.

Vă rugăm să consultaţi cu atenţie, înainte de a vă apuca de temă, regulamentul şi instrucţiunile de pe pagina principală dedicată proiectului.

Veţi porni în rezolvarea temei de la Arhiva de Pornire. Arhiva conţine, printre altele:

  • Un fişier Makefile gata scris cu ajutorul căruia veţi putea să compilaţi tema, să compilaţi exemplele sau să împachetaţi arhiva înainte de a trimite tema. Trebuie doar să editaţi fişierul şi să înlocuiţi cu datele voastre personale.
  • Fişierul README pe care trebuie să îl completaţi înainte de a trimite tema.
  • Un director example/ în care se află două exemple de folosire ale bibliotecii curses. Aceste exemple conţin printre altele:
    • comentarii explicative pentru fiecare pas din exemplu;
    • instrucţiuni despre cum veţi implementa animaţia în timp real sau citirea tastelor apăsate;
    • un exemplu concret de bune practici de Coding Style (urmăriţi, vă rog, indentarea, spaţierea, alinierea comentariilor etc.)
  • Un director src/ în care se află un schelet de cod tetris.c, respectiv un fişier header tetris.h. Atâta timp cât tema voastră compilează cu comanda make, nu sunteţi obligaţi să porniţi de la aceste fişiere. Puteţi să le modificaţi în orice mod doriţi sau să adăugaţi la director orice alte fişiere în care să scrieţi module din rezolvare, dacă acest lucru vă ajută în rezolvarea mai clară a temei. Alegerea vă aparţine în totalitate.
  • Un director bin/ iniţial gol în care utilitarul make va pune executabilele create.

Cerinţe

Ţinând cont că nu vă este impus un format despre cum trebuie să arate grafic tema, ci vi se punctează doar existenţa a diverse feature-uri pe care tema trebuie să le aibe, veţi primi puncte bonus pentru aspectul artistic al aplicaţiei şi pentru diverse îmbunătăţiri sau idei originale pe care le aduceţi.

Pentru a vă forma o părere mai clară despre regulile jocului, puteţi consulta un exemplu online de Tetris aici.

Task 1 (5p) Completarea datelor personale, familiarizarea cu conţinutul arhivei.

Descărcaţi arhiva de pornire şi inspectaţi conţinutul acesteia. Deschideţi fişierul Makefile şi modificaţi variabilele de mediu cu datele voastre personale (atenţie, dacă aveţi mai multe nume/prenume, scrieţi doar unul singur dintre ele!), apoi salvaţi şi rulaţi pe rand comenzile (toate comenzile trebuie rulate din acelaşi director cu fişierul Makefile):

Prima comandă compileaza scheletul de cod din directorul src/ într-un executabil numit Tetris pe care îl pune în directorul bin/, iar a doua comandă lansează în execuţie jocul.

Inspectaţi conţinutul fişierelor din directorul example/ şi apoi rulaţi comanda

Această comandă va compila exemplele din directorul example/ în două executabile separate pe care le va pune în directorul bin/. Le puteţi lansa pe rând în execuţie cu comenzile:

Detalii despre cum se foloseşte biblioteca curses pentru a rezolva restul temei se vor găsi:

Task 2 (20p) Meniul principal.

Pentru acordarea punctajului pentru acest task, jocul vostru trebuie să aibe un meniu principal din care utilizatorul să poată selecta şi alege cel puţin următoarele opţiuni:

  • New Game
  • Set Starting Level
  • Quit

Navigarea în meniu se va face cu ajutorul tastelor direcţionale (săgeţi), iar opţiunea selectată în mod curent va fi marcată (cu un caracter în dreptul ei, cu un highlight pe scris sau în orice alt mod). Selectarea uneia dintre opţiuni se va face cu Enter sau Space.

Opţiunea Quit trebuie să ducă la închiderea jocului.

Pentru inspiraţie, puteţi să consultaţi jocurile din anii trecuţi.

Task 3 (20p) Layout-ul ecranului de joc.

Pentru acordarea punctajului pentru acest task, trebuie ca la selectarea opţiunii New Game, să afişaţi un ecran "de joc" în care să fie prezente următoarele elemente:

  • Tabla de tetris propriu-zisă.
  • Un panou de control în dreapta acesteia în care să fie afişate diferite informaţii precum:
    • data şi ora curente;
    • nivelul curent;
    • numărul de puncte acumulate până în prezent;
    • de cât timp rulează jocul curent (în ore, minute şi secunde măsurate de la New Game).

Task 4 (20p) Căderea pieselor pătrate.

Pentru acordarea punctajului pentru acest task, trebuie să implementaţi doar căderea de piese pătrate (2×2). Piesele cad de la marginea de sus, începând din afara hărţii de joc, cu o viteză constantă de 1 pătrăţel odată la 0.7 secunde şi pot fi deplasate la stânga/dreapta în limitele ecranului de joc folosind săgeţile.

Atunci când o piesă nu mai poate cădea un rând pentru că se loveşte de sol sau de alte piese, ea se va opri, urmând ca la momentul următor de timp să îşi înceapă căderea o altă piesă.

Piesele trebuie să fie de culori aleatoare (alegeţi un număr de 5-10 culori posibile).

Task 5 (30p) Implementarea celorlaltor piese.

Pentru acordarea punctajului pentru acest task, trebuie să implementaţi căderea tuturor tipurior de piese existente în jocul clasic de Tetris.

Toate piesele înafară de pătrat trebuie să poată fi rotite de oricâte ori pe tur (un tur se defineşte ca fiind perioada de timp între două deplasări verticale ale piesei) folosind tasta săgeată-sus de pe tastatură.

Toate piesele se rotesc în jurul centrului lor, în sens trigonometric, dacă spaţiul permite (adică dacă rămân în interiorul ecranului în întregime şi nu se suprapun cu alte piese căzute deja).

Puteţi consulta mai jos diagrama de piese ale jocului de tetris, precum şi centrele lor şi poziţiile pe care le vor adopta după rotaţii.

În momentul în care o piesă se opreşte, se va alege la întâmplare un alt tip de piesă care să îşi înceapă căderea.

Task 6 (20p) Implementare collapse.

Pentru a obţine punctajul pe această cerinţă trebuie ca atunci când un rând este complet ocupat de bucăţi din piese, el să se distrugă şi tot ce este deasupra să cadă un spaţiu mai jos.

Atenţie! Este posibil ca la un moment dat să se distrugă oricâte rânduri simultan, nu neapărat consecutive.

La distrugerea unui rând, jucătorul va primi 10 puncte (acest lucru va fi vizibil în partea dreaptă a ecranului de joc, acolo unde aţi trecut informaţiile curente).

Task 7 (10p) Implementare nivele.

Pentru a obţine punctajul pe această cerinţă, trebuie ca atunci când jucătorul depăşeşte un număr de puncte faţă de nivelul precedent, să avanseze un nivel. La nivelele superioare, piesele vor cădea cu viteză din ce în ce mai mare, dar rândurile complete vor valora din ce în ce mai multe puncte.

Task 8 (20p) Implementare preview.

Pentru a obţine punctajul pe această cerinţă, este necesar ca într-un colţ al tablei de joc să apară în avans forma piesei care va cădea în continuarea piesei curente.

Bonusuri.

Puteţi implementa orice alte feature-uri doriţi. Câteva exemple orientative pot fi:

  • High Scores (salvare într-un fişier text/binar pe care să îl includeţi în arhivă);
  • Pause Game la apăsarea tastei "P";
  • Save/Load Game (salvare într-un fişier binar pe care să îl includeţi în arhivă);
  • Sunet.

Desigur, puteţi veni şi cu alte idei. Pentru fiecare bonus implementat veţi primi punctaj în plus. Trebuie însă să specificaţi ce bonusuri aţi implementat în cadrul fişierului README din arhivă.

Task 9 (5p) README, Coding Style, Pregătirea arhivei de trimis.

Mergeţi în directorul care conţine fişierul Makefile, după ce aţi completat detaliile voastre personale în acest fişier şi aţi completat formularul din fişierul README, si scrieţi comanda:

Verificaţi că arhiva *.zip generată are numele corespunzător. Verificaţi că ea nu conţine decât fişierele necesare rulării şi notării temei (sursele C, Makefile, README, fişiere suplimentare de saved games, highscore etc.).

Înainte de a uploada arhiva pe site-ul de cursuri, despachetaţi-o în alt director şi verificaţi din nou faptul ca merge compilată fără probleme.

După ce v-aţi convins că arhiva respectă cerinţele impuse, uploadaţi-o pe site-ul de cursuri la pagina aferentă temei 3 de la programare.