„Do you know..?” este un joc de tip trivia, multiplayer! Jucatorii trebuie sa raspunda la intrebari de cultura generala, cat mai repede posibil! Primul care apasa butonul sau si raspunde corect este mai aproape de castig!
Ideea proiectului provine din incercarea realizarii unui produs care sa anime si sa destinda utilizatorii! Elementele aprofundate in cadrul laboratoarelor m-au ajutat enorm sa adaug caracteristici interesante jocului (precum intreruperile, in cazul determinarii celui care a apasat primul butonul).
O sesiune de joc se realizeaza in felul urmator:
Nume | Cantitate | Link |
---|---|---|
Arduino Mega 2560 | 1 | link |
LCD 2004 | 1 | link |
Buzzer pasiv | 1 | link |
Led-uri galbene | 4 | link |
Led rosu | 1 | link |
Led verde | 1 | link |
Butoane 6x6x6 | 7 | link |
Rezistor 0.5W 220Ω | 1 | link |
Rezistor 0.25W 220Ω | 6 | link |
Breadboard cu 170 de puncte | 6 | link |
Potentiometru stereo 10k | 1 | link |
Fire mama-mama, mama-tata, tata-tata | numar variat | |
Fire jumper | set variat |
<avr/io.h>
si <avr/interrupt.h>
<Arduino.h>
si <LiquidCrystal.h>
Din punct de vedere al organizarii, avem fisierul main.cpp
care contine logica principala a jocului si a setup-ului, iar pe langa acesta avem mai multe headere care contin functionalitati ajutatoare:
lcd_text.h
// intro const char intro[] PROGMEM = "Ready? <3"; // prompt-ul jucatorului 1 pentru scorul final const char player1Prompt[] PROGMEM = "1: ";
utils.h
volatile
functions.h
TIME_ROUND
secunde alocate intrebarii, distanta dintre aceste stari scade cu STEP_PAUSE_DURATION
; astfel realizam accelerarea sunetelor scoase de buzzer pentru fiecare intrebare;INT2
, INT3
, INT4
, INT5
);INPUT
si activarea rezistentei de PULL_UP, am si activat aceste intreruperi externe si le-am setat pe falling edge - intreruperea sa aiba loc cand se trece din HIGH→LOW
;clear
- sterge tot ecranulsetCursor(coloana, rand)
- pentru a merge pe ecran la pozitia de unde ne dorim sa incepem scrierea textului;print
tone
si noTone
din biblioteca externa Arduino in combinatie cu variabilele modificate de timer (care ne spun ce tip de sunet trebuie generat la fiecare moment);Pe parcursul jocului el trece prin mai multe stari, stari in care poate asteapta un input sau trebuie sa realizeze anumite operatiuni, o data sau de mai multe ori; motiv pentru care am ales sa implementez un Finite State Machine (FSM); cu aceasta abordare, loop() ramane functia principala, iar in fiecare bucla se realizeaza codul corespondent stari in care ne aflam; in functie de modificari si necesitate, se trece de la o stare la alta.
Avantajul este usurinta cu care se poate implementa si extinde, dar si probabilitatea mult mai mica de a avea probleme, inconsistente sau poate chiar blocari.
Pentru a implementa starile am folosit un enum, iar in cadrul buclei, folosind un switch ne dam seama in ce stare ne aflam.
enum GameState { INTRO, // afisam intro-ul WAIT_INTRO_DONE, // asteptam input de la jucatori QUESTION, // afisam o intrebare WAIT_PLAYER_QUESTION, // asteptam input de la jucatori ANSWER, // o mica animatie WAIT_ANSWER, // asteptam un raspuns de la jucatori AFTER_ANSWER, // daca se poate mergem la urmatoarea intrebare, daca nu afisam scorul final WAIT_FOR_RESTART // asteptam input de la jucatori (daca vor sa joace din nou) };
Un element de implementare pe care l-am folosit a fost polling pentru asteptarea unui input in starea de WAIT_ANSWER
. Fiind in aceasta stare urmatoare actiune posibila este strict apasarea unui buton din cele trei care reprezinta variantele de raspuns (A, B sau C). In aceasta situatie, verificarea repetata a valorilor ai acestori pini pana cand unul devine LOW este suficienta.
case WAIT_ANSWER: // wait for answer stateA = (PING & (1 << PG1)) ? 1 : 0; stateB = (PING & (1 << PG0)) ? 1 : 0; stateC = (PINL & (1 << PL7)) ? 1 : 0; if (stateA == LOW || stateB == LOW || stateC == LOW) { if (stateA == LOW) player_answer = 1; else if (stateB == LOW) player_answer = 2; else if (stateC == LOW) player_answer = 3; checkPlayerAnswer(); state = AFTER_ANSWER; } break;
Ca si rezultat, am reusit sa construiesc jocul sa faca tot ce mi-am dorit initial! Mai jos este atasat un mic demo care prezinta un exemplu de sesiune!
A fost o experienta placuta. Am realizat ceva foarte nou pentru mine si desi a fost cu peripetii pe alocuri, s-a meritat efortul. Am invatat foarte multe, mai ales pe partea de hardware si pot spune ca am avut noroc sa nu ard nimic!
Jocul consider ca are un potential mare desi acum e o varianta mai simpla, poate fi extins cu tot felul de alte features. Sper ca persoanele care au ocazia sa il testeze sa se simta bine!
Arhiva: do_you_know_game.zip
Resurse software:
Resurse hardware: