Autorul poate fi contactat la adresa: Login pentru adresa
Implementarea unui joc “X” si “0” ce se poate juca in 3 moduri: player vs player, player vs bot mediocru, player vs bot inteligent. Jocul este castigat de cel care obtine o linie, coloana sau diagonala.
Pentru selectarea modului de joc se apasa unul din cele 3 butoane: stanga( mod normal, player vs player), sus (modul player vs bot mediocru), dreapta (modul player vs bot inteligent). Dupa alegerea modului de joc, se apasa butonul central si jocul incepe. Jucatorul face prima mutare.
Pentru ledurile din matricea de leduri am folosit portul A, portul C si 2 pini din portul B. Pentru ledul ce reprezinta modul in care se joaca am folosit 1 pin din portul B si unul din portul D. Cele 5 butoane vor fi conectate la micro-controller la 3 pini din portul D, 2 pini din portul B si la GND.
Detalii componente | |||||
---|---|---|---|---|---|
Nume componenta | De unde a fost cumparata componenta | Cost per bucata | Numar bucati | Cost total (=cost per bucata * nr bucati) | Observatii |
Led bicolor | Conex | 1.5 RON | 10 | 15 RON | - |
Rezistenta | Syscom | 0.1 RON | 10 | 1 RON | - |
Buton | Syscom | 0.6 RON | 5 | 3 RON | - |
Placuta test | Syscom | 7 RON | 1 | 7 RON | - |
Cost total: 26 RON |
Software folosit:
Am organizat ledurile pe o matrice de 3 x 3. Pentru a determina ledul corespunzator din matrice am folosit o functie “check_led” (astfel am corespondenta dintre elementele matricei si pinii de pe microcontroller). Functia primeste ca parametri: linia,coloana din matrice si jucatorul care se afla la mutare (rosu sau verde) si returneaza o structura “PINI” cu pinul si portul ledului.
Pentru a determina castigatorul, folosesc o functie “check_win” ce returneaza o structura “_WINNER” ce contine un camp pentru castigatorul jocului si linia/coloana/diagonala castigatoare. Astfel, ledurile se vor aprinde intermitent pe linia/coloana/diagonala castigatoare in culoarea corespunzatoare castigatorului. In caz de egalitate toate ledurile se vor aprinde intermitent.
Matricea initiala are elementele egale cu 0 ( corespondenta cu leduri stinse, neselectate). Cand jucatorul 1 va selecta un element din matrice, acesta va deveni 1; cand jucatorul 2/ bot mediocru/ bot inteligent vor selecta un element din matrice, acesta va deveni 2.
Selectia modului de joc
Pentru a selecta modul de joc: player vs player(1), player vs bot bediocru(2), player vs bot inteligent(3), folosesc 3 din cele 5 butoane:
Pentru a porni jocul in modul dorit se apasa butonul central.
1. Modul de joc player vs player
Jocul porneste cu jucatorul 1 pentru selectie. Se va aprinde un led liber de pe matricea 3 x 3, urmand sa fie mutat in punctul dorit de jucator. Cand se apasa butonul din centru, ledul va ramane in acea pozitie. Matricea initiala are toate elementele egale cu 0. Cand jucatorul 1 a selectat un element, acel element din matrice va deveni 1. ( 0 reprezinta ledurile libere, 1 reprezinta ledurile jucatorului 1, 2 ledurile jucatorului 2). Acum jucatorul 2 va selecta si elemetul corespunzator ledului din matrice va deveni 2. Cu functia “check_win” verificam sa vedem daca avem acelasi elemente pe linie/coloana/diagonala. Daca avem, jocul se termina. In caz contrar, va fi egalitate.
2. Modul de joc player vs bot mediocru
Jocul porneste cu jucatorul 1 pentru selectie. Dupa ce acesta selecteaza ca si in modul “1”, bot-ul isi va alege mutarile aleator. Am folosit functia rand(). Pentru a nu avea aceleasi valori la fiecare pornire a jocului am folosit functia srand(), careia i-am atribuit ca parametru un intreg pe care il incrementez in “while(1)” corespunzator selectiei modului de joc. Astfel, la fiecare rulare a jocului voi avea un numar diferit. Am optat pentru acesata metoda deoarece nu dispuneam de functia “time” pe microcontroller.
3. Modul de joc player vs bot interligent
In acest mod, jocul porneste cu jucatorul 1 la selectie. Botul va face urmatoarea mutare.
Lipire componente pe placuta test:
Proiectul a fost finalizat. Jocul “X si 0” functioneaza asa cum trebuie, in toate modurile de joc.
Mi s-a parut util acest proiect, deoarece mi-am consolidat cunostintele dobandite in cadrul laboratorului. De asemenea, mi-a placut foarte mult sa lucrez la proiect, in special la partea de programare a modurilor de joc. Nici lipirea componentelor nu mi-a displacut, numai ca a fost destul de migalos sa le lipesc. Singura problema pe care am intampinat-o a fost cand placuta nu mai era recunoscuta de calculator. ( am fost de 3 ori la laborator pentru a-mi rescrie bootloader-ul, dar asta s-a intamplat din cauza mea, deoarece faceam scurt cand resetam placuta (tineam cu degetele dedesubt)).
In concluzie, cred ca acest proiect merita realizat.
Schematic Eagle: x_si_0_schematic.sch
Cod sursa: lazar_iulian_332ca_proiect_pm_2013.zip
Filmulet: http://www.youtube.com/watch?v=ZnOzzxTpj_k
[Etapa 1] - Achizitionare componente pentru placuta de la etapa 1 si lipirea acestora pe placuta.
[Etapa 2] - Achizitionare placuta de test si componente pentru realizarea unui joc X si 0.
[Etapa 3] - Lipire componente pe placuta de test ( 80% complet)
[Etapa 4] - Completare wiki
[Etapa 5] - Lipire componente pe placuta de test ( 100%). Legare placa de baza cu placuta test (20 %).
[Etapa 6] Legare placa de baza cu placuta test (100 %).
Resurse software
Librarie micro-controller “atmel.lbr”: http://www.cadsoft.de/cgi-bin/download.pl?page=/home/cadsoft/html_public/demo.htm&dir=eagle/userfiles/libraries&sort=name
Librarie buton “pbno_m.lbr”: http://www.cadsoft.de/cgi-bin/download.pl?page=/home/cadsoft/html_public/demo.htm&dir=eagle/userfiles/libraries&sort=name
Datasheet led bicolor : http://www.betlux.com/product/LED_lamp/Dual%20Color%20LED(2Pins)/BL-L517.PDF
Resurse hardware