Pella86

Lezione 7 - sequenze e mazzi

Oct 13th, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. #include <vector> // aggiungere la libreria vector
  5.  
  6. using namespace std;
  7.  
  8. //enumerazione seme
  9. enum Seme{
  10.     cuori = 0,
  11.     quadri = 1,
  12.     fiori = 2,
  13.     picche = 3,
  14. };
  15.  
  16. //enumerazione per i valori
  17. enum Valori{
  18.     Asso = 1,
  19.     Fante = 11,
  20.     Donna = 12,
  21.     Re = 13,
  22. };
  23.  
  24. class Carta{
  25. public:
  26.     // funzione di inizializzazione - costruttore
  27.     Carta(int ivalore, int iseme){
  28.         // i valori sono passati all'interno della funzione e assegnati agli
  29.         // attributi della classe
  30.         this->seme = iseme;
  31.         this->valore = ivalore;
  32.     }
  33.  
  34.     // funzione che stampa la carta
  35.     string stampa_carta(){
  36.         string nome_seme; // dichiarazione variabile seme
  37.  
  38.         // switch per determinare il seme
  39.         switch(seme){
  40.             case 0:
  41.                 nome_seme = "cuori";
  42.                 break;
  43.             case 1:
  44.                 nome_seme = "quadri";
  45.                 break;
  46.             case 2:
  47.                 nome_seme = "fiori";
  48.                 break;
  49.             case 3:
  50.                 nome_seme = "picche";
  51.                 break;
  52.             default:
  53.                 nome_seme = "seme non definito";
  54.         }
  55.  
  56.         // valore della carta
  57.  
  58.         string nome_valore; // dichiarazione della variabile nome_valore
  59.  
  60.         switch(valore){
  61.             case 1:
  62.                 nome_valore = "Asso";
  63.                 break;
  64.             case 11:
  65.                 nome_valore = "Fante";
  66.                 break;
  67.             case 12:
  68.                 nome_valore = "Donna";
  69.                 break;
  70.             case 13:
  71.                 nome_valore = "Re";
  72.                 break;
  73.             default:
  74.                 char buffer[33];
  75.                 itoa(valore, buffer, 10);
  76.                 nome_valore = buffer;
  77.         }
  78.  
  79.         // costruiamo ora per intero il nome della carta
  80.         string nome_carta = nome_valore + " di " + nome_seme;
  81.         return nome_carta;
  82.     }
  83.  
  84. // Attributi della classe, seme e valore
  85.     int valore;
  86.     int seme;
  87. };
  88.  
  89. // swap in inglese significa scambia
  90. // qui introduciamo il concetto di referenza
  91. // la nostra funzione deve prendere un mazzo e scambiarne le carte.
  92. // swap prende come argomenti un mazzo, un intero chiamato indice 1
  93. // e uno chiamato indice 2, all'interno della funzione la carta nell
  94. // indice i1 passerà all'indice i2 e i2 a i1
  95. // come ben ricordi il mazzo è un vettore di carte. Il mazzo viene preso come
  96. // referenza. Cioè si vede l'ampersand dopo la dichiarazione del tipo
  97. // quel simbolo significa che la funzione cambierà la variabile passata
  98. // faremo altri esempi in merito, per ora ricorda potremmo scrivere 2 tipi di
  99. // funzioni
  100. // uno che restituisce un nuovo mazzo
  101. // vector<Carta> swap(vector<Carta> mazzo, int i1, int i2)
  102. // e l'altro che cambia il mazzo in place (sul posto)
  103. // void swap(vector<Carta>& mazzo, int i1, int i2)
  104. // queste sono preferenze di design, che vedrai in futuro
  105. void swap(vector<Carta>& mazzo, int i1, int i2){
  106.  
  107.     // salva la carta iniziale in una variabile temporanea
  108.     Carta tmp_carta = mazzo[i1];
  109.  
  110.     // sovrascrivi il valore contenuto nel mazzo i2 su i1
  111.     mazzo[i1] = mazzo[i2];
  112.  
  113.     // rimpiazza il valore contenuto in i2 con la carta temporanea
  114.     mazzo[i2] = tmp_carta;
  115. }
  116.  
  117.  
  118. // funzione che mescola
  119. // prendiamo come argomento il mazzo e sostituiremo le carte nel mazzo in modo
  120. // procedurale.
  121. void mescola(vector<Carta>& mazzo){
  122.     cout << "mescolo mazzo..." << endl;
  123.  
  124.     // definiamo quante volte vogliamo spostar le carte, più è lugna più tempo ci vorrà
  125.     // a mescolare il mazzo, più è corto meno il mazzo sarà mescolato
  126.     int n_carte_mescolate = 100;
  127.  
  128.  
  129.  
  130.     for(int i = 0; i < n_carte_mescolate; ++i){
  131.         // useremo la funzione rand() per generare dei numeri casuali
  132.         // rand() genera numeri da 0 a RAND_MAX (che è dipendente da compilatori)
  133.         // ora avremo un numero da 0 a 2147483647 però vogliamo che questo numero
  134.         // sia da 0 il primo indice del vettore mazzo, fino a 51, ultimo indice
  135.         // dunque useremo l'operatore modulo (%)
  136.         int indice_casuale = rand() % 52;
  137.  
  138.         // stamperemo così i valori su una riga (nota l'assenza dell endl)
  139.         //cout << indice_casuale << ", ";
  140.  
  141.         // Il mazzo ha 52 carte, i arrivera fino a 100
  142.         // se i diventerà maggiore di 51, allora mazzo[i] darà un errrore
  143.         // dato che non troverà l'elemento
  144.         // dunque limitiamo i con lo stesso trucco per il numero casuale
  145.         int indice_iniziale = i % 52;
  146.  
  147.         //faremo la sostituzione
  148.         swap(mazzo, indice_iniziale, indice_casuale);
  149.  
  150.  
  151.     }
  152.     cout << endl;
  153. }
  154.  
  155.  
  156. // somma i valori contenti in un mazzo di carte:
  157. // questa volta non modificheremo il mazzo, ma lo useremo in modalità lettura
  158. // dunque si dice che la variabile mazzo resterà costante all interno della
  159. // funzione
  160. int somma(const vector<Carta>& mazzo){
  161.     // useremo un ciclo for per sommare i valori
  162.     int s = 0;
  163.  
  164.     for(unsigned int i = 0; i < mazzo.size(); ++i){
  165.         s += mazzo[i].valore;
  166.     }
  167.     return s;
  168. }
  169.  
  170. // Lezione 7 - Le sequenze
  171. int main()
  172. {
  173.     /*---------------------
  174.     Introduzione
  175.     ---------------------*/
  176.     // il prossimo passo sono delle strutture dati che sono una sequenza.
  177.     // molte cose sono una sequenza più o meno ordinata.
  178.     // tipo il mazzo, è una sequenza di carte
  179.  
  180.     // in C++ il container standard per contenere delle sequenze è il
  181.     // vector. Ci sono altre strutture dati per sequenze di oggetti,
  182.     // ognuna ha le sue proprietà, ci sono linked lists, ci sono stacks
  183.     // ci sono maps, deque, ecc...
  184.     // per ora impareremo a usare il vector.
  185.  
  186.     // creiamo un vettore chiamato carta fatto di una sequenza di classi Carta
  187.     //      tipo    nome
  188.     vector <Carta> carte;
  189.  
  190.     // ora aggiungiamo al vettore delle carte, 3 carte
  191.     carte.push_back(Carta(Asso, cuori));
  192.     carte.push_back(Carta(2, cuori));
  193.     carte.push_back(Carta(3, cuori));
  194.  
  195.     // il nostro vettore carte ha ora un Asso di cuori, un 2 di cuori e un 3
  196.     // di cuori.
  197.  
  198.     // stampa il primo elemento del vector carte
  199.     cout << "Le tre carte nel vettore carta" << endl;
  200.     cout << carte[0].stampa_carta() << endl;
  201.     cout << carte[1].stampa_carta() << endl;
  202.     cout << carte[2].stampa_carta() << endl;
  203.  
  204.     cout << endl;
  205.     cout << "Creazione mazzo" << endl;
  206.  
  207.     // ora creeremo il mazzo!
  208.     vector <Carta> mazzo;
  209.     // per le sequenze in genere si preferisce usare un ciclo FOR al posto di un
  210.     // WHILE, perchè in genere si conosce il numero di cicli effettuato.
  211.     // il ciclo for racchiude nella sua forma 3 frasi
  212.     // FOR(condizione_iniziale; condizione_termine; incremento)
  213.  
  214.     // in genere per i vettori si tende ad utilizzare un indice, base 0 come
  215.     // mostrato sopra
  216.  
  217.     // facciamo il ciclo per i 13 indici delle carte
  218.     for(int i = 0; i < 13;  ++i){
  219.         // introduciamo il ciclo per i semi
  220.         for(int j = 0; j < 4;  ++j){
  221.             // per aggiungere una carta al vettore mazzo possiamo usare come
  222.             // sopra un indice
  223.             // mazzo[i*4 + j] = carta
  224.             // oppure possiamo semplicemente usare una funzione che dice
  225.             // aggiungi l'elemento in fondo alla sequenza
  226.             Carta carta = Carta(i + 1, j);
  227.             mazzo.push_back(carta);
  228.  
  229.             cout << "Aggiunta la carta: " << carta.stampa_carta() << " al mazzo" << endl;
  230.             cout << "nella posizione [" << i*4 + j << "]" << endl;
  231.         }
  232.     }
  233.  
  234.     // Ora abbiamo creato la nostra sequenza di carte!
  235.     // possiamo accedere alla lunghezza del mazzo
  236.     cout << "Il mazzo ha: " << mazzo.size() << " carte" << endl;
  237.  
  238.     // ora se vogliamo la 31esima carta nella sequenza ci basterà accedere per
  239.     // il suo indice
  240.     cout << mazzo[31].stampa_carta() << endl;
  241.  
  242.     /*---------------------
  243.     Mescolare il mazzo
  244.     ---------------------*/
  245.     // possiamo costrurire un piccolo black jack
  246.  
  247.     // prima di tutto mescoliamo il mazzo
  248.     // per mescolare il mazzo generiamo una sequenza di numeri
  249.     // che andranno a sostituire le carte nella sequenza
  250.  
  251.     // stampiamo le prime 5 carte
  252.     cout << "Prima di mescolare" << endl;
  253.     for(int i = 0; i < 5; ++i){
  254.         cout << mazzo[i].stampa_carta() << endl;
  255.     }
  256.  
  257.     // il principio di base è
  258.     int random_index = 4; // assegniamo un valore random
  259.     int initial_index = 0; // assegniamo un altro valore, chiamato valore iniziale
  260.  
  261.     // copiamo una carta dalla posizione iniziale dal mazzo
  262.     // e la salviamo in istanza temporanea
  263.     Carta tmp_carta = mazzo[initial_index];
  264.     // ora assegnamo (sovrascriviamo) alla posizione iniziale del mazzo la carta random
  265.     mazzo[initial_index] = mazzo[random_index];
  266.     // rimettiamo la carta iniziale dove stava il random index
  267.     mazzo[random_index] = tmp_carta;
  268.     // se non dovessimo avere la carta temporanea sovrascriveremmo la posizione
  269.     // del mazzo e non sapremmo più quale carta venne sovrascritta
  270.  
  271.     // possiamo ora creare una funzione di swap basata sugli indici
  272.     cout << "Dopo il mescolamento" << endl;
  273.     for(int i = 0; i < 5; ++i){
  274.         cout << mazzo[i].stampa_carta() << endl;
  275.     }
  276.  
  277.     // funzione di swap
  278.     // al posto di scrivere le 3 istruzioni, ora scriveremo una funzione
  279.     // che fa quello
  280.     swap(mazzo, 4, 0);
  281.  
  282.     //creeremo ora una funzione che mescola il mazzo
  283.  
  284.     // funzione di mescolamento
  285.     mescola(mazzo);
  286.  
  287.     for(unsigned int i = 0; i < mazzo.size(); ++i){
  288.         cout << mazzo[i].stampa_carta() << endl;
  289.     }
  290.  
  291.     cout << endl;
  292.  
  293.     /*---------------------
  294.     Semplice Black Jack
  295.     ---------------------*/
  296.     // Black jack
  297.     cout << "------------------" << endl;
  298.     cout << "Game of Black Jack" << endl;
  299.     cout << "------------------" << endl;
  300.  
  301.     // mescoliamo il mazzo rispetto a prima
  302.     mescola(mazzo);
  303.  
  304.     cout << endl;
  305.  
  306.     // definiamo le variabili che ci servono per il gioco
  307.     int carte_giocate = 0; // numero di carte giocate
  308.     string answer;
  309.  
  310.     // il gioco avviene con l'utente che pesca una carta ogni volta una carta
  311.     // se la somma dei valori delle carte supera 21 allora il giocatore perde
  312.     // se il giocatore si ferma prima di 21
  313.     //    se la prossima carta da un valore maggiore di 21 alla sequenza allora
  314.     //    il giocatore vince
  315.     //    se la prossima carta darà un valore minore di 21 il giocatore perde
  316.  
  317.     vector<Carta> carte_giocatore;
  318.     while (answer != "fine"){
  319.  
  320.         // turno
  321.         cout << "Turno " << carte_giocate << endl;
  322.  
  323.         // prendiamo la prima carta nel mazzo
  324.         Carta carta_pescata = mazzo[carte_giocate];
  325.  
  326.         // Diamo la carta in mano al giocatore
  327.         carte_giocatore.push_back(carta_pescata);
  328.  
  329.         // stampiamo le carte nella mano
  330.         cout << "Hai pescato:" << endl;
  331.         cout << endl;
  332.         for(unsigned int i = 0; i < carte_giocatore.size(); ++i){
  333.             string spacer = "";
  334.             for(unsigned int j = 0; j < i; ++j){
  335.                 spacer += " ";
  336.             }
  337.             cout << spacer << carte_giocatore[i].stampa_carta() << endl;
  338.         }
  339.         cout << endl;
  340.  
  341.         // chiediamo al giocatore se vuole una carta
  342.         cout << "Prossima carta?" << endl;
  343.         cin >> answer;
  344.  
  345.         if (answer == "yes"){
  346.             carte_giocate += 1;
  347.         }
  348.         else if(answer != "fine"){
  349.             carte_giocate += 1;
  350.  
  351.             // peschiamo la prossima carta e vediamo se ha vinto
  352.             Carta prossima_carta = mazzo[carte_giocate];
  353.  
  354.             cout << "La prossima carta è un" << endl;
  355.             cout << prossima_carta.stampa_carta() << endl;
  356.  
  357.             // sommiamo i valori delle carte con una funzione apposta
  358.             int somma_carte_giocatore = somma(carte_giocatore);
  359.             int somma_totale = somma_carte_giocatore + prossima_carta.valore;
  360.  
  361.             cout << "Le tue carte sommano " << somma_totale << endl;
  362.             // qui inseriamo le condizioni di vittoria
  363.             cout << endl;
  364.  
  365.             if (somma_carte_giocatore <= 21 && somma_totale >= 21){
  366.                 cout << "HAI VINTO!!" << endl;
  367.             }
  368.             else {
  369.                 cout << "HAI PERSO!!" << endl;
  370.             }
  371.  
  372.             // resettiamo i valori inziali
  373.             carte_giocatore.clear(); // svuota il vettore
  374.             mescola(mazzo);
  375.  
  376.             carte_giocate = 0;
  377.  
  378.  
  379.         }
  380.  
  381.         cout << endl;
  382.     }
  383.  
  384.     return 0;
  385. }
  386.  
  387.  
  388.  
  389.  
  390.  
  391. /* OUTPUT
  392. Valore della mia_carta: 1 Seme della mia_carta: 0
  393. La mia_carta: Asso di cuori
  394. ------Il mazzo------
  395. Asso di cuori
  396. 2 di cuori
  397. 3 di cuori
  398. 4 di cuori
  399. 5 di cuori
  400. 6 di cuori
  401. 7 di cuori
  402. 8 di cuori
  403. 9 di cuori
  404. 10 di cuori
  405. Fante di cuori
  406. Donna di cuori
  407. Re di cuori
  408. Asso di quadri
  409. 2 di quadri
  410. 3 di quadri
  411. 4 di quadri
  412. 5 di quadri
  413. 6 di quadri
  414. 7 di quadri
  415. 8 di quadri
  416. 9 di quadri
  417. 10 di quadri
  418. Fante di quadri
  419. Donna di quadri
  420. Re di quadri
  421. Asso di fiori
  422. 2 di fiori
  423. 3 di fiori
  424. 4 di fiori
  425. 5 di fiori
  426. 6 di fiori
  427. 7 di fiori
  428. 8 di fiori
  429. 9 di fiori
  430. 10 di fiori
  431. Fante di fiori
  432. Donna di fiori
  433. Re di fiori
  434. Asso di picche
  435. 2 di picche
  436. 3 di picche
  437. 4 di picche
  438. 5 di picche
  439. 6 di picche
  440. 7 di picche
  441. 8 di picche
  442. 9 di picche
  443. 10 di picche
  444. Fante di picche
  445. Donna di picche
  446. Re di picche
  447. */
Advertisement
Add Comment
Please, Sign In to add comment