Table of Contents

Do you know..?

Introducere

„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).

Descriere generală

Schema bloc:

Module:

Flow:

O sesiune de joc se realizeaza in felul urmator:

  1. Intro - pe ecran apare mesajul “Ready<3” si pentru a incepe un jucator (oricare) trebuie sa apase butonul PRESS;
  2. Intrebare - intrebarile apar pe ecran pe rand si jucatorii trebuie sa apase cat mai repede butonul PRESS pentru a putea raspunde; o intrebare va sta pe ecran doar 30 de secunde, iar buzzerul, prin sunetele “tic-tac”, care devin din ce in ce mai rapide, ii face pe jucatori constienti de scurgerea timpului;
  3. Raspuns - dupa ce cel putin un jucator apasa PRESS, led-ul jucatorului care a apasat primul se va aprinde; dupa aceasta el are ocazia sa raspunda, iar led-urile verde si rosu ii vor oferi feedback, acompaniate de buzzer;
  4. Scor final - dupa ce jucatorii raspund la 10 intrebari, pe ecran va aparea scorul final al tuturor; folosind butoanele PRESS, jucatorii pot reincepe jocul;

Hardware Design

Componente:

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

Schema electrica:

Poze hardware:

Software Design

Mediu de dezvoltare

Biblioteci:

Functii si organizarea codului:

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:

// intro
const char intro[] PROGMEM = "Ready? <3";
// prompt-ul jucatorului 1 pentru scorul final
const char player1Prompt[] PROGMEM = "1: ";





Concepte din laboratoare:

Logica principala:

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;

Rezultate Obţinute

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!

demo!

Concluzii

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!

Download

Arhiva: do_you_know_game.zip

GitHub

Jurnal

Bibliografie/Resurse

Resurse software:

Resurse hardware: