Nim

Autor: Stefan Popovici

Introducere

Proiectul isi propune sa le ofere utilizatorilor posibilitatea de a juca jocul Nim, atat single player (jucator vs computer) cat si multiplayer (doi jucatori joaca unul impotriva celuilalt). Acesta este un joc simplu, care presupune existenta unor gramezi de obiecte din care jucatorii extrag, pe rand, unul sau mai multe obiecte la fiecare mutare, insa doar dintr-o singura gramada la un moment dat. Jucatorul care extrage ultimul pierde. Varianta implementata este cea cu trei gramezi de obiecte, cantitatile fiind generate aleatoriu (valori intre 1 si 50 inclusiv).

Descriere generala

Informatiile despre starea curenta a jocului sunt afisate pe un ecran LCD 16×2. Initial se vor afisa cele 2 moduri de joc disponibile. Odata ce unul dintre acestea este ales, in timpul derularii jocului se vor afisa cantitatile de obiecte ramase in fiecare din cele 3 gramezi, pe prima linie a ecranului, respectiv cantitatea ce se doreste a fi extrasa la urmatoarea mutare, pe a doua linie a ecranului, in dreptul gramezii (coloanei) dorite. Jucatorii au la dispozitie trei butoane si un potentiometru prin intermediul carora pot introduce mutarile pe care vor sa le faca atunci cand le vine randul. Cu ajutorul primelor doua butoane pot comuta spre stanga sau spre dreapta pentru a alege gramada din care vor sa extraga. Potentiometrul are rolul de a selecta cu usurinta cantitatea ce se doreste a fi extrasa, variind intre 1 si numarul de obiecte ramase in gramada respectiva. Nu in ultimul rand, ultimul buton (cel din dreapta) este folosit pentru a efectua mutarea stabilita in modul descris anterior si a ceda randul celuilalt jucator. In modul single player, pentru ca mutarile computerului sa poata fi observate cu usurinta de catre utilizator, acestea vor fi afisate pe ecran pentru un timp scurt, urmand apoi randul jucatorului. Cand jocul se termina, pe ecran se va afisa castigatorul, iar buzzerul va emite un sunet timp de cateva secunde.

Schema bloc

Hardware Design

Lista componente
Componenta Cantitate
Arduino UNO R3 1
LCD 16×2 1
Breadboard 400 points 1
Resistor 220 Ohm 1
Potentiometer 10kOhm 2
Pushbutton 3
Piezo capsule [PKM22EPP-40] 1
Solid core jumper wires
Schema circuitului

Software Design

Am folosit Arduino IDE 1.8.15 pentru dezvoltare. Am inclus biblioteca LiquidCrystal.h pentru a configura LCD-ul si pentru a afisa informatiile corespunzator.

In ceea ce priveste implementarea, jocul incepe cu selectarea modului dorit. Se poate alege modul single player folosind butonul din stanga sau modul multiplayer folosind butonul central. Se va afisa un mesaj corespunzator, apoi se afiseaza numarul de obiecte din fiecare gramada, iar jucatorii incep sa isi efectueze mutarile pe rand. Jucatorul care face prima mutare este ales aleatoriu. In cazul computerului, acesta are implementata o strategie optima de joc, bazata pe teoria numerelor. Astfel, va incerca mereu ca, dupa mutarea sa, numarul de obiecte ramase in cele 3 gramezi sa aiba propritatea de suma-nim nula (ceea ce presupune ca valoarea obtinuta prin aplicarea operatiei binare xor pe cele 3 valori sa fie 0). Daca acest lucru nu este posibil, atunci obtinerea unei victorii depinde de o potentiala greseala a adversarului, iar computerul va alege sa faca o mutare aleatoare. Mai multe detalii despre strategia de joc optima se gasesc aici. Finalul jocului este semnalat cu ajutorul buzzerului si printr-un mesaj corespunzator.

Rezultate Obtinute

Concluzii

Download

Cod + prezentare video: nim.zip

Jurnal

  • descriere + schema bloc: 30 aprilie 2021
  • hardware design, software design, rezultate, video, completare resurse + update descriere: 26 mai 2021

Bibliografie/Resurse

pm/prj2021/avaduva/nim.txt · Last modified: 2021/05/26 15:32 by stefan.popovici
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