Ideea proiectului este de a reface in format fizic, folosind o placuta Arduino, un puzzle asemanator cu bomba din Counter Strike la care se mai adauga cateva features extra pentru o complexitate mai mare. Scopul este de a avea un puzzle care sa ofere o experienta imersiva in pielea unui inginer genist care trebuie sa isi foloseasca intuitia si indiciile primite pentru a dezamorsa o bomba contra timp. Pentru a da mai multa libertate de alegere utilizatorului vor exista 2 moduri de joc:
Utilizatorul are posibilitatea initial de a selecta un mod de joc cu ajutorul a 2 butoane: sandbox sau domination.
Se va cere sa se seteze un cronometru si o cheie de dezamorsare (in modul sandbox) sau vor fi generate random (in modul domination).
Apoi i se va cere sa introduca codul de armare a bombei cu ajutorul unui numpad si un buzzer va emite un sunet care sa indice faptul ca bomba a fost armata si timpul va incepe sa se scurga.
Pentru a dezamorsa bomba utilizatorul trebuie sa decupleze 3 fire in ordinea indicata de cheia de dezamorsare. Daca firele sunt scoase in alta ordine sau nu sunt scoase in timp util se va emite un sunet care sa indice faptul ca bomba a fost detonata.
De asemnea va exista posibilitatea de a dezamorsa bomba si prin introducerea codului secret.
Mediu de dezvoltare folosit: Arduino IDE
Biblioteci folosite:
Surse și funcții implementate: Codul sursă al proiectului este disponibil aici.
Am ales să implementez acest proiect sub forma unui automat finit de stări a cărui diagramă se poate găsi mai jos. În total am adăugat 22 de stări principale pentru a izola cât mai bine diferitele funcționalități ale jocului și pentru a oferi o experiență cât mai plăcută și intuitivă utilizatorului. În continuare voi face o scurtă prezentare a flowului prin aceste stări:
Pe lângă cele 22 stări principale am mai folosit și 4 stări în care automatul poate intra odată ce s-a declanșat procesul de dezamorsare. Utilitatea acestora poate fi înțeleasă mai bine în raport cu întreg mecanismul de dezamorsare: Pentru a tine minte care este secvența corectă de fire ce trebuie decuplate m-am folosit de 5 arrayuri de valori boolene. Fiecărui index îi corespunde o culoare stabilită arbitrar: 0 - roșu, 1 - albastru, 2 - verde, 3 - galben. 0 - fir cuplat, 1 - fir decuplat. Unul dintre arrayuri reprezintă secvența curentă de fire. Celelalte 4 reprezintă șabloane de referință pentru defuse stateurile 1, 2 și 3. Sunt populate în funcție de modul de joc ales: în dominaion în mod random, iar în sandbox pe baza firelor alese de utilizator. În funcție de valorile din acest array în starea 4 se determina un defuse state:
Trecerea dintr-un defuse state în altul se face secvențial. La fiecare pas, în funcție de defuse state se verifică dacă valorile din arrayul defuse stateului curent corespund cu valorile setate în șablonul de referință. Dacă arrayul defuse state curent nu corespunde cu șablonul defuse state atunci se generează detonarea bombei.
Defuse stateul curent este determinat prin funcția void check_D_current()
care face digitalRead pe pinii corespunzători firelor de dezamorsare. Acestea sunt declarate cu pinmode input_pullup, astfel încât atunci când sunt cuplate digitalRead returnează 0, iar când sunt decuplate returnează 1. Valorile sunt afișate de asemenea și la Serial Monitor.
În final am reușit să implementez funcționalitățile de bază pe care mi le-am propus la începutul proiectului, însă cu mici modificări aduse pe parcurs datorită calității îndoielnice a componentelor avute la dispoziție. Atașez mai jos imagini cu proiectul final.
Sunt mulțumit de rezultatul obținut întrucat am reușit să refac un joc drag mie. Am mai lucrat înainte cu Arduino, dar aceasta a fost o provocare.
Din păcate nu am reușit să adaug un feature extra, acela de a detona bomba prin apel telefonic folosind o cartelă SIM datorită unor probleme hardware. Modulul GSM (sim800l) pe care am încercat să-l folosesc pentru a realiza legătura cu apelurile telefonice nu a reușit să se conecteze la rețea, deși cablajul și alimentarea le-am realizat după indicațiile din datasheet.
12.05.2022 Creare repo GitHub.
14.05.2022 Implementare functionalitati de baza:
Probleme intampinate: efect de bouncing foarte mare pe butoane.
15.05.2022 Adaugare moduri de joc Domination si Sandbox.
19.05.2022 Update schema bloc, schema hardware și documentație.
26.05.2022 Finalizare documentație.