AI Nim

Introducere

Proiectul meu este un joc Nim [1], single player contra computer cu AI perfect. Scopul este de a realiza un joc ce ilustreaza cat de simplu este de fapt pentru computer sa joace perfect un joc in aparenta complicat.

Regulile jocului: Se considera N gramezi, fiecare gramada avand un numar de pietre. La fiecare pas, jucatorul aflat la mutare elimina un numar nenul de pietre (eventual toate) dintr-o singura gramada. Jucatorii muta alternativ. Castigatorul este cel care ia ultimele pietre. De obicei, jocul NIM se joaca cu 3 gramezi de pietre, insa strategia de castig este aceeasi indiferent de numarul gramezilor [2].

Pentru simplificare, am implementat varianta cu 3 gramezi cu 5,4 si 3 pietre.

Descriere generală

Pe langa placa de test, am mai facut inca o placa cu urmatoarele componente:

  • 5 rezistente de 1k8
  • 5 rezistente de 3k3
  • 2 diode 1N4148
  • 1 condensator 10uF
  • 4 butoane (A,B,C,D)

Ecranul este de la un Nokia 3310.

Piesele le-am achizitionat de la Syscom. Ecranul l-am achizionat de la un Service din Crangasi.

Hardware Design

eagle.jpg

  • Diodele sunt necesare pentru a limita tensiunea de 5V de la VCC la 3.6V (LCD-ul foloseste 3.3V, pe care ii primeste pe pinul 1 - VDD)
  • Condensatorul se leaga intre pinul 7 al LCD-ului si masa
  • Pinul 6 al LCD-ul este GND, se leaga la masa
  • Restul de 5 pini ai LCD-ului trebuie conectati la microcontroler pentru a controla ecranul. Deoarece uC foloseste 5V, iar LCD-ul 3.3V, trebuie pus un divizor de tensiune, realizat din rezistenele de 1k8 si 3k3 (rezistentele de 1k8 se leaga intre uC si rezistentele de 3k3, iar rezitentele de 3k3 la masa).
  • Butoanele se leaga direct la uC, deoarece acesta are incluse rezistente de pull-up (care trebuie activate prin software)
  • Observatie: Pinii microcontrolerului sunt numerotati gresit de Eagle, numele lor este cel corect. LCD-ul este simulat cu ajutorul celor 8 pini.

Software Design

Am pornit de la driverul de la Quantum Torque: [3]. Acesta contine functii pentru initializarea lcd-ului, scrierea de caractere si siruri, pozitionarea cursorului, si are definita o lista de caractere ce pot fi afisate. Trebuie modificat makefile-ul pentru atmega16 (in loc de atmega64 cum este el), altfel nu merge nici macar simularea in Proteus.

Trebuie modificat in lcd.h portul la care este conectat ecranul si fiecare pin in parte. In cazul meu, conform schemei de mai sus, definitiile sunt:

#define LCD_CLK_PIN     (1<<PC5)
#define LCD_DATA_PIN    (1<<PC1)
#define LCD_DC_PIN      (1<<PC4)
#define LCD_CE_PIN      (1<<PC2)
#define LCD_RST_PIN     (1<<PC3)
#define LCD_PORT        PORTC
#define LCD_DDR         DDRC

Am folosit 4 butoane, primele 3 sunt folosite in principal pentru a lua pietre din gramezi, iar al patrulea pentru a ceda randul.

Rezultate Obţinute

Placutele:

ensemble.jpg

Screenshots din simulator:

Screenshots din realitate:

start2.jpg

during.jpg

compwon3.jpg

Se poate observa ca exista o diferenta intre suprafata utila a ecranului in simulator si cea din realitate. In realitate se taie o mica fasie din partea de sus si exista o mare zona in plus in partea de jos. Aceasta zona de jos nefiind programata de driverul folosit, apare colorata aleator.

Concluzii

  • Letconul arde pielea rau de tot. Si apoi ustura si mai rau.

Download

Schema Proteus, Schema Eagle si cod: archive.zip

Bibliografie/Resurse

pm/prj2011/rtataroiu/nim.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