Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
Septica
CUPRINS
Introducere
Descriere si detalii de implementare
Cerinte Hardware
Listing-ul programului
Bibliografie
Introducere
Originile jocului de septica nu sunt bine cunoscute. Cu toate acestea, septica este un joc destul de popular in Romania. Denumirea provine de la cartea cu numarul 7, care are un rol strategic in acest joc.
Tema
S-a realizat implementarea popularului joc de carti "Septica". Scopul acestui joc este sa obtii cat mai multe puncte la sfarsit. Pentru jocul de septica este folosit un pachet de 32 de carti, incepand de la 7 pana la as: 7, 8, 9, 10, J, Q, K, A. Fiecarui jucator i se vor da la inceput cate patru carti, iar restul de carti va fi pus cu fata in jos pe masa. Dupa terminarea rundei, fiecare jucator trebuie sa traga una, doua, trei sau patru carti (in functie de cate carti au fost jucate in runda) din pachetul lasat pe masa.
Prima mana este inceputa de jucatorul care a creat masa (in cazul acestui joc, utilizatorul), apoi jocul continua in sens trigonometric pana cand fiecare aseaza o carte pe masa. In jocul de septica nu este necesara respectarea culorii jucate initial, fiecare jucator avand dreptul de a pune orice carte pe masa. La jocul de septica prezinta importanta "taierea' adversarului, ceea ce semnifica faptul ca un jucator isi poate "taia' oponentul prin jucarea unei carti de acelasi tip cu cea jucata de adversarul sau in prealabil. La sfarsitul unei runde fiecare jucator trebuie sa aiba in mana un numar egal de carti cu cele ale adversarului sau, de exemplu, daca un jucator incepe runda si oponentul lui il "taie', apoi primul jucator continua, cel de-al doilea jucator nu are dreptul sa cedeze mana fara a da o carte, chiar daca aceasta nu mai este o "taiere'. O runda este castigata de jucatorul care a taiat ultimul. El va lua toate cartile jucate in acea mana. Tot el va fi cel care va incepe si urmatoarea runda. In jocul de septica punctele sunt decarii (10) si asii. 7-le, desi nu valoreaza nici un punct, este totusi o carte esentiala in acest joc, deoarece ea poate "taia' orice carte. Jocul se termina atunci cand toate cartile au fost epuizate. Jucatorul(echipa) care a acumulat cele mai multe puncte la sfarsitul jocului, va castiga meciul.
3. Descriere proiect si detalii de implementare
Programul a fost scris in limbajul C++. Exista doua moduri de joc: se poate juca la simplu cu 3 adversari (pentru care joaca calculatorul) ori la dublu (in echipa cu un jucator pentru care joaca calculatorul impotriva unei echipe formate din 2 jucatori pentru care joaca calculatorul).
Jocul incepe dupa ce au fost introduse numele jucatorului si modul de joc (care se poate schimba dupa terminarea unui joc).
Algoritmul dupa care joaca calculatorul (diferit pentru simplu, respectiv dublu) este descris mai jos.
Se folosesc doua module(unit-uri) mous.h(preluat din [1]) si carti.h care contin functii pentru folosirea mouse-ului, care se va folosi la selectarea cartilor dorite de catre utilizator, respectiv pentru implementarea grafica a jocului.
In desfasurarea jocului, se foloseste o functie bijectiva definita pe multimea cartilor folosite in joc cu valori in multimea . De asemenea, cartile folosite se marcheaza intr-un vector de intregi cu rol de variabile booleene. Jocul ia sfarsit atunci cand variabila care retine numarul de carti jucate ia valoarea 32 (adica, au fost jucate toate cartile). La fiecare pas, cartile din mana fiecarui jucator sunt retinute intr-o matrice patratica de dimensiuni 4x4. De asemenea, pozitiile cartilor (jucate in cadrul unei runde) in aceasta matrice sunt retinute intr-o alta matrice de dimensiune 4x4, astfel la sfarsitul rundei, tragerea de noi carti se face pe aceste pozitii. La inceputul jocului se genereaza aleator cartile pentru fiecare dintre jucatori. Dupa o runda, se genereaza aleator cartile pe care "le trag" jucatorii dintre cele nemarcate ca fiind folosite.
Descrierea algoritmului dupa care joaca calculatorul
1. In modul de joc single-player, daca nu a inceput runda, calculatorul foloseste urmatorul algoritm:
- va incerca sa taie cu o carte de valoarea celei jucate de cel care a inceput runda;
- daca in acest moment sunt puncte in joc, va taia cu 7;
- daca nu este in nici unul din cazurile anterioare, da o carte oarecare, dar evita sa dea punct sau septar (acest caz este posibil).
Cand trebuie sa inceapa runda, calculatorul joaca dupa urmatorul algoritm:
- cauta o carte diferita de septar care sa apara de mai multe ori;
- daca nu este gasita o astfel de carte, calculatorul joaca o carte oarecare, dar evita sa dea septarul.
2. In jocul de echipa, calculatorul foloseste urmatorul algoritm pentru cazul in care nu incepe runda:
- daca in acel moment nu castiga partenerul mana, incearca sa taie cu o carte egala ca valoare cu cea care a deschis runda;
- daca in acel moment nu castiga partenerul mana, iar jos sunt puncte jucate, incearca sa taie cu septarul;
- daca in acel moment mana este castigata de partener, calculatorul incearca sa joace un punct;
- daca nu este in nici unul din cazurile anterioare, calculatorul joaca o carte oarecare, dar incearca sa evite sa dea punct sau septar.
In cazul in care incepe, calculatorul foloseste acelasi algoritm ca si pentru modul single-player.
Alte detalii de implementare vor fi descrise mai jos in cadrul listing-ului programului.
4. Cerinte hardware
Aplicatia ruleaza pe platforma Windows, pe orice versiune a sistemului de operare, incepand de la Windows 95.
5. Listing-ul programului
Functiile folosite pentru jucarea rundei sunt urmatoarele: mutare_juc(), pentru mutarile utilizatorului, mutare_pls(), pentru mutarile calculatorului in modul single-player, mutare_plm(), pentru mutarile calculatorului in modul team-play. Cartea jucata de utilizator este obtinuta cu ajutorul functiei coord(), care foloseste modulul mouse.h.
void coord (void)
if ( mbutton == RIGHT ) exit(0);
}
mouse.HideMouse();
void mutare_juc() while ( nrc==15 );
if ( nrt==1 ) nr=nrc;
while ( (nrc!=nr && nrc!=7 && nrt%4==1) || nrc==15 || dat[(nrc-7)*4+cul-1] )
dat[(nrc-7)*4+cul-1]=1;
if ( nrc==nr || nrc==7 ) ia=0; if ( nrc==10 || nrc==11 ) nrpm++;
for ( i=0;i<=3;i++ )
if ( m[0][i]/4+7==nrc && m[0][i]%4+1==cul ) pozc[0][nrm-1]=i;
delcarte(3,c1+1); cartecentru(3,nrc,cul);
void mutare_pls()
cartecentru(turn1,nr1,m[turn][i]%4+1);
if ( nr1==10 || nr1==11 ) nrpm++;
ind1=1; dat[ (nr1-7)*4+m[turn][i]%4 ]=1;
pozc[turn][nrm-1]=i;
}
}
if ( !ind1 ) /* daca sunt puncte in joc, tai cu septar */
for ( i=0;i<=3 && !ind1;i++ )
cartecentru(turn1,nr1,m[turn][i]%4+1);
ind1=1; dat[ (nr1-7)*4+m[turn][i]%4 ]=1;
pozc[turn][nrm-1]=i;
}
}
if (!ind1) /* dau o carte, incerc sa evit sa dau 7 sau punct */
q=nr1; pl=p;
if ( nr1==7 || nr1==10 || nr1==11 )
}
}
if(nr1==7) ia=turn;
switch (turn)
cartecentru(turn1,nr1,m[turn][p]%4+1);
if ( nr1==10 || nr1==11 ) nrpm++;
dat[ (nr1-7)*4+m[turn][p]%4 ]=1; pozc[turn][nrm-1]=p;
}
}
else
}
}
if (!semn)
}
nr1=nr; pl=p; /* incerc sa evit sa dau septarul */
if (nr==7)
}
}
switch (turn)
cartecentru(turn1,nr,m[turn][p]%4+1);
if ( nr==10 || nr==11 ) nrpm++;
dat[ (nr-7)*4+m[turn][p]%4 ]=1; pozc[turn][nrm-1]=p;
}
delcarti(turn1,nrmt-nrm);
void mutare_plm()
cartecentru(turn1,nr1,m[turn][i]%4+1);
if ( nr1==10 || nr1==11 ) nrpm++;
ind1=1; dat[(nr1-7)*4+m[turn][i]%4]=1;pozc[turn][nrm-1]=i;
}
}
/* daca e nevoie tai cu septarul */
if ( !ind1 )
for ( i=0;i<=3 && !ind1;i++ )
cartecentru(turn1,nr1,m[turn][i]%4+1); ind1=1;
dat[ (nr1-7)*4+m[turn][i]%4 ]=1; pozc[turn][nrm-1]=i;
}
}
if (!ind1)
}
}
while (!semn)
q=nr1; pl=p;
/* incerc sa evit sa dau septar, punct */
if ( (nr1==7 || nr1==10 || nr1==11) && semn==2 )
}
}
if( nr1==7 || nr1==nr ) ia=turn;
switch (turn)
cartecentru(turn1,nr1,m[turn][p]%4+1);
if ( nr1==10 || nr1==11 ) nrpm++;
dat[ (nr1-7)*4+m[turn][p]%4 ]=1; pozc[turn][nrm-1]=p;
}
}
else /* incep */
}
}
if (!semn)
}
nr1=nr; pl=p; /* incerc sa evit sa dau septar */
if (nr==7)
}
}
switch (turn)
cartecentru(turn1,nr,m[turn][p]%4+1); if ( nr==10 || nr==11 ) nrpm++;
dat[(nr-7)*4+m[turn][p]%4]=1; pozc[turn][nrm-1]=p;
}
delcarti(turn1,nrmt-nrm);
Functiile verificare_juc(),verificare_pls() si verificare_plm()verifica daca jucatorul care a inceput runda (si posibil a taiat) poate continua, cu cartea data initial sau cu septar.
void verificare_pls()
}
}
void verificare_plm()
}
}
void verificare_juc()
if (
}
}
Functia care distribuie aleator carti la sfarsitul fiecarei runde jucate este tragere().
void tragere()
v[m[i][pozc[i][j]]]=1;
}
else m[i][pozc[i][j]]=32;
}
}
else
for (i=0; i<=3; i++) if (m[0][i]!=32) nrmt++;
sleep(1); delcentru();
Functiile urmatoare afiseaza in mod grafic pe ecran cartile jucatorilor (pe fata pentru utilizator, pe spate pentru calculator), respectiv scorul.
void afisare_juc()
else delcarte(i+1);
}
for ( i=1;i<=4;i++ )
}
void scor()
Prezentam in continuare unit-ul carti.h care se ocupa de afisarea grafica a cartilor pe ecran.
Functia culoare(int x, int y, int nr) afiseaza pe ecran, in functie de coordonatele primate ca parametrii(x si y), culoarea(tipul) unei carti(1 caro, 2 cupa, 3 trefla, 4 pica), retinuta in variabila nr.
void culoare (int x, int y, int nr)
setfillstyle(1,4); setcolor(4); fillpoly(4,poly); break;
}
case 2 :
case 3 :
;
fillpoly(4,poly); break;
}
case 4 :
;
fillpoly(4,poly); floodfill(x+10,y+10,0);
}}
Functia carte(int poz, int nr, int cul) afiseaza pe ecran la diferite coordinate (in functie de pozitia in mana utilizatorului, retinuta in variabila poz) cartea cu valoarea nr si culoarea cul.
void carte (int poz, int nr, int cul)
const int midx=75/2-10, midy=100/2-15;
setviewport (a,b,a+75,b+100,1); setfillstyle(1,7); bar (1,1,74,99);
settextstyle(0,0,3); settextjustify(LEFT_TEXT,TOP_TEXT);
if (cul<3) setcolor (4); else setcolor (0);
switch (nr)
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 12 :
case 13 :
case 14 :
}
setviewport(1,1,getmaxx(),getmaxy(),1);
Functia delcentru() sterge de pe ecran cartile jucate in runda respectiva (echivalentul miscarii de "luare" a cartilor de pe masa la sfarsitul unei runde).
void delcentru()
Functia cartecentru(int poz, int nr, int cul) este echivalentul miscarii de jucare a cartii cu numarul nr si culoarea cul de catre jucatorul cu numarul poz(3 este utilizatorul). In functie de poz difera si pozitiile pe ecran la care sunt afisate cartile, acestea nefiind asezate "unele sub altele".
void cartecentru (int poz, int nr, int cul)
const int midx=75/2-10, midy=100/2-15;
setviewport (a,b,a+75,b+100,1); setfillstyle(1,7); bar (1,1,74,99);
setlinestyle(0,1,3); setcolor(0); rectangle(1,1,74,99);
setlinestyle(0,1,1); settextstyle(0,0,3);
settextjustify(LEFT_TEXT,TOP_TEXT);
if (cul<3) setcolor (4); else setcolor (0);
switch (nr)
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 :
case 12 :
case 13 :
case 14 :
}
setviewport(1,1,getmaxx(),getmaxy(),1);
Functia cartesp(int mana, int poz) afiseaza "pe spate" cartile jucatorilor controlati de calculator, unde variabila mana retine numarul jucatorului care joaca cartea, iar poz reprezinta pozitia in mana acestuia a cartii respective. Bineinteles, coordonatele pe ecran sunt diferite, si sunt in functie de aceste doua variabile.
void cartesp (int mana, int poz)
break;}
case 2:
break;}
case 4:
break;}}
setfillstyle(1,4); bar(a,b,a+75,b+100); setcolor(0);
int sdf;
for (int asd=a; asd<=a+75; asd+=5) line(asd,b,asd,b+100);
for (sdf=b; sdf<=b+100; sdf+=5) line(a,sdf,a+75,sdf);
setlinestyle(0,1,3); setcolor(15);
rectangle(a,b,a+75,b+100); setlinestyle(0,1,1);
Functiile urmatoare se ocupa de stergerea de pe ecran (din mana fiecarui jucator) a cartilor jucate in runda respectiva.
void delcarte(int mana, int poz)
break;}
case 2:
break;}
case 3:
break; }
case 4:
break;}}
setviewport(a,b,a+77,b+102,0); clearviewport();
void delcarte (int poz)
void delcarti (int mana, int nr)
In continuare prezentam unit-ul mouse.h(preluat din [1]).
#include <conio.h>
#ifndef __MOUSE_H
#define __MOUSE_H
#include <dos.h>
#define LEFT 1
#define RIGHT 2
#define CENTER 3
class Mouse
void SetLimits (int minXLimit, int maxXLimit, int minYLimit, int maxYLimit);
void ShowMouse(void);
void HideMouse(void);
int Event(void);
int GetButton(void)
void GetXY (int &x, int &y)
void ButtonUp(void);
#endif
Mouse mouse;
Mouse::Mouse(void)
Mouse::~Mouse(void)
void Mouse::SetLimits( int minXLimit, int maxXLimit, int minYLimit, int
maxYLimit)
void Mouse::ShowMouse (void)
void Mouse::HideMouse(void)
int Mouse::Event (void)
void Mouse::ButtonUp(void)
In final, programul principal(main) al programului este:
int main()
c_juc=turn=ia=0;
cleardevice(); if (optiune==-21) return 0; scor();
while ( c_juc<32 )
}
tragere(); nrp[ia]+=nrpm; scor();
}
char drop= getch();
if (drop!=27) goto START;
return 0;
6. Bibliografie
1. "Creating Turbo C++ games", Editura Teora
2. https://www.cpp-home.com/
Sorin, Tudor "Informatica-varianta C++ - Manual pentru clasa a IX-a", Editura L&S Infomat
https://www.cprogramming.com/
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre:
|
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |