4 in a Row

Autorul poate fi contactat la adresa: andreea.mitran@stud.acs.pub.ro

Indroducere

Am ales să realizez pentru proiect joculețul 4-in-a-row (sau Connect four). Acesta constă de obicei într-o tablă 6×7 (deși are și alte variațiuni, chiar si cu dimensiunea 8×8), pe care doi jucători pot să plaseze discuri. Scopul jocului este de a-ți învinge adversarul, plasând 4 discuri în linie pe orizontală, verticală, sau oricare diagonală. Un jucător pune discul pe coloana pe care dorește ca acesta să cadă.

Ideea de la care am pornit a fost faptul că voiam să implementez un joc pe LED-uri, iar 4 in a Row mi se pare interesant prin faptul că poți dezvolta o strategie de câștig ce este mai complexă decât cea a unui joc cum este X și 0.

Descriere generală

Pentru diferențierea jucătorilor, aceștia vor avea discuri de culori diferite. Jucătorul poate alege coloana pe care dorește să plaseze un disc, iar acesta va „cădea” la baza tablei, adică deasupra tuturor celorlalte discuri așezate, sau pe ultima linie a tablei. Controlul discurilor și poziționarea lor se va realiza folosind butoane.

Schema bloc

Hardware Design

Listă de piese

  • Placă de bază
  • Placă de test
  • LED-uri roșii și galbene
  • Butoane
  • Buzzer
  • ULN2003
  • Rezistențe 1K
  • Tranzistoare BC557C, BC557B
  • Fire conductoare mamă-tată
  • Pini și porturi
  • Fir de rețea

Schema eletrică

Schema de mai jos arată matricea de led-uri pentru o singură culoare, simetric se realizează și pentru cealaltă.

Software Design

În ceea ce privește partea de Software Design, în primul rând a trebuit să realizez multiplexare în timp a aprinderii led-urilor. Astfel, am realizat acest lucru grupându-le 3 câte 3 pentru aprinderea și stingerea pe rând, într-un interval scurt (1ms), ca rezultatul să dea impresia că led-urile rămân aprinse în mod continuu. Am ales să fie grupate 3 câte 3, pentru ca intensitatea să nu scadă prea mult la aprinderea mai multor led-uri. Ele sunt multiplexate pe coloană.

Am realizat programarea matricei de led-uri și am respectat regulile jocului 4 in a Row, alternând led-urile aprinse în funcție de jucătorul al cărui rând este. Am folosit timere pentru aprinderea led-urilor și pentru buzzer. Există întotdeauna un led care este în starea de blinking, pe prima linie, pe care jucătorul îl poate muta folosind butoanele stânga/dreaptă pe altă coloană și poate lăsa „bila” să cadă apăsând butonul de jos. Butonul sus oferă o superputere jucătorului, putând să scoată o bilă adăugată de adversarul său.

La fiecare tură, jucătorul alege o acțiune și dacă aceasta nu poate fi realizată, este în continuare tura lui. După realizarea unei mutări, se verifică dacă jucătorul a câștigat și în acest caz, se trece la animația de final și la sunetul câștigător. Altfel, se schimbă tura.

De asemenea, am implementat tot folosind timere și funcționalitatea de animație, astfel încât atunci când un jucător lasă bila să cadă, se aprind pe rând led-urile până la „căderea” bilei pe tabla de joc. Butoanele sunt blocate în timpul animației și există un delay după ce un buton este apăsat, până a putea fi reapăsat, pentru a evita cazurile în care jucătorul apasă pe buton prea lung.

Rezultate obținute

Proiectul a ieșit așa cum mi-am propus, având și o superputere și animații.

Partea de hardware a fost foarte complexă, întrucât am implementat matricea de led-uri cu dimensiunea 6×7, atât pentru led-urile roșii, cât și pentru led-urile galbene, deci în total 84 de led-uri de lipit. Pe lângă acestea, am folosit un buzzer și butoane cu care să se poată deplasa în matrice jucătorul.

Rezultatul obținut ca și aspect se poate vedea în imaginile de mai jos și funcționalitatea în clip.

După cum se vede, fiecare coloană are 2 beculețe, unul pentru jucătorul cu roșu, unul pentru jucătorul cu galben.

Aspect frontal

Aspect spate

Concluzii

A fost o experiență interesantă, din care am avut ce învăța. Ce? În primul rând, NU FACEȚI VOI O MATRICE DE LED-URI. You're gonna regret it, trust me. Partea de lipit a fost cea mai grea și costisitoare ca și timp, întrucât se putea (și s-a întâmplat) greși foarte ușor. Ceea ce a făcut ca circuitul să fie și mai complicat, a fost probabil faptul că am avut duplicat, atât pentru culoarea roșu, cât și pentru galben de realizat serializarea led-urilor. Legarea finală a componentelor a fost de asemenea dificilă, întrucât a trebuit să folosesc tranzistoare și ULN2003 pentru a putea circula curentul prin circuit și pentru selecția liniei și coloanei dorite.

Ca și parte de Software, a fost destul de în regulă de implementat, a necesitat totuși puțină gândire și atenție la timere și multiplexare.

A fost un proiect migălos, la care partea de hardware a fost la un moment dat o corvoadă, dar rezultatul a fost pe măsura așteptărilor și a făcut să merite timpul petrecut pe lipit.

Alt sfat? Să faceți rost de o stație de lipit pe care să o folosiți acasă. A fost de extrem de mare ajutor. Apucați-vă din timp și cel mai important, asigurați-vă că proiectul vostru poate fi implementat pe plăcuța de bază (la mine a fost problematică folosirea pinilor, întrucât mi-au ajuns la limită).

Download

Codul sursă se găsește în următoarea arhivă:

connect4.zip

Jurnal

Etapa 1

Etapa 1 a constat în următoarele:

  • Procurarea componentelor necesare pentru placa de bază
  • Lipirea componentelor pe placa de bază
  • Procurarea componentelor necesare pentru placa de test

Etapa 2

Etapa 2 a constat în următoarele:

  • Realizarea lipirii matricei de led-uri pe placa de test
  • Realizarea lipiturilor pentru tranzistori, rezistențe, ULN-uri, port-pini pe placa de test

Etapa 3

Etapa 3 a constat în următoarele:

  • Conectarea plăcuței de test la placa de bază folosind fire mamă-tată
  • Realizarea Software Design
  • Încărcarea codului pe plăcuță

Bibliografie/Resurse

Laboratorul 0 de PM Laboratorul 3 de PM

Documentație

pm/prj2019/ctranca/4inarow.txt · Last modified: 2021/04/14 17:07 (external edit)
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