Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <ctime>
- #include <cstdlib>
- #define clear system("cls") //questo è per windows, elimina il contenuto della console
- #define QUADRI 1
- using namespace std;
- const string NomiSemi[4]={"Cuori","Quadri","Fiori","Picche"};
- void pausa(){
- string fake;
- cout << endl << "Premere Invio Per continuare...";
- cin.ignore(1000,'\n');
- getline(cin,fake,'\n');
- }
- struct carta /*definisco la lista linkata*/
- {
- int seme;
- int numero;
- carta *Next;
- };
- int length(carta* Head) /*calcola quanti elementi ci sono nella lista linkata*/
- {
- carta *cur_ptr; /*il puntatore che attraverserà la lista*/
- int count=0; //il contatore degli elementi in lista
- cur_ptr=Head;
- while(cur_ptr != NULL) //finchè non raggiungo la fine della lista
- {
- cur_ptr=cur_ptr->Next; //vai avanti di un passo
- count++; //incrementa il contatore di 1
- }
- return count;
- }
- carta* addBeg(carta* Head, int sem, int num) //aggiunge l'elemento di seme sem e valore num all'inizio della lista Head
- {
- struct carta *temp; /*creo un nuovo elemento della lista allocando la memoria on the heap e inserendoci i dati*/
- temp= new carta;
- temp->numero=num;
- temp->seme=sem;
- if (Head == NULL) //se la lista è vuota
- {
- Head=temp; //La lista inizierà dal nuovo elemento
- Head->Next=NULL; //L'elemento successivo è NULL
- }
- else //se c'era già qualcosa in lista
- {
- temp->Next=Head; //l'elemento successivo al nuovo elemento è quello con cui iniziava la lista
- Head=temp; //la lista inizia dal nuovo elemento
- }
- return Head;
- }
- void display(carta* Head){ //visualizza la lista linkata
- carta* curr=Head;
- if (curr==NULL) cout << endl << "Il mazzo e' vuoto";
- else cout << endl;
- while(curr!=NULL){
- cout << curr->numero << " di " << NomiSemi[curr->seme] << '\t';
- curr=curr->Next;
- }
- }
- carta* Libera(carta* Head){ //svuota la lista liberando la memoria allocata
- carta* temp;
- while (Head!=NULL){ //finchè la lista non è vuota
- temp=Head->Next; //elimina il primo elemento e passa a quello successivo
- delete Head;
- Head=temp;
- }
- return Head;
- }
- carta* CreaMazzo(carta* Head){
- if (Head!=NULL) Head=Libera(Head);
- for (int i=0;i<4;i++){ //ciclo i semi
- for(int j=1;j<=10;j++){ //ciclo i numeri
- Head=addBeg(Head, i, j);
- }
- }
- return Head;
- }
- carta* Mescola(carta *list) //Classico algoritmo mergesort (il più efficiente con le liste linkate) con operatore di confronto un random
- {
- if (!list || !list->Next) return list;
- carta *right=list,*temp=list,*last=list,*result=0,*Next=0,*tail=0;
- while (temp && temp->Next) {last=right;right=right->Next,temp=temp->Next->Next;}
- last->Next=0;
- list=Mescola(list);
- right=Mescola(right);
- while (list || right)
- {
- if (!right) {Next=list;list=list->Next;}
- else if (!list) {Next=right;right=right->Next;}
- else if (rand()%2==0) {Next=list;list=list->Next;}
- else {Next=right;right=right->Next;}
- if (!result) result=Next; else tail->Next=Next;
- tail=Next;
- }
- return result;
- }
- carta* EstraiPrima(carta* sorgente, carta* &destinazione){ //mette la prima carta presente nel mazzo sorgente nel mazzo destinazione
- if (sorgente==NULL) return NULL;
- carta* sor=sorgente;
- destinazione=addBeg(destinazione, sor->seme, sor->numero);
- sorgente=sor->Next;
- delete sor;
- return sorgente;
- }
- bool Presa(carta* &tavolo, carta* &gioca, carta* &mazzo){
- /*Se la carta gioca prende, le carte prese in tavolo vengono spostate in mazzo e se il tavolo è vuoto scopa viene incrementato.
- Ritorna 0 se la carta non prende nulla, e 1 se prende*/
- carta* tv1=tavolo;
- carta* tv2=NULL;
- carta* tv3;
- carta* tv4;
- carta* tv5;
- carta* tv6;
- carta* tv7;
- carta* tv8;
- carta* tv9;
- carta* tv10;
- while(tv1!=NULL){ //cerco le carte con lo stesso numero
- if (gioca->numero==tv1->numero){
- mazzo=addBeg(mazzo,tv1->seme,tv1->numero);
- if(tv2==NULL){
- tavolo=tv1->Next;
- delete tv1;
- }
- else{
- tv2->Next=tv1->Next;
- delete tv1;
- }
- return true;
- }
- tv2=tv1;
- tv1=tv1->Next;
- }
- //somme
- if (tavolo!=NULL && tavolo->Next!=NULL){ //se ci sono almeno 2 carte in tavola
- tv1=tavolo;
- tv2=NULL;
- while(tv1!=NULL){
- tv3=tv1->Next;
- tv4=tv1;
- while(tv3!=NULL){
- if(gioca->numero==tv1->numero+tv3->numero){
- mazzo=addBeg(mazzo,tv1->seme,tv1->numero);
- mazzo=addBeg(mazzo,tv3->seme,tv3->numero);
- tv4->Next=tv3->Next;
- delete tv3;
- if(tv2==NULL){
- tavolo=tv1->Next;
- delete tv1;
- }
- else{
- tv2->Next=tv1->Next;
- delete tv1;
- }
- return true;
- }
- tv4=tv3;
- tv3=tv3->Next;
- }
- tv2=tv1;
- tv1=tv1->Next;
- }
- }
- if (length(tavolo)>=3){ //se ci sono almeno 3 carte in tavola
- tv1=tavolo;
- tv2=NULL;
- while(tv1!=NULL){
- tv3=tv1->Next;
- tv4=tv1;
- while(tv3!=NULL){
- tv5=tv3->Next;
- tv6=tv3;
- while (tv5!=NULL){
- if(gioca->numero==tv1->numero+tv3->numero+tv5->numero){
- mazzo=addBeg(mazzo,tv1->seme,tv1->numero);
- mazzo=addBeg(mazzo,tv3->seme,tv3->numero);
- mazzo=addBeg(mazzo,tv5->seme,tv5->numero);
- tv6->Next=tv5->Next;
- delete tv5;
- tv4->Next=tv3->Next;
- delete tv3;
- if(tv2==NULL){
- tavolo=tv1->Next;
- delete tv1;
- }
- else{
- tv2->Next=tv1->Next;
- delete tv1;
- }
- return true;
- }
- tv6=tv5;
- tv5=tv5->Next;
- }
- tv4=tv3;
- tv3=tv3->Next;
- }
- tv2=tv1;
- tv1=tv1->Next;
- }
- }
- if (length(tavolo)>=4){ //se ci sono almeno 4 carte in tavola
- tv1=tavolo;
- tv2=NULL;
- while(tv1!=NULL){
- tv3=tv1->Next;
- tv4=tv1;
- while(tv3!=NULL){
- tv5=tv3->Next;
- tv6=tv3;
- while (tv5!=NULL){
- tv7=tv5->Next;
- tv8=tv5;
- while (tv7!=NULL){
- if(gioca->numero==tv1->numero+tv3->numero+tv5->numero+tv7->numero){
- mazzo=addBeg(mazzo,tv1->seme,tv1->numero);
- mazzo=addBeg(mazzo,tv3->seme,tv3->numero);
- mazzo=addBeg(mazzo,tv5->seme,tv5->numero);
- mazzo=addBeg(mazzo,tv7->seme,tv7->numero);
- tv8->Next=tv7->Next;
- delete tv7;
- tv6->Next=tv5->Next;
- delete tv5;
- tv4->Next=tv3->Next;
- delete tv3;
- if(tv2==NULL){
- tavolo=tv1->Next;
- delete tv1;
- }
- else{
- tv2->Next=tv1->Next;
- delete tv1;
- }
- return true;
- }
- tv8=tv7;
- tv7=tv7->Next;
- }
- tv6=tv5;
- tv5=tv5->Next;
- }
- tv4=tv3;
- tv3=tv3->Next;
- }
- tv2=tv1;
- tv1=tv1->Next;
- }
- }
- if (length(tavolo)>=5){ //se ci sono almeno 5 carte in tavola
- tv1=tavolo;
- tv2=NULL;
- while(tv1!=NULL){
- tv3=tv1->Next;
- tv4=tv1;
- while(tv3!=NULL){
- tv5=tv3->Next;
- tv6=tv3;
- while (tv5!=NULL){
- tv7=tv5->Next;
- tv8=tv5;
- while (tv7!=NULL){
- tv9=tv7->Next;
- tv10=tv7;
- while (tv9!=NULL){
- if(gioca->numero==tv1->numero+tv3->numero+tv5->numero+tv7->numero+tv9->numero){
- mazzo=addBeg(mazzo,tv1->seme,tv1->numero);
- mazzo=addBeg(mazzo,tv3->seme,tv3->numero);
- mazzo=addBeg(mazzo,tv5->seme,tv5->numero);
- mazzo=addBeg(mazzo,tv7->seme,tv7->numero);
- mazzo=addBeg(mazzo,tv9->seme,tv9->numero);
- tv10->Next=tv9->Next;
- delete tv9;
- tv8->Next=tv7->Next;
- delete tv7;
- tv6->Next=tv5->Next;
- delete tv5;
- tv4->Next=tv3->Next;
- delete tv3;
- if(tv2==NULL){
- tavolo=tv1->Next;
- delete tv1;
- }
- else{
- tv2->Next=tv1->Next;
- delete tv1;
- }
- return true;
- }
- tv10=tv9;
- tv9=tv9->Next;
- }
- tv8=tv7;
- tv7=tv7->Next;
- }
- tv6=tv5;
- tv5=tv5->Next;
- }
- tv4=tv3;
- tv3=tv3->Next;
- }
- tv2=tv1;
- tv1=tv1->Next;
- }
- }
- return false;
- }
- int ContaPunti(carta* Mazzo){
- carta* curr=Mazzo;
- int result=0;
- int ori=0;
- if (length(Mazzo)>20) result++; //carte
- while(curr!=NULL){
- if (curr->seme==QUADRI){
- ori++;
- if (curr->numero==7) result++; //settebello
- }
- curr=curr->Next;
- }
- if (ori>5) result++; //ori
- return result;
- }
- bool MaggiorePrimiera(int a, int b){ //Ritorna vero se a vale di più di b nella primiera
- if (a==b) return false;
- if (a==0) return false;
- if (b==0) return true;
- if (a==7) return true;
- if (b==7) return false;
- if (a==6) return true;
- if (b==6) return false;
- if (a==1) return true;
- if (b==1) return false;
- if (a==5) return true;
- if (b==5) return false;
- if (a==4) return true;
- if (b==4) return false;
- if (a==3) return true;
- if (b==3) return false;
- if (a==2) return true;
- if (b==2) return false;
- if (a==10) return true;
- if (b==10) return false;
- if (a==9) return true;
- if (b==9) return false;
- if (a==8) return true;
- if (b==8) return false;
- return false;
- }
- int ValorePrimiera(int n){ //ritorna il valore, in punti della primiera, del numero n
- if (n==7) return 21;
- if (n==6) return 18;
- if (n==1) return 16;
- if (n==5) return 15;
- if (n==6) return 14;
- if (n==1) return 13;
- if (n==5) return 12;
- if (n>=8 && n<=10) return 10;
- return 0;
- }
- int Primiera(carta* Mazzo1, carta* Mazzo2){ //ritorna 1 se la primiera è del mazzo 1, 2 se è del mazzo 2, 0 se è patta
- int maxG1 [4]={0,0,0,0}; //per i due giocatori registro il massimo valore di carta (secondo l'ordinamento della primiera) per ogni seme
- int maxG2 [4]={0,0,0,0};
- carta* M1=Mazzo1;
- carta* M2=Mazzo2;
- int totG1=0;
- int totG2=0;
- while (M1!=NULL){
- if (MaggiorePrimiera(M1->numero,maxG1[M1->seme])) maxG1[M1->seme]=M1->numero;
- M1=M1->Next;
- }
- while (M2!=NULL){
- if (MaggiorePrimiera(M2->numero,maxG2[M2->seme])) maxG1[M2->seme]=M2->numero;
- M2=M2->Next;
- }
- for (int i=0;i<4;i++){
- totG1+=ValorePrimiera(maxG1[i]);
- totG2+=ValorePrimiera(maxG2[i]);
- }
- if (totG1==totG2) return 0;
- if (totG1>totG2) return 1;
- return 2;
- }
- int main(){
- int scelta;
- int last; //memorizza chi ha preso per ultimo
- carta* temp;
- carta* Mazzo=NULL;
- carta* Tavolo=NULL;
- carta* Giocatore1=NULL;
- carta* PreseG1=NULL;
- int scopeG1=0;
- int puntiG1=0;
- carta* Giocatore2=NULL;
- carta* PreseG2=NULL;
- int scopeG2=0;
- int puntiG2=0;
- srand(time(NULL));
- while (puntiG1<21 && puntiG2<21){
- Mazzo=CreaMazzo(Mazzo);
- Mazzo=Mescola(Mazzo);
- for (int i=0;i<4;i++){ //distribuisco le carte
- if(i<3){
- Mazzo=EstraiPrima(Mazzo,Giocatore1);
- Mazzo=EstraiPrima(Mazzo,Giocatore2);
- }
- Mazzo=EstraiPrima(Mazzo,Tavolo);
- }
- while (Mazzo!=NULL){
- //Round
- while(Giocatore1!=NULL && Giocatore2!=NULL){
- clear;
- cout << "Carte in tavola:";
- display(Tavolo);
- cout << endl << "Carte nella mano di Giocatore 1:" << endl;
- for (int i=0; i<length(Giocatore1); i++) cout << (char)('1'+i) << '\t' << '\t'; //numera le carte
- display(Giocatore1);
- scelta=1;
- do{ //mi assicuro che la scelta sia valida
- if (scelta<=0 || scelta>length(Giocatore1)) cout << endl << "Scelta non Valida!";
- cout << endl << "Quale Carta vuoi Giocare? "; cin >> scelta;
- }while(scelta<=0 || scelta>length(Giocatore1));
- switch(scelta){
- case 1:
- if (Presa(Tavolo,Giocatore1,PreseG1)){ //se prende sposta la carta dalla mano al mazzo
- last=1;
- if (Tavolo==NULL) scopeG1++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG1=addBeg(PreseG1,Giocatore1->seme,Giocatore1->numero);
- temp=Giocatore1;
- Giocatore1=Giocatore1->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore1->seme,Giocatore1->numero);
- temp=Giocatore1;
- Giocatore1=Giocatore1->Next;
- delete temp;
- }
- break;
- case 2:
- if (Presa(Tavolo,Giocatore1->Next,PreseG1)){ //se prende sposta la carta dalla mano al mazzo
- last=1;
- if (Tavolo==NULL) scopeG1++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG1=addBeg(PreseG1,Giocatore1->Next->seme,Giocatore1->Next->numero);
- temp=Giocatore1->Next;
- Giocatore1->Next=Giocatore1->Next->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore1->Next->seme,Giocatore1->Next->numero);
- temp=Giocatore1->Next;
- Giocatore1->Next=Giocatore1->Next->Next;
- delete temp;
- }
- break;
- case 3:
- if (Presa(Tavolo,Giocatore1->Next->Next,PreseG1)){ //se prende sposta la carta dalla mano al mazzo
- last=1;
- if (Tavolo==NULL) scopeG1++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG1=addBeg(PreseG1,Giocatore1->Next->Next->seme,Giocatore1->Next->Next->numero);
- temp=Giocatore1->Next->Next;
- Giocatore1->Next->Next=Giocatore1->Next->Next->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore1->Next->Next->seme,Giocatore1->Next->Next->numero);
- temp=Giocatore1->Next->Next;
- Giocatore1->Next->Next=Giocatore1->Next->Next->Next;
- delete temp;
- }
- break;
- }
- clear;
- cout << "Carte in tavola:";
- display(Tavolo);
- cout << endl << "Carte nella mano di Giocatore 2:" << endl;
- for (int i=0; i<length(Giocatore2); i++) cout << (char)('1'+i) << '\t' << '\t'; //numera le carte
- display(Giocatore2);
- scelta=1;
- do{ //mi assicuro che la scelta sia valida
- if (scelta<=0 || scelta>length(Giocatore2)) cout << endl << "Scelta non Valida!";
- cout << endl << "Quale Carta vuoi Giocare? "; cin >> scelta;
- }while(scelta<=0 || scelta>length(Giocatore2));
- switch(scelta){
- case 1:
- if (Presa(Tavolo,Giocatore2,PreseG2)){ //se prende sposta la carta dalla mano al mazzo
- last=2;
- if (Tavolo==NULL) scopeG2++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG2=addBeg(PreseG2,Giocatore2->seme,Giocatore2->numero);
- temp=Giocatore2;
- Giocatore2=Giocatore2->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore2->seme,Giocatore2->numero);
- temp=Giocatore2;
- Giocatore2=Giocatore2->Next;
- delete temp;
- }
- break;
- case 2:
- if (Presa(Tavolo,Giocatore2->Next,PreseG2)){ //se prende sposta la carta dalla mano al mazzo
- last=2;
- if (Tavolo==NULL) scopeG2++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG2=addBeg(PreseG2,Giocatore2->Next->seme,Giocatore2->Next->numero);
- temp=Giocatore2->Next;
- Giocatore2->Next=Giocatore2->Next->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore2->Next->seme,Giocatore2->Next->numero);
- temp=Giocatore2->Next;
- Giocatore2->Next=Giocatore2->Next->Next;
- delete temp;
- }
- break;
- case 3:
- if (Presa(Tavolo,Giocatore2->Next->Next,PreseG2)){ //se prende sposta la carta dalla mano al mazzo
- last=2;
- if (Tavolo==NULL) scopeG2++; //se non ci sono più carte in tavola hai fatto scopa
- PreseG2=addBeg(PreseG2,Giocatore2->Next->Next->seme,Giocatore2->Next->Next->numero);
- temp=Giocatore2->Next->Next;
- Giocatore2->Next->Next=Giocatore2->Next->Next->Next;
- delete temp;
- }
- else { //se no aggiungila in tavola
- Tavolo=addBeg(Tavolo,Giocatore2->Next->Next->seme,Giocatore2->Next->Next->numero);
- temp=Giocatore2->Next->Next;
- Giocatore2->Next->Next=Giocatore2->Next->Next->Next;
- delete temp;
- }
- break;
- }
- }
- // ridò le carte
- for (int i=0;i<3;i++){
- Mazzo=EstraiPrima(Mazzo,Giocatore1);
- Mazzo=EstraiPrima(Mazzo,Giocatore2);
- }
- }
- //fine round
- //tutto quello che c'è nel tavolo va all'ultimo che ha preso:
- if (last==1){
- while(Tavolo!=NULL){
- Tavolo=EstraiPrima(Tavolo,PreseG1);
- }
- }
- else{
- while(Tavolo!=NULL){
- Tavolo=EstraiPrima(Tavolo,PreseG2);
- }
- }
- //calcolo i punti
- scelta=Primiera(PreseG1,PreseG2);
- scopeG1+=ContaPunti(PreseG1);
- scopeG2+=ContaPunti(PreseG2);
- if (scelta==1) scopeG1++;
- if (scelta==2) scopeG2++;
- puntiG1+=scopeG1;
- puntiG2+=scopeG2;
- clear;
- cout << endl << "Punteggio di questa partita:" << endl << "Giocatore 1: " << scopeG1 << " Punti" << endl << "Giocatore 2: " << scopeG2 << " Punti"
- << endl << endl << "Punteggio Totale:" << endl << "Giocatore 1: " << puntiG1 << " Punti" << endl << "Giocatore 2: " << puntiG2 << " Punti";
- //resetto
- Giocatore1=Libera(Giocatore1);
- Giocatore2=Libera(Giocatore2);
- PreseG1=Libera(PreseG1);
- PreseG2=Libera(PreseG2);
- Mazzo=Libera(Mazzo);
- Tavolo=Libera(Tavolo);
- scopeG1=0;
- scopeG2=0;
- pausa();
- }
- clear;
- cout << endl << "Partita Terminata, Ha vinto il Giocatore " << (puntiG1>puntiG2 ? '1' : '2');
- Giocatore1=Libera(Giocatore1);
- Giocatore2=Libera(Giocatore2);
- PreseG1=Libera(PreseG1);
- PreseG2=Libera(PreseG2);
- Mazzo=Libera(Mazzo);
- Tavolo=Libera(Tavolo); //libero la memoria
- pausa();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement