Table of Contents

TicTacToe

Student: Petcu Eduard
Grupa: 334CC

Introducere

Pentru acest proiect, voi implementa jocul de X si O pe un ecran de LCD SPI de 1.8”. Acesta va putea fi jucat fie de catre 2 jucatori, in modul P v P fie de catre un singur jucator in modul P v Com. Controlul jocului va avea loc exclusiv din joystick.

Am ales sa pornesc pe ideea aceasta intrucat am vrut sa imbin invatarea programarii pe o placuta Arduino cu utilizarea bibliotecilor gfx pentru a realiza randarea de imagini pe un LCD.

Proiectul are ca scop realizarea unui joc standard utilizand componente hardware.

Descriere generală

Pentru inceput, jucatorul va alege daca va juca o partida cu un alt jucator sau cu calculatorul. In cazul partidei PvP, un LED va indica care jucator trebuie sa faca o mutare. Tabla de X si 0 va fi afisata in mod constant pe LCD. La final, buzzer-ul va emite un sunet in functie de rezultatul partidei.

Modul de alegere a mutarilor calculatorului va avea la baza algoritmul Minimax.

Schema bloc

Hardware Design

Listă de piese:

  • Arduino Uno R3
  • LCD SPI 1.8”
  • Buzzer Activ 3V
  • Joystick
  • Fire
  • LED RGB

Software Design

Pentru implementarea partii software a jocului de TicTacToe am inclus bibliotecile SPI.h si TFT.h.
In functia setup() am configurat LED-ul RGB, ecranul LCD si joystick-ul si am randat meniul principal din care jucatorul poate alege daca sa joace contra unui alt jucator sau contra calculatorului.
In functia loop() se asteapta ca jucatorul sa aleaga unul din cele 2 moduri de joc.

La inceperea jocului, se apeleaza una din functiile PvPGame() sau PvComGame(), care se ocupa de jocul de TicTacToe propriu-zis.

In cele doua functii, se verifica daca jocul nu este terminat (in metoda resultOfGame()). In cazul in care meciul este inca in desfasurare, se verifica daca a avut loc o mutare a cursorului pe tabla de X si O. Verificarea are loc in functia moveCursor() la fiecare 500 ms folosind tehnica de debounce. La apasarea joystick-ului, se verifica daca mutarea dorita este una valida iar in caz contrar, un sunet corespunzator se va auzi la buzzer.

Metoda endGameText(int result) este apelata la finalul jocului, iar in functie de rezultatul partidei, se va afisa:

pe ecran timp de 5 secunde.

LED-ul RGB este folosit in modul de PvP pentru a indica ce jucator trebuie sa faca o mutare (culoarea rosu → X trebuie sa mute; culoarea albastra → O trebuie sa mute). De asemenea, acesta se aprinde la finalul jocului in culoarea jucatorului castigator sau in culoarea galbena (daca rezultatul este o remiza).

Rezultate Obţinute

Schema electrica:

Meniu principal:

Tabla de joc:

Victorie X:

Remiza:

Concluzii

Experienta de lucru la acest proiect a fost mai placuta decat ma asteptam intrucat am reusit sa aplic cunostintele invatate in cadrul laboratorului si am reusit sa realizez tot ce mi-am propus. Cel mai mult mi-a placut sa lucrez la partea software deoarece fiecare functie implementata avea un impact vizual pe LCD.
De asemenea, mi-a placut sa lucrez cu functiile din biblioteca Adafruit_GFX.h intrucat functionau similar cu functiile din framework-ul folosit la cursul de Elemente de Grafica pe Calculator.

Download

Codul sursa se poate gasi in arhiva: tictactoe.zip

Jurnal

Bibliografie/Resurse

https://eessential.blogspot.com/2017/12/18-128-x-160-tft-lcd.html?m=1
https://docs.arduino.cc/library-examples/tft-library/TFTDisplayText

Export to PDF