Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » scoala » informatica » c
Joc de dame - c++

Joc de dame - c++


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:

  1. constructorul asigura initializarea corecta a tuturor variabilelor membu ale unui obiect
  2. constructorul ofera o garantie ca initializarea unui obiect se va realizy o data.

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


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.