Programma di Blackjack in C++

di il
4 risposte

Programma di Blackjack in C++

Salve.
Mi hanno dato come progetto di scrivere in C++ il gioco "Blackjack", ho grandi difficoltà nel compilarlo se potete darmi una mano.
Le richieste sono:
* All'avvio del programma dev'essere visualizzato un menu che permetta di cominciare una nuova
partita, o di caricarne da file una già iniziata in precedenza;
* Se si sceglie una nuova partita verrà chiesto di inserire:
* il nome del giocatore gestito dall'utente, e il suo patrimonio iniziale;
* il numero di giocatori gestiti dal computer e i loro dati (nome e patrimonio iniziale);
* uno dei giocatori gestiti dal computer dovrà svolgere il ruolo di mazziere (patrimonio non
significativo);
* Ad ogni mano:
* ciascun giocatore effettua la sua puntata (inferiore al suo patrimonio attuale);
* il mazziere distribuisce una carta del mazzo ad ogni giocatore, compreso se stesso, in senso
orario;
* il mazziere distribuisce una seconda carta del mazzo ad ogni giocatore, escluso se stesso, in
senso orario;
* dopodichè ciascun giocatore (procedendo in senso orario) manifesta il suo gioco. L'ultimo a
giocare è il mazziere.
* per ciascun giocatore (escluso il mazziere) si possono verificare le seguenti situazioni:
• Il giocatore fa 21 con le prime due carte assegnategli dal mazziere, cioè riceve un Asso
(11) e un dieci o una figura. In tal caso si dice che egli forma il black jack e ha diritto al
pagamento di 3 a 2 (una volta e mezzo la posta, cioè, la somma scommessa x 1,5); se
però il mazziere realizza anche lui il black jack la mano è considerata alla pari.
• Il giocatore ottiene un punteggio poco soddisfacente con le prime 2 carte. Allora egli
può chiedere (mossa "HIT") carte aggiuntive fino a raggiungere un punteggio
soddisfacente (mossa "STAND" per fermarsi). Se però il giocatore supera il 21 risulta
perdente e il mazziere incassa la puntata.
• Il raddoppio della puntata (mossa “DOUBLE DOWN”): i giocatori hanno una
particolare opzione di giocata: se con le prime due carte hanno realizzato da 9 a 15
punti, possono raddoppiare la puntata al momento della chiamata ma impegnandosi a
chiedere una sola carta, e dopo aver ricevuto questa carta il giocatore è obbligato a
fermarsi.
• La divisione (mossa “SPLIT”): se nella prima distribuzione il giocatore riceve due carte
dello stesso valore può effettuare lo split e cioè:
• Separare le due carte e aggiungere un'uguale puntata sulla seconda;
• Proseguire il gioco come se il giocatore avesse due prime carte;
• Aggiungere una carta su ciascuna carta separata.
• Nel caso di due Assi il gioco doppio è consentito ma con diritto a una sola
chiamata.
* il mazziere deve necessariamente seguire la "REGOLA DEL BANCO": egli deve tirare carta
con un punteggio inferiore o uguale a 16. Una volta superato il 16 si deve fermare. Se oltrepassa il 21
il banco "sballa" e deve pagare tutte le puntate rimaste sul tavolo.
* una volta definiti tutti i punteggi, il mazziere confronta il proprio con quello degli altri giocatori,
paga le combinazioni superiori alla sua, ritira quelle inferiori e lascia quelle in parità.
* N.B. ogni scelta del computer (valore della puntata, richiesta di una carta, conclusione del turno,
etc) dovrà essere automatica (casuale oppure secondo una strategia implementata a piacere)
* Al termine della mano:
• verranno eliminati dal gioco tutti i giocatori che hanno esaurito il loro patrimonio;
• verrà chiesto all'utente se inserire nuovi giocatori;
• si chiede se salvare lo stato della partita su file;
• si continua la partita con una nuova mano;
• si sceglie se sospendere o terminare la partita
* Requisiti:
* la singola carta è rappresentata da un'opportuna struttura dati in grado di memorizzare seme,
valore (1, 2, ..., 7, donna, jack, re,mazzo: rosso o blu) e valore nel gioco del black jack (l'effettivo
valore per le carte numeriche e 10 per le figure);
* la lista dei giocatori dev'essere memorizzata come una lista dinamica;
* il mazzo e le carte in mano ai giocatori e al mazziere possono essere memorizzate in un array
o in una lista dinamica (a vostra scelta);
* è importante che una carta data ad un giocatore non possa capitare ad un altro durante la stessa
mano (la carta deve effettivamente "estratta" dal mazzo e "inserita" nelle carte del giocatore);
* lo stato della partita che deve essere salvato su file, comprende la descrizione dei giocatori e
del mazziere con il loro patrimonio e tutte le informazioni necessarie a far riprendere una partita
salvata.
Se riuscite a darmi una mano, se non proprio il programma compilato in questo modo almeno qualcosa che si avvicini per poter capire come andare avanti.
Grazie mille.

4 Risposte

  • Re: Programma di Blackjack in C++

    ho grandi difficoltà nel compilarlo
    significa che hai scritto qualcosa. si può vedere?
  • Re: Programma di Blackjack in C++

    Ho provato a scriverlo sia con i vettori che con le liste però con i vettori è sbagliato.
    Ed è tutto confuso ed incasinato come lo puoi notare. Prima ho voluto realizzare le varie funzioni per facilitarmi però così non faccio nulla.




    char carta[10][8] = {"Asso ","Due ","Tre ","Quattro","Cinque ","Sei ","Sette ",
    "Fante ","Regina ","Re "};

    char seme[4][8] = {"Cuori ","Quadri","Picche","Fiori "};
    char colore [2][6] = {"Rosso","Blu "};
    int mazzo[10][4][2]; // mazzo di carte: 10 righe (carte), 4 colonne (semi) e 2 mazzi
    int c,s,m,g; // indici degli array ('c'=carta, 's'=seme, 'm'=colore)
    int giocatore[10][4][2][3]; // giocatori: 10 carte, 4 semi, 2 mazzi e 4 giocatori

    /*la funzione che mi permette di stampare il menu*/
    void stampa_menu(const char *sPtr){

    for( ; *sPtr != '\0'; sPtr++){ /*non serve inizializzarlo e procede finche non trova il carattere '\0'*/
    printf("%c", *sPtr);
    _sleep(5); //mi permette di stampare un carattere alla volta
    }
    }


    /*----------------------------------------------------------------------------*/
    /*File su cui salvare i dati di gioco*/
    void file_salva(){
    int giocatore[3]={1,2,3};
    int somma[];
    FILE *f_salvataggio;

    f_salvataggio = fopen ("salva_dei_dati_di_gioco", "w+");
    for(int i=0; i<N; i++){
    fprintf(f_salvataggio,"-----Giocatore [%d]\n----Denaro [%d]\n-----\n",giocatore, somma);
    }
    fclose(f_salvataggio);
    }

    /*File da cui leggere i dati del gioco*/
    void file_caricamento(){
    int somma[];
    FILE *f_salvataggio;

    f_salvataggio = fopen ("salvataggio_dei_dati_di_gioco", "r");
    for(int i=0; i<N; i++){
    fscanf(f_salvataggio,"-----Giocatore [%d]\n----Denaro [%d]\n-----\n",giocatore, somma);
    }
    fclose(f_salvataggio);
    }

    /*----------------------------------------------------------------------------*/
    /*Mazzo delle carte con la liste*/
    /*
    void mazzo(){
    typedef enum { Cuori, Quadri, Picche, Fiori} Semi_black;
    typedef enum { Asso, Due, Tre, Quattro, Cinque, Sei, Sette, Otto, Nove, Dieci, Fante, Regina, Re} Figura;
    typedef enum { Rosso, Blu} Colore;
    struct carta {
    int valore;
    Figura figura;
    Semi_black seme;
    // Colore colore;
    };

    typedef struct carta Carta;

    Carta mazzo[52]= { //Arrey del mazzo di gioco
    {1,Asso,Cuori},{2,Due,Cuori},{3,Tre,Cuori},{4,Quattro,Cuori},{5,Cinque,Cuori},{6,Sei,Cuori},{7,Sette,Cuori},
    {8,Otto,Cuori},{9,Nove,Cuori},{10,Dieci,Cuori},{10,Fante,Cuori},{10,Regina,Cuori},{10,Re,Cuori},

    {1,Asso,Quadri},{2,Due,Quadri},{3,Tre,Quadri},{4,Quattro,Quadri},{5,Cinque,Quadri},{6,Sei,Quadri},{7,Sette,Quadri},
    {8,Otto,Quadri},{9,Nove,Quadri},{10,Dieci,Quadri},{10,Fante,Quadri},{10,Regina,Quadri},{10,Re,Quadri},

    {1,Asso,Picche},{2,Due,Picche},{3,Tre,Picche},{4,Quattro,Picche},{5,Cinque,Picche},{6,Sei,Picche},{7,Sette,Picche},
    {8,Otto,Picche},{9,Nove,Picche},{10,Dieci,Picche},{10,Fante,Picche},{10,Regina,Picche},{10,Re,Picche},

    {1,Asso,Fiori},{2,Due,Fiori},{3,Tre,Fiori},{4,Quattro,Fiori},{5,Cinque,Fiori},{6,Sei,Fiori},{7,Sette,Fiori},
    {8,Otto,Fiori},{9,Nove,Fiori},{10,Dieci,Fiori},{10,Fante,Fiori},{10,Regina,Fiori},{10,Re,Fiori},
    };
    }
    */
    /*----------------------------------------------------------------------------*/
    /*Lista dei giocatori*/
    typedef struct giocatore{
    char nome_giocatore;
    int patrimonio;
    int giocatore *ptr;
    }Giocatore;

    /*----------------------------------------------------------------------------*/

    /*I vari punteggi*/
    int punteggi(){
    //se il giocatore fa 21 con due carte
    /* non so come fare per far si che due carte mi possano fare questo!!!
    if( somma==21){
    printf("Perfetto per questo ottiene un premio\n");
    puntata = puntata * 1,5;
    cassa_giocatore = cassa_giocatore + puntata;
    }
    */
    //[2] è il giocatore [1] è la casino'
    if((somma[1]>somma[2] && somma[2]<=21) ||(somma[2]<=21 && somma[1]>21)){

    printf("Hai vinto\n");
    cassa_giocatore = cassa_giocatore + puntata;
    cassa_casino = cassa_casino - puntata;
    if(cassa_casino == 0){
    printf("Hai battuto il casino'\n");
    goto exit;
    }
    }

    if((somma[2]<somma[1] && somma[1]<=21)||(somma[1]<=21 && somma[2]>21)){
    printf("Hai perso\n");
    cassa_giocatore = cassa_giocatore - puntata;
    cassa_casino = cassa_casino + puntata;
    if(cassa_giocatore ==0){
    printf("Il casino' ti ha battuto\n");
    goto exit;
    }
    }
    if(somma[2]==somma[1] || (somma[2]>=21 && somma[1]>=21)){
    printf("Pareggio nessuno vince nulla.\n");
    cassa_giocatore = cassa_giocatore;
    cassa_casino = cassa_casino;
    }

    }
    /*----------------------------------------------------------------------------*/
    /*Nucleo del gioco*/
    /**/
    void inizializza() { // inizializzazione strutture
    for( c = 0; c < 10; c++ ) { // ciclo sulle carte
    for( s = 0; s < 4; s++ ) { // ciclo sui semi
    for(m = 0; m < 2; m++) { // ciclo sul colore mazzo
    mazzo[c][s][m] = 1; // 1 - carta presente
    for( g = 0; g < N_giocatori; g++ ) // ciclo sui giocatori
    giocatore[c][s][m][g] = 0; } // 0 - carta assente
    }
    }
    }
    void distribuisci() { // distribuzione casuale carte
    srand(time(0)); // setta il numero iniziale del generatore numeri casuali

    for(g=0;g<N_giocatori; g++){ // per ognuno dei quattro giocatori
    for ( int i = 0; i < 10; i++ ){ // vengono distribuite dieci carte
    do {
    c = rand() % 10; // numero casuale da 0 a 9 - carta
    s = rand() % 4; // numero casuale da 0 a 3 - seme
    m = rand() % 2; // numero casuale da 0 a 1 - colore mazzo
    }
    while (mazzo[c][s][m] == 0); // se carta non disponibile, ritenta
    mazzo[c][s][m] = 0; // la toglie dal mazzo
    giocatore[c][s][m][g] = 1; // la assegna al giocatore corrente
    }
    }
    }

    void visualizza() { //
    int row;
    for( g = 0; g < N_giocatori; g++ ) { // ciclo sui giocatori
    row = 2;
    printf("Giocatore %d\n", g+1);
    for ( c = 0; c < 10 ; c++) { // ciclo sulle carte
    for ( s = 0; s < 4; s++) { // ciclo sui semi
    for( m = 0; m < 2; m++){
    if (giocatore[c][s][m][g] == 1) {
    row = row + 1;
    printf("%2d%10s%10s%10s\n",row-2, carta[c],seme[s], colore[m]);}
    }
    }
    }
    }
    }---------------------------------------------------------------------*/
  • Re: Programma di Blackjack in C++

    1. Usare i tags code vedi punto 4 del regolamento
    4. Formattare il codice sorgente
    Visto gli argomenti trattati in questo forum vengono spesso inseriti stralci di codice sorgente.
    Per rendere facilmente leggibile tale codice bisogna formattarlo utilizzando il pulsante "Code".
    2. E' C++ oppure C. Perché il discorso cambia di parecchio. In ogni caso ti conviene imparare/usare gli struct
    3. Array di 4 dimensioni raramente ne ho visti
    
    int giocatore[10][4][2][3]; // giocatori: 10 carte, 4 semi, 2 mazzi e 4 giocatori
    
    4. Prima fai la stesura dell'algoritmo e le strutture dati che intendi usare poi puoi svolgere le funzioni. Quindi come inizio direi di discuttere sulla migliore struttura dati da usare.
  • Re: Programma di Blackjack in C++

    In C++ e lo so che devo imparare ad usare le struct ma con il poco tempo che mi hanno dato non sono riuscito a fare nulla e quel poco che ho fatto come hai potuto vedere tu stesso è uno schifo.
    Grazie comunque per avermi risposto mi hai fatto capire che ora sono fregato
Devi accedere o registrarti per scrivere nel forum
4 risposte