Iulian LAZĂR - X si 0

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

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.

Descriere generală


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.


Schema bloc a proiectului:

Hardware Design

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 Design

Software folosit:

  • Eagle
  • WinAVR
  • Programmer's Notepad


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 “1”: buton stanga (ledul corespunzator de pe placa de baza)
  • Pentru “2”: buton sus (ledul din dreapta butoanelor in culoarea rosie)
  • Pentru “3”: buton dreapta (ledul din dreapta butoanelor in culoarea verde)

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.

  • Daca exista pericol din partea adversarului, vom muta astfel incat sa nu fie castigatoare mutarea acestuia. Daca botul are mutare castigatoare si exista pericol din partea adversarului, vom face mutarea noastra.
  • Daca adversarul nu are mutare castigatoare, vom determina numarul maxim de leduri ce ne pot duce la succes pe linie/coloana/diagonala. (leduri deja aprinse de bot ( de exemplu “X”)). Daca numarul ledurilor aprinse este acelasi, vom muta unde sunt mai putine leduri neaprinse. (acolo unde sunt mai putine leduri aprinse din partea adversarului).

Rezultate Obţinute

Lipire componente pe placuta test:




Proiectul a fost finalizat. Jocul “X si 0” functioneaza asa cum trebuie, in toate modurile de joc.

Concluzii

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.

Download

Jurnal

[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 %).

Bibliografie/Resurse

pm/prj2013/sstegaru/x-si-0.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