[c#]Calcolo probabilita vincita poker

di Anonimizzato11509 il
14 risposte
Volevo sapere come posso calcolare le poprabilita di vincita di una mano da parte di un giocatore conoscendo le due carte in mano ai due giocatori e le carti sul bord come posso fare

14 Risposte

  • Questo è il codice che utilizzo per calcolare tutte le mani che mi fanno vincere
    #region CreoMazzo
    
                Carte[] escludo = new Carte[carte.Length + avversario.Length];
                for (int i = 0; i < escludo.Length; i++)
                {
                    if (i < carte.Length)
                        escludo[i] = carte[i];
                    else
                        escludo[i] = avversario[i - carte.Length];
                }
                Carte[] mazzo = creaMazzo(escludo);
                #endregion
    
                #region Carico
                Carte[] tmp = new Carte[7];
                tmp[0] = carte[0];
                tmp[1] = carte[1];
                Carte[] tmp1 = new Carte[7];
                tmp1[0] = avversario[0];
                tmp1[1] = avversario[1];
                #endregion
                int maniVincenti = 0;
    
                for (int i = 0; i < mazzo.Length; i++)
                {
                    tmp[2] = mazzo[i];
                    tmp1[2] = mazzo[i];
    
                    for (int a = 1; a < mazzo.Length; a++)
                    {
                        tmp[3] = mazzo[a];
                        tmp1[3] = mazzo[a];
    
                        for (int b = 2; b < mazzo.Length; b++)
                        {
                            tmp[4] = mazzo[b];
                            tmp1[4] = mazzo[b];
    
                            for (int c = 3; c < mazzo.Length; c++)
                            {
                                tmp[5] = mazzo[c];
                                tmp1[5] = mazzo[c];
    
                                for (int d = 4; d < mazzo.Length; d++)
                                {
                                    tmp[6] = mazzo[d];
                                    tmp1[6] = mazzo[d];
    
                                    Punti p = calcolaPunto(tmp);
                                    Punti p1 = calcolaPunto(tmp1);
                                    int v = Confronta(p, p1);
                                    if (v == 2 || v == 0)
                                        maniVincenti++;
                                }
                            }
                        }
                    }
                }
    
                return maniVincenti;
            }
    pero è lentissimo perche analizza piu di 200 milioni di mani invece un software che ho visto su internet ne analizzava solo un milione dov'è l'errore
  • 200 milioni di mani ? E perché mai ?

    Se ho capito bene i giocatori hanno solamente due carte e sul board ci saranno in totale 5 carte ... no? Come mai 200 milioni di mani?
  • Perche non mi esclude le mani simili cioè
    12345 e 21345 che sono mani simili le conta entrambe ecco il problema come posso correggere quell'errore
  • Continuo a non capire ... fai un esempio concreto

    1 giocatore : A di cuori + K di picche
    2 giocatore : Q di cuori + 8 di quadri

    Board ...

    Quali problemi hai nel calcolo?
  • Scusami non riesco a spiegarmi allora io devo calcolare tutte le combinazioni di carte che possono apparire sul bord ad esempio
    AssoCuori KappaCuori 10Picche JeckFiori DueFiori
    questa è una combinazione quest'altra combinazione che quel codice mi calcola
    KappaCuori AssoCuori 10Picche JeckFiori DueFiori

    come vedi è uguale io voglio evitarle
  • E quindi devi usare le Combinazioni ... tu come hai calcolato il 200 milioni di mani ... ?
  • Si come posso corregere quel algoritmo cosi da evitare le combinazioni simili
  • Ripeto la domanda ... l'ultima volta ... come hai calcolato il 200 milioni?
  • Nel codice che ho postato avevo aggiunto una variabile che si incrementava all interno del ultimo ciclo alla fine di tutti i cicli me la ritornava e ho potuto vedere che questa ammontava a piu di 200 milioni
  • No ... devi usare le combinazioni senza ripetizioni ... nel tuo caso saranno

    52 carte nel mazzo - 4 dei giocatori = 48
    carte da estrarre = 5

    C(48,5) = n! / (k! (n - k)!) = 48! / (5! (48 - 5)!) = 1712304 (poco meno di 2 milioni)
  • Forse le chiedo troppo potreppe aiutarmi a creare un ciclo che mi fa gestire tutte quelle combinazioni perche io devo analizzare combinazione per combinazione e non ho idea di come gestire il ciclo
  • Grazie tantissimo ma ho un problema mentre cerco di convertire online il codice mi da un errore purtroppo non capisco una mazza di Vb e non so come convertirlo
  • Sono riuscito a trovare del codice e a riadattarlo
    questo calcola gli indicatori
    
    public static ArrayList calcolaIndici(ArrayList linearSet, int k)
            {
                if (linearSet == null || k > linearSet.Count || k < 0)
                    throw new ArgumentException();
                ArrayList toReturn = new ArrayList();
                if (k == 0) return toReturn;
                int[] indexes = new int[k];
                indexes[0] = 0;
                int i = 0;
                while (i >= 0)
                {
                    while (i++ < indexes.Length - 1)
                        indexes[i] = indexes[i - 1] + 1;
                    ArrayList toAdd = new ArrayList();
                    for (i = 0; i < k; i++)
                        toAdd.Add(indexes[i]);
                    toReturn.Add(toAdd);
                    i = indexes.Length - 1;
                    while (i >= 0 && ++indexes[i] == linearSet.Count - (indexes.Length - i - 1))
                        i--;
                }
                return toReturn;
            }
    
    una volta aggiunti i controlli per vedere se la mano è vincente o meno il tutto ci inpiega circa 10 secondi mentre i programmi che ho visto ci mettono meno di un secondo penso che per velocizzarlo dovrei usare delle matrici di int purtroppo non sono praticissimo delle matrici in c#
Devi accedere o registrarti per scrivere nel forum
14 risposte