Universitatea "Stefan cel Mare" Suceava
Facultatea de Inginerie Electrica
Sectia Automatica si Informatica Aplicata
JOC DE DAME
- PROIECT -
Joc de DAME
1. Descriere Proiect
Aceasta tema de proiect a implicat realizarea unui joc de dame, joc care a fost denumit "Damisah Versiunea 1.0". Datorita faptului ca jocul este unic prin interfata, stil de programare si prin numele programator/creator-ului, i s-a adaugat la denumire si versiunea (Versiunea 1.0).
Jocul este implementat cu ajutorul limbajului de programare C++ si folosind mediul de programare BORLAND C++ 3.1.
"Damisah Versiunea 1.0" prezinta cat mai fidel cu putinta regulile internationale ale jocului de dame ("Checkers"). Se foloseste o tabla asemenea tablei pentru sah, adica formata din 64 de campuri (patrate), asezate intr-un grid de 8x8. Acestea sunt culorate alternant in 2 culori, una inchisa si una deschisa. Dame se joaca numai pe campurile inchise la culoare. Astfel fiecare jucator are la dreapta sa un patrat deschis la culoare, iar la stanga unul inchis la culoare. Cei 2 jucatori au la dispozitie cate 12 piese de 2 culori diferite; deobicei acestea sunt Rosii si Albe. Pieselor Rosii li se spun piese Negre sau Rosii. In "Damisah Versiunea 1.0" piesele sunt initial Albe si Negre.
Regulile jocului de Dame
Jucatorii incep cu cele 12 piese pozitionate pe acele 12 campuri care sunt cele mai apropiate de marginea lui/ei.
Piesele sunt de 2 feluri: normale si regi. O piesa normala se poate muta numai cate un patrat, diagonal, spre inainte. O data ajunsa la marginea adversa, piesa devine rege (i se mai adauga o piesa deasupra). Un rege poate fi mutat si diagonal inapoi, tot cate un patrat.
Scopul jocului este sa capturezi piesele adversarului. O piesa poate fi capturata prin saritura. Astfel piesa care captureaza se va muta la 2 campuri distanta, adica dupa piesa capturata. O mutare poate fi formata dintr-o serie de mai multe sarituri (capturari). Nu se poate sari decat peste o piesa adversa. Daca exista posibilitatea de a captura o piesa a adversarului, atunci jucatorul este obligat sa o faca. De asemenea un jucator este obligat sa efectueze tota seria de capturari posibile. O piesa devenita rege nu poate captura decat la urmatoarea tura. Piesa capturata se ridica de pe tabla.
Jocul se termina atunci cand unui jucator i-au fost capturate toate piesele, sau se afla in imposibilitate de a mai muta.
Reguli pentru "Damisah Versiunea 1.0"
"Damisah Versiunea 1.0" respecta regulile prezentate mai sus cu cateva exceptii:
castiga cel care captureaza toate piesele adversarului
nu se poate efectua mai mult de o mutare pe tura
nu se pot efectua capturari multiple (serii de sarituri)
Interfata
La rularea executabilului corespunzator, utilizatorul este pus in fata unei serii de intrebari cu privire la culorile ce vor doresc a fi folosite in cadrul jocului. Daca se alege a nu se modifica nici unul dintre acesti parametri, culorile vor fi:
tabla cu campuri Rosii si Galbene
piesele negre - Negre
piesele albe - Albe
Apoi apare interfeta specifica. Tabla de joc se afla in partea stanga. Aceasta are pe margini gradatii asemenea celor utilizate pentru jocul de sah. Astfel se poate citi si introduce de la tastatura mutarea ce va fi efectuata.
In partea dreapta, alternativ, apare:
"Primul jucator de la mutare : "
"Al doilea jucator e la mutare : "
si fiecare jucator in parte poate sa-si introduca mutarea dorita.
Jocul dispune si de HELP. Acesta poate fi accesat prin apasarea tastei F1 dupa cum este scris in partea de jos a ecranului. Acesta consta din cateva explicatii minore referitor la modul de utilizare al jocului.
2. Baza teoretica
Clase
Notiunea de clasa introdusa de C++ se apropie de notiunea de structura dar apar undele diferente:
structura are ca membri doar date in viziune C
clasa contine si date si functii
Variabilele de tip clasa sunt denumite instante (obiecte - ce sunt notiuni fizice (nu au memorie alocata)). Variabilele de tip clasa exista in memorie.
Clase si obiecte
Sintaxa generala pentru definirea unei clase:
Class <id_clasa> [:[specificator_acces] <id_clasa_baza>[.] ]
[<lista_obiecte>];
Unde:
Id_clasa : un identificator (numele clasei similar cu structurile)
Id_clasa_baza : numele clasei/claselor de baza din care deriva clasa id_clasa
Specificator?acces : indica tipul mosteniriice poate fi impartita in:
mostenire publica
mostenire privata
mostenire protected
lista_membri : lista tuturor membrilor clasei cu observatia ca pe langa date membre intalnim si si functii membre.
Lista_obiecte : lista variabilelor apartinand clasei respective (a obiectelor).
Operatorii de acces
Operatorii de acces la datele unei clase sunt:
Obiect.membru
Pointer_ob->membru
Datele private nu sunt accesibile din exteriorul clasei, in schimb functiile publice pot returna valori private.
Operatorul de rezolutie ::
Operatorul de rezolutie apare utilizat in limbajul C++ in 2 situatii:
la accesarea unor variabile mascate de existenta altor variabile locale
in cazul stabilirii apartenentei unei functii la o anumita clasa:
cazul definirii functiilor membre ale unei clase
cazul apelului unei functii dintr-o clasa de baza mascata de o functie in clasa derivata.
Stream-uri
Stream-urile au in principal rolul de a abstractiza operatiile de intrare/iesire. Ele ofera metode de scriere si citire a datelor independente de dispozitivul I/O si chiar independente de platforma. Stream-urile incapsuleaza problemele specifice dispozitivului cu care se lucreaza, sub biblioteca standard iostream.
Alt avantaj al utilizarii stream-urilor se datoreaza implementarii bibliotecii iostream, care utilizeaza un sistem de buffer-e. Se stie ca in general operatiile de intrare/iesire cu dispozitivele periferice sunt relativ mari consumatoare de timp, astfel incat aplicatiile sunt uneori nevoite sa astepte terminarea acestor operatiuni.
Informatiile trimise catre un stream nu sunt scise imediat in dispozitivul in cauza, ci sunt transmise intr-o zona de memorie tampon, din care sunt descircate catre dispozitiv abia in momentul umplerii acestei zone de memorie.
In C++, stream-urile au fost implementate utulizand clase dupa cum urmeaza:
clasa streambuf gestioneaza buffer-ele
clasa ios este clasa de baza pentru clasele de stream-uri de intrare si de iesire. Clasa ios are ca variabila membru un oviect de tip streambuf.
clasele istream si ostream sunt derivate din ios.
clasa iostream este derivata din istream si ostream si ofera metode pentru lucrul cu terminalul
clasa fstream ofera metode pentru operatii cu fisiere.
Obiecte standard
Cand un program C++ care include iostream.h este lansat in executie, sunt create si initializate automat 4 obiecte:
cin gestioneaza intrarea de la intrarea standard (tastatura)
cout gestioneaza iesirea de la iesirea standard (tastatura)
cerr gestioneaza iesirea catre dispozitivul standard de eroare (ecranul), neutilizand buffer-e
clog gstioneaza iesirea catre dispozitivul standard (ecranul), utilizand buffer-e
Constructorii clasei
Deoarece nicaieri nu este specificat faptul ca un obiect trebuie initializat, un programator poate uita sa faca acest lucru, sau (adesea cu rezultate dezastruoase) sa faca acest lucru de 2 ori.
O conceptie mai buna este aceea de a permite programatorului sa declare o functie cu scopul explicit de a initializa obiecte. Deoarece aceasta functie construieste obiecte de un tip dat, ea se numeste constructor.
Utilitatea constructorilor este evidenta cel putin sub 2 aspecte:
Observatii:
Un constructor poarta numele clasei careia ii apartine.
Constructorii nu pot returna valori. In plus, prin conventie, nici la declararea si nici la definirea lor nu poate fi specificat tipul void ca tip returnat.
Adresa constructorilor nu este accesibila programatorului
Constructorii sunt apelati implicit ori de cate ori este nevoie.
In cazul in care o clasa nu are nici un constructor declarat de programator, compilatorul va generea implicit unul. Acesta va fi public, fara nici un parametru si va avea o lista vida de instructiuni.
Constructorul implicit se numeste si constructorul fara lista de argumente declarat de programator.
Daca constructorul are argumente, ele pot fi furnizate.
Tehnici utilizate
La inceputul jocului sunt cititi 4 culori pentru tabla respectiv piese.
Toti acesti parametri sunt retinuti intr-un obiect. Functia culoare() care se ocupa cu afisarea acestor intrebari e membra publica a class tabla.
class tabla;
Clasa dispune de 2 constructori, dintre care unul este cel implicit. In constructorul implicit se initializeaza valorile variabilelor ce retin intregi corespunzatori culorilor respective. Initial cs1=4 (RED), cs2=14 (YELLOW), cp1=0 (BLACK), cp2=15 (WHITE).
Al doilea constructor atribuie acestor variabile valori noi, citite in functia culoare(). Constructorul se apeleaza in cadrul acestei functii. Functia returneaza ca parametru obiectul astfel creat
In esenta, mutarea unei piese pe tabla de dame, se efectueaza prin afisari repetate una peste alta. Pentru a jongla cu afisari s-a folosit biblioteca conio.h. Din aceasta biblioteca (console input and output) s-au folosit functiile:
Getch();//citeste un caracter de la consola
Getche();//citeste un caracter de la consola cu ecou
Gotoxy(int x,int y);//muta cursorul pe ecran la pozitia(x,y)
Clrscr();//sterge ecranul
Textbackground(int newcolor);//seteaza culoarea de fundal a textului
Textcolor(int newcolor);//seteaza culoarea textului
S-a folosit Cprintf(); in loc de cout acolo unde era necesar de afisat folosind functiile textbackground si textcolor.
Exemplu:
Tabla se afiseaza folosind :
Textbackground(culoare) si apoi cprintf(" ");
Astfel se afiseaza spatii cu fundal colorat.
Pentru piese:
Textbackground(culoare);
Textcolor(culoare1);
Cprintf("O");
Totodata, pentru a face verificarea asupra pozitiilor in care exista sau nu piese sau pentru a face verificarea de sfarsit de joc, intreaga tabla de dame este retinuta intr-un tablou bidimensional (matrice) de 9x9 si se utilizeaza numai pozitiile de la 1 la 8.
Aceasta matrice se initializeaza cu 0 la inceput, apoi fiecarui element de pe o pozitie corespunzatoare unei piese a priumului jucator i se atribuie valoarea 1, iar pentru al doilea jucator -1. In momentul in care una dintre piese ajunge la marginea adversa (devine rege), elementele devin 2 respectiv -2.
Alternarea intre jucatori se face cu ajutorul unei variabile player transmise ca parametru functiei mutare_buna. Aceasta initial este -1, iar pentru a schimba tura se inmulteste cu -1.
Descriere algoritm
Cunoscandu-se acum culorile necesare, se afiseaza pe ecran careul (careu()), pisesle (piese()) si gradatiile (gradatii()).
In afara de partea de inceput a jocului (cea cu setarile de culori), tot algoritmul este structurat intr-o structura repetitiva. Se paraseste aceasta structura in momentul apasarii tastei ESC.
In cadrul acestei structuri se executa urmatorul algoritm:
Daca inca nu s-a ajuns la sfarsit de joc
citeste alternativ mutarile jucatorilor, caracter cu caracter
daca s-a citit BACKSPACE atunci se reia citirea mutarii
altfel, daca s-a citit F1, se apeleaza functia de afisare HELP help()
altfel, daca s-a citit ESC atunci se apeleaza exit(0) si executia programului se incheie
daca s-a citit o mutare, atunci se verifica daca e corecta cu functia mutare_buna (char [5],int [9][9], int)
daca mutarea a fost introdusa corect atunci in aceeasi functie se va executa si mutarea piesei
altfel, se va afisa "Mutare incorecta" si tot ALGORITMUL SE REIA
Functia mutare_buna (char [5],int [9][9], int) are dublu rol, de a verifica corectitudinea mutarii citite, si de a efectua mutarea in caz ca e corecta. Se returneaza 0 daca mutarea e incorecta, sau 1 daca e corecta si mutarea s-a efectuat.
Mutarile se introduc sub forma: a3-b4. Algoritmul verifica ca:
pe pozitia 2 sa existe caracterul "-"
pe pozitiile 0 si 3 sa existe litere intre A si H
pe pozitiile 1 si 4 sa existe cifre de la 1 la 8
Daca toate acestea sunt adevarate atunci se trece la efectuarea mutarii. Astfel se fac verificari pentru toate posibilitatile de miscare a unei piese normale, apoi a unui rege, ambele pentru ambii jucatori. Se muta piesa, si se sterge piesa de pe pozitia sa anterioara. Daca s-a capturat piesa, se sterge si piesa capturata. Stergerea se efectueaza afisand spatiu(" ") peste.
Cat timp se executa instructiunile din aceasta structura, utilizatorul are de ales intre urmatoarele actiuni:
sa iasa din joc prin apasarea tastei ESC
sa acceseze HELP prin apasarea tastei F1
sa introduca o mutare de la tastatura
daca mutarea introdusa este corecta, se va observa piesa de pe tabla de dame efectuand o deplasare catre pozitia data.
daca mutarea introdusa este invalida, atunci se va afisa "Mutare incorecta"
In momentul introducerii unei mutari de la tastatura, acest sir se memoreaza caracter cu caracter intr-un sir de caractere. Se face citirea caracter cu caracter pentru ca la orice moment dat din timpul citirii sa se poata:
apasa tasta ESC pentru a iesi din joc
apasa tasta BACKSPACE pentru a anula ce s-a introdus
apasa tasta F1 pentru a accesa HELP.
Jocul se termina in momentul in care unuia dintre jucatori i se captureaza tote piesele. In acel moment se va afisa pe ecran :
"GAME OVER! Alb a castigat" sau
"GAME OVER! Negru a castigat"
5. Formatul datelor de intrare/iesire
Ca si date de intrare, utilizatorul poate introduce de la tastatura:
culorile tablei
campuri inchise la culoare
campuri deschise la culoare
culorile pieselor
piese negre
piese albe
mutarea ce se doreste a fi efectuata
In urma citirii culorilor se observa schimbarea coloritului interfetei.
In urma citirii unei mutari:
daca mutarea e incorect scrisa atunci se afiseaza "Mutare incorecta"
daca mutarea e corecta atunci se executa mutarea, vizual, pe tabla
6. Concluzii
Acest joc reprezinta o varianta rudimentara a jocului de dame.
In urma efectuarii unor partide experimentale, s-a observat ca se poate intampla ca la o capturare de piesa, piesa capturata sa nu dispara de pe tabla, in consecinta incurcand restul partidei.
Pe viitor ar fi util daca s-ar implementa toate regulile jocului de dame si daca s-ar rezolva toate micile erori de afisare.
BIBLIOGRAFIE
Suport laborator "Programare Orientata pe Obiecte", anul II, prof.dr.ing. Prodan Catalin Remus.
HELP BORLAND C++ 3.1
https://www.jimloy.com/checkers/rules2.htm
CUPRINS
1. Descriere proiect | ||
2. Baza teoretica | ||
3. Tehnici utilizate | ||
4. Descriere algoritm | ||
5. Formatul datelor de intrare/iesire | ||
6. Concluzii | ||
Bibliografie | ||
Cuprins |
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |