Analizzatore del conteggio nel blackjack

di il
4 risposte

Analizzatore del conteggio nel blackjack

Stavo facendo un programma per vedere quanto funzionasse il conteggio delle carte nel blackjack. Per chi non lo sapesse nel conteggio del blackjack si attribuisce un valore ad ogni carta e si fa una somma per arrivare ad un conto. Il funzionamento è semplice, faccio pescare 26 carte del mazzo e poi una carta. Quindi se il conteggio è alto allora mi aspetto una carta con valore negativo e se il conteggio è negativo allora mi aspetto una carta con valore positivo. Il metodo in questione è stato inventato da me e testandolo c'è stato un problema: praticamente il conteggio di -1 e +1 e -2 porta uno strano risultato, allora ho fatto scrivere anche ogni valore di carta e mi sono usciti dei numeri che se sommati non portano il conteggio che porta al computer. Come ultima cosa, ho fatto anche scrivere al computer se la 26esima carta è in linea con il ragionamento di prima, con un si se va bene ed un no se non va bene. Ecco il programma:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>ù

int carta (void);
int uscita = 0;
int mazzo [52] = {2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11};
int conto = 0;
int main (void){
	srand(time(NULL));
	int lanci;
	int prob;
	int b = 0;
	for(lanci = 0; lanci <= 26; lanci++){
	   	if(lanci != 26){
			conto = conto + (carta());
			printf("%d\n", carta());
		}
		else if (lanci == 26){
		    if(conto > 0 && carta() == -1){
			   b ++;
		    }
		    else if(conto < 0 && carta() == 1){
			   b ++;
		    }
	    }
	}
	if (b == 1){
	printf("si, %d", conto);
}
else{
	printf("no, %d", conto);
}
}

int carta(void){
	uscita = 2 + rand() % 10;
	int a;
	for(a = 0; a < 52; a++){
		if(mazzo[a] == uscita){
			if (mazzo[a] < 10){
				mazzo[a] = 0;
			return 1;
		}
		    if (mazzo[a] == 10){
			    mazzo[a] = 0;
			    return -1;
		}
		if (mazzo[a] == 11){
			mazzo[a] = 0;
			return -2;
		}
		}
		else{
			continue;
		}
	}
}

4 Risposte

  • Re: Analizzatore del conteggio nel blackjack

    Ogni volta che chiami la funzione carta(), fai una estrazione, anche se usi la funzione in un if o in una printf.
    Inoltre mi sembra di capire che la funzione carta() abbia un problema quando viene generato un numero (uscita) che corrisponde a tutte carte già estratte, nel qual caso la funzione ritorna un valore indefinito; il compilatore ti dovrebbe segnalare un warning del tipo
    ../BlackJack/main.c: In function ‘carta’:
    ../BlackJack/main.c:65:1: warning: control reaches end of non-void function [-Wreturn-type]
  • Re: Analizzatore del conteggio nel blackjack

    Come ho detto prima c'è un problema nel conteggio, quindi si probabilmente è in carta(). Il funzionamento di carta() è di estrarre una carta casuale dal mazzo e di toglierla di conseguenza dal mazzo dandogli il valore 0 che non può essere uguale alla carta uscita e quindi non può essere fornita nuovamente al conto. Il punto è che non trovo come possano uscire dei valori dalla funzione carta() che non siano +1 -2-1 eppure capitano sempre numeri impossibili come 7, 8, 9, 5 e cose così.
  • Re: Analizzatore del conteggio nel blackjack

    Come ti ha già correttamente suggerito Andrea, che succede se tutte le carte con valore X sono già uscite e la variabile "uscita" prende valore X?
    Supponiamo che tutte le carte con valore "3" siano già uscite. Il tuo array "mazzo" si trova in questo stato:
    
    [2, 2, 2, 2, 0, 0, 0, 0, 4, 4, ... ]
    
    Che succede se, invocando la funzione carta() la variabile "uscita" prende valore "3"? Inizia il ciclo su tutti i valori di mazzo... non trova mai un valore uguale a "3" (perchè sono già tutti usciti e le relative posizioni sono state azzerate). Il ciclo for termina. Non c'è alcun "return". Che valore viene restituito?
  • Re: Analizzatore del conteggio nel blackjack

    Potresti organizzarlo in modo più razionale
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define ESTRAZIONI 26
    
    void shuffle(void);
    
    int mazzo [52] = {2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 
                      7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 
                      10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11};
    
    
    int main (void){
    	srand(time(NULL));
    	
    	int i, somma;
    	
    	shuffle();
    	for(i = somma = 0; i < ESTRAZIONI; i++)
    	    somma += mazzo[i];
    	printf("Valore aspettato: %f - Estrazione: %i\n", (float)(388 - somma)/(52 - ESTRAZIONI), mazzo[ESTRAZIONI]);
    	shuffle();
    	for(i = somma = 0; i < ESTRAZIONI; i++)
    	    somma += mazzo[i];	
    	printf("Valore aspettato: %f - Estrazione: %i\n", (float)(388 - somma)/(52 - ESTRAZIONI), mazzo[ESTRAZIONI]);
    	shuffle();
    	for(i = somma = 0; i < ESTRAZIONI; i++)
    	    somma += mazzo[i];	
    	printf("Valore aspettato: %f - Estrazione: %i\n", (float)(388 - somma)/(52 - ESTRAZIONI), mazzo[ESTRAZIONI]);
    	for(i = somma = 0; i < ESTRAZIONI; i++)
    	    somma += mazzo[i];	
    	printf("Valore aspettato: %f - Estrazione: %i\n", (float)(388 - somma)/(52 - ESTRAZIONI), mazzo[ESTRAZIONI]);	
    
        return 0;	
    }
    			
    void shuffle(void){
        int i, j, k;
        for(i = 51; i; i--){
            j = rand() % (i + 1);
            k = mazzo[j];
            mazzo[j] = mazzo[i];
            mazzo[i] = k;
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
4 risposte