Introducere

  • Scopul proiectului este realizarea unui joc Mastermind(http://en.wikipedia.org/wiki/Mastermind_%28board_game%29 ).
  • Regulile complete ale jocului le puteti afla accesand link-ul : un jucator genereaza o combinatie random de 4 culori din 6 posibile ; celalalt jucator are dreptul la un numar de incercari, dupa fiecare incercare afland cate culori a ghicit pe pozitia corecta si cate pe pozitia incorecta.
  • Acesta este un boargame clasic,intre doi jucatori umani cu o tabla de joc ce se preteaza la o implementare a jocului intre un jucator uman si microcontroller.
  • In implementarea mea rolul utilizatorului este cel de jucator care trebuie sa ghiceasca o combinatie de culori , iar rolul microcontroller-ului este sa genereze o combinatie si sa dea feedback jucatorului dupa fiecare pas,precum si sa retina un istoric al tuturor incercarilor introduse.Istoricul este important pentru jucator , deoarece decizia la pasul curent se bazeaza pe toate informatiile acumulate din feedbacul primit de la microcontroller.

Descriere generală

Schema bloc hardware

Utilizatorul interactioneaza cu microcontroller-ul prin butoane(da comenzi si introduce incercari de combinatii) si prin display (LCD de dimensiune 16×2). - Exista 3 butoane de comanda :

  • ENTER pentru start joc, alegere nivel joc.
  • UP si DOWN pentru navigare in meniul de selectie a nivelului jocului si pentru navigarea in istoric

- Exista 6 butoane pentru selectia culorilor.

Schema bloc software

Modulele software sunt interfata de lucru cu lcd-ul si jocul .In cadrul jocului exista 3 functii principale : de selectie a nivelului jocului,de generare combinatie random , de asteptare a inputului utilizatorului , generare raspuns si afisare istoric.

Hardware Design

  • Listă de piese

Pe cele doua placi de extensie exista:

  1. LCD 16×2
  2. 9 butoane(3 de control , 6 de selectie culori)
  • Scheme electrice
  1. Placa de baza
  2. Extensiile
  3. Poza placuta

Software Design

  • Mediul de dezvoltare : AVR Studio
  • Algoritmi şi structuri implementate :

In introducere am motivat de ce este necesar un istoric al ultimelor combinatii introduse.De asemenea este nevoie de navigare printre acestea deoarece LCD-ul utilizat nu are decat doua linii pe care le-am folosit in felul urmator: prima linie afiseaza ultima combinatie introdusa , respectiv orice combinatie si rezultat anterior daca se navigheaza cu butoanele UP/DOWN , iar a doua linie este folosita pentru a afisa numarul de incercari ramase si inputul curent.Pentru a retine istoricul am folosit o structura definita astfel :

        /*Structura care retine in istoric incercarile anterioare*/
         typedef struct {
	uint8_t c[4];  // codurile celor 4 culori din combinatie
	uint8_t no1;   // numarul de culori ghicite pe pozitia corecta
	uint8_t no2;   // numarul de culori ghicite pe pozitia incorecta
        } TGuess;

.

  • Surse şi funcţii implementate

Functii auxiliare :

  1. gameLevel() → seteaza nivelul de dificultate al jocului (din 3 nivele posibile , caracterizate printr-un numar maxim de incercari permise).Primeste input de la butoanele de comanda.
  2. printLevel() →afiseaza nivelul curent al jocului pe parcursul selectiei.
  3. randomGuess(int randomize) genereaza o combinatie random , folosind o valoare calculata pe baza timerului ( care retine milisecundele scurse de la inceputul jocului ).
  4. fillLine1(TGuess *guess,int8_t index) → pregateste continutul primei linii afisate in timpul jocului;Acesta reprezita un mesaj de intampinare - daca jocatorul este la prima incercare,ultima incercare,sau o incercare mai veche din istoric (daca se navigeaza cu butoanele up,down).
  5. verifyGuess(TGuess *guess,uint8_t index) → verifica incercarea curenta a jucatorului (guess[index]) si calculeaza cate culori au fost ghice pe pozitia corecta si cate ghicite in pozitia incorecta.Functia intoarce 1 daca a fost ghicita combinatia toGuess.
  6. wait_enter() → asteapta apasarea tastei ENTER pentru start joc .
  7. playGame() → jocul
void playGame(){
	//Alege o combinatie random care trebuie ghicita
	randomGuess();
	//Seteaza numarul de incercari in functie de nivelul ales la o constanta predefinita
	switch(nivel){
		case 1:
			noTrys = BEGGINER;
		case 2:
			noTrys = EASY;
		case 3:
			noTrys = DIFFICULT;
	}
	for ( i = 0 ; i < noTrys ; i++){	//pentru fiecare incercare permisa			
		LINE1 = actualizare_linie_1   // linie ce contine ultima incercare 
                LINE1 = actualizare_linie_2   //linie ce contine numai  numarul de incercari ramase
		LCD_print_guesses();          //reafiseaza
		for ( j = 0 ; j < 4 ; j++) {	//pentru fiecare culoare din cele 4 ghicite
			while(1){					//se asteapta pana la introducerea unei culori
				if (este apasat butonul UP){ 
					if ( historyIndex > 0){ // daca nu este prima comanda deja afisata in istoric
						historyIndex--;
						fillLine1(guess,historyIndex); // actualizeaza
						LCD_print_guesses(); //reafiseaza
					}
				}
				if (este apasat butonul DOWN){ // daca nu este ultima comanda deja afisata in istoric
					if ( historyIndex < i-1){
						historyIndex++;
						fillLine1(guess,historyIndex);// actualizeaza
						LCD_print_guesses();//reafiseaza
					}
				}
				if (este apasat butonul ALB){
					LINIA2[j+2] = 'A'; //adauga la incercarea curenta si culoarea nou introdusa
					guess[i].c[j] = 'A'; //adauga in istoric culoarea nou introdusa
					LCD_print_guesses(); //reafiseaza
					break;
				}
                                if (este apasat butonul NEGRU){...}
                                if (este apasat butonul ROSU){...}
                                if (este apasat butonul GALBEN){...}
                                if (este apasat butonul VERDE){...}
                                if (este apasat butonul BLEU){...}
                                }
		}//end for fiecare culoare din incercare
		if (verifyGuess()){	//a ghicit->sfarsit joc
			LCD_print("SUCCESS!");
			return;
		}
	}
	//se ajunge aici in caz de insucces
	LCD_print2("GAME OVER!",toGuess);
}

Rezultate Obţinute

Implementarea software a fost testata pe simulare(simulare.zip) si realizeaza toate functionalitatile specificate la alegerea temei de proiect.

Concluzii

In implementarea hardware am intampinat multe probleme din cauza lipsei de experienta si aceasta etapa a fost finalizata ultima. Din acest punct ce vedere am avut sansa sa am un proiect la care a fost posibil sa fac o simulare si sa testez programul pe aceasta ,proiectul fiind mai complicat software decat hardware.Fisierul cu simularea este inclus in arhiva cu sursele.

O nemultumire este estetica placutei din cauza firelor de legatura , dar am fost nevoita sa le folosesc deoarece utilizez multi din pinii microcontrollerului si spatiul a fost o problema.

Download

Bibliografie/Resurse

pm/prj2010/dtudose/pmmastermind.txt · Last modified: 2021/04/14 17:07 (external edit)
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