Simon Says - Game

Introducere

1. Descriere generala

Clasicul joculet de memorie “Simon says”

2. Reguli

  • se aprind ledurile in anumite secvente
  • de fiecare data va trebui repetata secventa totala obtinuta pana la pasul curent din butoane
  • initial se va aprinde un singur led o singura data, apoi vor fi doua aprinderi de led s.a.m.d.
  • la fiecare pas se va parcurge mai intai secventa care a fost generata pana la acel pas, se va aprinde noul led si apoi se va astepta pentru a vedea daca jucatorul poate reda corect secventa totala de pana la pasul curent
  • daca jucatorul reda corect secventa, la pasul urmator se va mai adauga la secventa inca un led aprins, daca nu jocul se termina si va incepe de la inceput
  • cand jocul se termina din cauza ca jucatorul a pierdut se aprind toate cele 6 leduri o singura data
  • daca jocul se termina pentru ca jucatorul a ajuns la ultimul nivel si l-a redat corect se aprind cele 6 leduri de 3 ori.

3. Scopul

  • retinerea corecta a unei secvente de joc cat mai mari

4. Utilitate

  • joc de perspicacitate si memorie
  • poate fi folosit in scopul de imbunatatiore a memorie, testarea memoriei sau ca si joculet de testare a inteligentei pentru copii

Hardware Design

Piese folosite

  • 6 butoane
  • 6 led-uri
  • 6 rezistente (270)
  • pini
  • fire de legatura
  • placuta de test

Conectarea butoanelor la ATmega16 se face la pinii PC0, PC1, PC2, PC3, PC4, PC5

Conectarea ledurilor la ATmega16 se face la pinii PA0, PA1, PA2, PA3, PA4, PA5

Simulare joc:

Placuta de baza:

Placuta de test cu piesele necesare:

Forma finala a proiectului:

Software Design

In fisierul simon_says.c exista urmatoarele functii:

  • functia principala main in care s-a implementat codul de joc ( se reda modelul de lumini la care s-a ajuns la nivelul curent, se asteapta sa se tasteze modelul de la butoane, se verifica daca butonul tastat este cel asteptat in secventa, se ia decizia daca se continua jocul cu urmatorul nivel sau daca jocul a fost pierdut)
  • functia de aprindere a unui led
  • functie care sa aprinda simultan toate ledurile (folosita pentru a semnala daca jocul a fost castigat - daca se ajunge la ultimul nivel se aprind toate ledurile de 3 ori; sau daca a fost pierdut - se aprind toate ledurile o data)
  • functia care returneaza un numar random care reprezinta numarul de ordine al unui led si care se foloseste pentru a stii care dintre ledu-ri va fi adaugat la modelul de lumini la urmatorul nivel)
  • functai del - realizeaza o inatrziere intre aprinderile de leduri
  • functia care verifica ce buton a fost apasat si care transmite semnalul ca butonul a fost apasat - folosita pentru a verifica daca butoanele apasate sunt in ordinea corecta

Prezentare pseudocod a unor functii mentionate mai sus:

1)Functia de aprindere a unui led:

void LED_on(char led) → led - va indica ledu-ul ce trebuie sa fie aprins {

PORTA = led;
del(1);       -> realizeaza intarzierea astefl incat aprinderea led-ului sa fie vizibila
PORTA = OFF;  -> realizeaza stingerea led-ului

}

2)Functia de verificarea pentru a vedea ce buton a fost apasat:

int pressButton() {

int pressed = 0;
int button = -1;	
while(pressed == 0)	-> asteapta cat timp nu s-a apasat un buton
{
             ---------------- Verificare stare buton 0 -------------- 
	if((PINC & BIT0) ==0) 
	{
		PORTA = BIT0;
		while(((PINC & BIT0) ==0));  -> se asteapta pana la eliberarea butonului
		PORTA = OFF;
		pressed = 1;
		button = 0;
		break;
	}
             ---------------------------------------------------------- 		
              >>>> Se procedeaza analog pentru celelalte butoane (1-5) <<<<
}	
return button;	-> returneaza ce buton a fost apasat	

}

3) Pasii de urmat in functia main:

int main() {

... Declaratii variabile ...
// setam pinii portului A ca pini de iesire
DDRA = 0xFF;
// setam pinii portului C ca pini de intrare
DDRC = 0x00;
// activam rezistenta de pull-up pe portul C
PORTC = 0xFF;
while(1){
	// activam rezistenta de pull-up pe portul C
	PORTC = 0xFF;										
	// se genereaza aprinderea inca unui led aleator
	random = get_rand();
              // se retine numarul ledului aprins in vectorul ce retine secventa la care s-a ajuns
	model[cont] = random;
	cont = cont + 1;
	// daca cineva ajunge la finalul jocului toate ledurile se aprind de 3 ori  pentru a semnala acest lucru
	if (cont == DIM)
	{
		all_LEDs_on();
		del(1);
		all_LEDs_on();
		del(1);
		all_LEDs_on();
		del(1);
		break;
	}
	// se reda secventa curenta
	for(i=0;i<cont;i++)
	{
		switch(model[i])
		{
			case 0: led = BIT0; break;
                              ... Analog pentru case 1 - case 5 ...  
		}
		LED_on(led);
		del(1);
	}
              ... Resetari variabile (crt = 0, done = 0, correct = 1) ...
              // cat timp nu s-a tastat toata secventa si secventa tastata e corecta
	while(done == 0 && correct == 1)
	{
		button = pressButton(); // se asteapta apasarea unui buton
		del(1);
		if(button != -1)	// s-a apasat corect un buton
		{
			if(button != model[crt])	// nu s-a apasat butonul care urma in secventa
			{
				// se aprind toate led-urile o data sa se semnaleze ca jocul a fost pierdut
				all_LEDs_on();
				del(1);
				correct = 0;
				cont = 0;
				break;
			}
		}
		crt++;
		if(crt >= cont)
			done = 1;	// s-a introdus toata secventa			
	}
}
return 0;

}

Rezultat

La finalul proiectului s-a obtinut un joc functional “Simon says”

Concluzii

De la un anumit nivel jocul devine destul de greu.

Este mai bine sa existe un spatiu putin mai mare pe placuta intre butoane, respectiv becuri, astfel fiind mai usor de manevrat jocul

Mi s-a parut foarte util sa lucrez la acest proiect pentru ca astfel am inteles cum anume se poate crea de la 0 o aplicatie si cum se face legatura intre partea software si partea hardware.

Download

Bibliografie

pm/prj2011/dtudose/simon_says.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