Connect4

Autor

Introducere

  • Scopul proiectului este de a implementa, folosind un ecran LCD, jocul Connect4
  • Connect4 este un joc 1 vs. 1. Fiecare jucător își alege o culoare la început, după care, rând pe rând, dă drumul unui disc într-un grid.
  • Scopul jucătorului este de a conecta pe orice rând, coloană sau diagonală 4 discuri, încercând în același timp să îl încurce pe adversar.
  • Ideea de pornire a fost implementarea unui joc 1 vs. 1 care să fie cât de cât interactiv. =)
  • Modul de control al jocului va fi: butonul verde, fiind un buton de selecție, va fi folosit pentru a selecta meniurile jocului și pentru a selecta coloana în care jucătorul va dori să dea drumul discului. Pentru a schimba coloana, jocătorul va apăsa pe butonul roșu din stânga sau pe butonul roșu din dreapta.

Poză descriptivă

Descriere generală

Schemă bloc

Funcționalitate

Plăcuța va primi input de la 3 butoane de control:

  • un buton care va reprezenta schimbarea coloanei spre stânga
  • un buton care va reprezenta shimbarea coloanei spre dreapta
  • un buton care va reprezenta selectarea coloanei

Jocul se va desfășura astfel:

  • pentru început, va exista un meniu de start. Pentru a începe jocul, se apasă butonul verde
  • primul jucător este cel reprezentat de culoarea roșie
  • jucătorul curent este specificat și pe ecran cu ajutorul unui mesaj și culoarea sa
  • discul jucătorului curent este colorat în mod corespunzător (roșu sau galben)
  • fiecare jucător se miscă în tura sa stânga sau dreapta, după care dă drumul unui disc
  • dupa ce un jucător câștigă, pe ecran vor fi afișate doar chenarul jocului și câștigătorul, fără alte informații care erau afișate de-a lungul jocului
  • dupa câteva secunde, jucătorii sunt anunțați că pot da replay la joc apăsând butonul verde
  • butonul de replay duce jocul în starea inițială (meniul principal de unde se poate alege începerea jocului)

Outputul va fi realizat cu ajutorul:

  • un modul LCD SPI
    • Folosește 5 pini de comunicație:
      • SCK
      • SDA
      • DC
      • RESET
      • CS
    • și 3 pini de conexiune
      • 5V
      • 3.3V
      • GND
    • Acesta va afișa jocul în sine, dar și alte informații:
      • scor
      • jucătorul curent
  • un buzzer pasiv cu diverse sunete
  • leduri care vor fi in sincronizare cu starea jocului (doar de decor)

Hardware Design

Listă de piese

  • Arduino
  • Modul LCD SPI 128×160
  • 3 butoane de control
  • buzzer pasiv
  • leduri
  • 2 x breadbord

Schema conectare LCD - Uno r3 și butoane

  • După cum se observă și în imagine, ecranul LCD trebuie conectat astfel:
Pin LCD Pin Arduino
LED 3.3V
SCK 13
SDA 11
A0 sau DC9
RESET 8
CS 10
GND GND
VCC 5V

Software Design

  • mediu de dezvoltare - Arduino Ide
  • librării şi surse 3rd-party
    • PinChangeInt.h - librărie cu funcționalități de attach și detach pentru întreruperi
    • TFT.h - librărie Arduino pentru ecran tft
    • SPI.h - librărie Arduino pentru comunicare SPI având ca master plăcuța Arduino

Diagrama stărilor

  • BEGIN: se afișează pe ecran mesajul: Press green to play
  • GAMEPLAY: fiecare jucător, rând pe rând, se mișcă stânga dreapta cu cele 2 butoane roșii. Selectează coloana preferată cu butonul verde. Pe ecran este afișat un grid de 6×7, discul care urmează a fi pus in grid, cât și un mesaj care informează despre rândul curent. Acest mesaj este: Player turn: 0/1, unde 0 și 1 sunt colorate corespunzător. După ce discul este pus, noul disc se va repoziționa în mijlocul gridului
  • WIN SCREEN: după ce un jucător căștigă, după un delay, se șterge rândul curent și se afișează cine este câștigătorul printr-un mesaj intermitent. Totodată, câștigul este anunțat printr-o melodie
  • REPLAY SCREEN: dupa câteva secunde, pe ecran apare: PRESS GREEN TO PLAY. După ce se apasă pe butonul verde, jocul repornește, iar starea va deveni starea inițială, adică BEGIN

Implementare

  • Pe baza butoanelor, jocul poate fi urmărit ca un automat de stări.
  • În loop se pot observa aceste stări: GAME_INIT, GAME_BEGINS, GAME_STARTED, cât și alte variabile de stare: player_switched (care imi spune dacă un player și-a realizat tura, eu ar trebui să afișez pe ecran ceea ce el a făcut, iar următorul jucător poate continua)
  • Am ales să folosesc destul de multe variabile de stări, înafară de acestea, deoarece am dorit să nu desenez la fiecare apel de loop încontinuu aceleași forme care oricum erau desenate.
  • În funcție de starea jocului, în anumite situații, am ales să redesenez ceea ce voiam să șterg cu culoarea background-ului, deoarece era mai costisitor să dau clear la ecran, după care să redesenez totul (în primul rând ar fi trebui să țin minte ce am desenat și în al 2-lea rând ecranul ar fi făcut un flicker constant, ceea ce ar fi fost urât).
  • Se poate observa că în cod sunt foarte multe define-uri, deoarece am vrut să economisesc cât mai multă memorie, define-urile fiind folosite doar in etapa de preprocesare

Rezultate Obţinute

Concluzii

  • Jocul este unul practic, realizat destul de low-cost. Am reușit să realizez tot ce mi-am propus, ba chiar am adăugat și lucruri în plus (la nivel de efect/software)
  • Dacă nu ai jocuri, îți faci LOL

Download

Jurnal

  • 26 aprilie - creare pagină pe ocw
    • Introducere
    • Poză reprezentativă
    • Schemă bloc
    • Funcționalitate
    • Listă de piese
  • 15 mai
    • prototip butoane (butoanele sunt funcționale)
    • Hello World pe ecranul lcd controlat de butoane
  • 16 mai
    • ecran de start
    • ecran de joc
    • chenarul jocului (tabla)
    • grid-ul jocului (al tablei)
  • 17 mai - funcționalitatea jocului e completă
    • bilele cad în locul selectat
    • fiecare jucător are acum culoarea lui asignată
    • ecran de finish + cine este câștigătorul
    • ecran de final de joc
    • funcționalitate de replay
  • 18 mai
    • led RGB care se colorează în funcție de rândul jucătorilor si starea jocului
    • buzzer care se alătură apăsării butoanelor
    • se aude un sunet atunci când există o victorie

Bibliografie/Resurse

pm/prj2021/agrigore/connect4.txt · Last modified: 2021/06/03 14:38 by mihaela.nuta1207
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