Table of Contents

Tetris

Autor

Vlad Marius-Cătălin 335CC

Introducere

În acest proiect voi face un joc de Tetris asemănător cu varianta clasică de pe NES. Voi folosi un ecran LCD Nokia 5110 cu o rezoluție de 84×48 pentru afișarea jocului și 6 butoane pentru controlarea pieselor.

Jocul Tetris de pe NES

Jocul clasis de Tetris de pe consola NES are un mecanism de dificultate progresivă. Dificultatea este măsurată pe niveluri. Jocul începe de la nivelul 0. La fiecare 48 de cadre, piesa care poate fi mutată va cădea cu o căsuță. Pentru trecerea la nivelul următor, trebuie completate 10 rânduri. La fiecare nivel, piesele vor cădea mai repede și va fi nevoie de mai multe rânduri completate pentru avansare. De la nivelul 29 parametrii dificultății nu se modifică. Mai multe detalii despre dificultate aici.

Descriere generală

Schema bloc hardware

Vor exista 6 butoane, 4 vor fi folosite pentru deplasarea pieselor stânga, dreapta, jos și 2 butoane pentru rotirea pieselor, unul pentru rotirea în sensul acelor de ceas și unul pentru rotirea în sens invers acelor de ceas.

Hardware Design

Lista de piese

Schema electrică

Software Design

Am pornit de modificarea bibliotecii de desenare pe ecranul nokia. Am adăugat o funcție de desanare a unui pătrat 4×4 gol pe dinăuntru și am modificat funcția de afișare a șirurilor de caractere pentru a fi desenate pe verticală. Pentru logica jocului, am folosit o logică simplă, prima dată se apelează funcția de inițializare a variabilelor jocului, iar la fiecare cadru se apelează o funcție de update. În funcția de update, se trece prin stările jocului și se interpretează input-ul de la utilizator. Fiecare buton are un rol diferit, mișcare piesă stânga, dreapta și jos, rotire piesă în sens trigonometric sau sensul acelor de ceas și să pună pauză.

Principala problemă a fost să fac debouncing pentru butoane. Am folosit un timer care generează o întrerupere la 10ms. La fiecare întrerupere se verifică starea butoanelor (apăsat sau lăsat liber), și se incrementează un contor. Abia după ce s-a trecut de un prag, se consideră butonul apăsat.

În mare, jocul funcționează astfel:

inițializare joc și renderer
cât timp jocul rulează
	așteptare input utilizator
	debouncing butoane
	trimitere input joc
	afisare elemente joc pe ecran

Jocul interpretează apăsarea butoanelor astfel:

dacă buton jos apăsat sau timer pentru mutare piesă jos expirat
	dacă piesa nu poate fi deplasată în jos
		șterge liniile complete
		adaugă scor
		crește nivelul dacă trebuie
		generare piesă nouă
	altfel
		mută piesa în jos
dacă buton stânga apăsat
	mută piesa la stânga
dacă buton dreapta apăsat
	mută piesa la dreapta
daca buton rotire în sens trigonometric apăsat
	rotește piesa în sens trigonometric
dacă buton rotire în sensul acelor de ceas apăsat
	rotește pesa în sensul acelor de ceas
dacă buton pauză apăsat
	pune pauză

Rezultate Obţinute

Concluzii

A fost un proiect interesant, mi-a plăcut să programez pe microcontroller. A fost o experiență nouă, a trebuit să implementez câteva lucruri pe care le făceau bibliotecile de limbaj înalt în spate (debouncing pentru butoane și generarea unui număr aleator). Chiar dacă am menționat inițial că nu voi implementa DAS, am reușit să implementez funcționalitatea (a durat vreo 10 minute :-?)

În concluzie, am fost plăcut surprins că totul a mers bine din prima și că nu am ars și nu am stricat nimic hardware.

Download

Download.zip

Bibliografie/Resurse