OpenAlchemist !

You are not logged in.

Announcement

Registrations are currently closed, because of too much spam. We are looking for a solution.

#1 2010-11-28 00:10:51

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Probabilités d'apparation des éléments

Salut la compagnie,

Tout d'abord, merci pour le temps que vous avez investi dans ce clone de Naturalchimie (v2). Ça me permet de pouvoir m'entrainer sans que mon salaire entier ne finisse dans les poches de la Motion-Twin wink.

J'ai cru constater que les probabilités d'apparition des éléments (parmi la paire à poser dans le chaudron) n'était pas les mêmes entre Naturalchimie (NA) et OpenAlchemist (OA).
Dans NA, la probabilité d'avoir un élément faible est plus élevée que celle d'avoir un élément fort, alors que dans OA il semblerait que l'on ait autant de chance d'avoir une potion verte qu'un couivre (l'élément précédant l'or).

Outre le fait que ce comportement ne colle pas exactement à celui de NA (ce qui n'est pas un problème pour ceux qui n'y jouent pas, donc il ne s'agit que d'un demi-argument), on se retrouve avec une arrivée d'éléments beaucoup plus variés, ce qui fait qu'il est impossible de les organiser proprement et d'arriver à un score valable.
Au final, l'aspect stratégique s'en voit très effacé au profit du facteur chance, ce que je trouve quelque peu dommage.

Si vous êtes d'accord (et si mes impressions sont correctes), je vous propose un rééquilibrage des probabilités d'apparition des éléments.

Un joueur plutôt doué a mis à disposition un screencast d'une de ses parties. Il pourrait être intéressant de compter les éléments apparus, la partie en question étant assez longue (la loi des grands nombres pourra donc s'appliquer) et la pépite étant construite assez tôt (les probabilités étant vraisemblablement différentes selon l'élément le plus fort présent dans la partie).
Si vous le souhaitez, je pourrai me charger de cette tâche fastidieuse.

Qu'en pensez-vous ?

Offline

 

#2 2010-11-29 18:21:24

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Re: Probabilités d'apparation des éléments

Je me suis occupé des mesures.
Voici mes résultats pour 1190 relevés (de l'élément le plus faible au plus fort) :
1. 207 (17.4%)
2. 192 (16.1%)
3. 185 (15.5%)
4. 206 (17.4%)
5. 125 (10.5%)
6. 90 (7.6%)
7. 73 (6.1%)
8. 41 (3.4%)
9. 50 (4.2%)
10. 15 (1.3%)
11. 6 (0.5%)

À part les pics pour les éléments 4 et (à moindre mesure) 9, on a une belle fonction linéaire.

J'ai remplacé le contenu de Player::_get_next_piece() (que j'ai bougé dans le .cpp par la même occasion) par ça :

Code:

int Player::_get_next_piece()
{
    //applied function: f(x) = a * x + b
    //a = (m - 0.175) / 5
    //b = 0.175
    //m (mean) = 1 / 11
    static const double cumulated_probabilities[10] =
    {
        0.175,
        0.33318181818, //+0.15818181818
        0.47454545454, //+0.14136363636
        0.59909090909, //+0.12454545455
        0.70681818182, //+0.10772727273
        0.79772727273, //+0.9090909091
        0.87181818182, //+0.7409090909
        0.92909090909, //+0.5727272727
        0.96954545454, //+0.4045454545
        0.99318181818  //+0.2363636364
                       //+0.0681818182 = 1
    };

    unsigned int r;
    const unsigned int max = static_cast<unsigned int>(cumulated_probabilities[_board.unlocked_pieces - 1] * RAND_MAX);
    do
    {
        r = rand();
    } while(r > max);

    for(unsigned int i = 0; i < 10; ++i)
    {
        if(r <= cumulated_probabilities[i] * RAND_MAX)
        {
            return i;
        }
    }
    return 10;
}

… et roule ma poule !
C'est beaucoup mieux comme ça, je trouve.

Petite remarque au passage, dans /trunk/README :
« You may have to edit the /etc/ld.so.conf and add to it "/etc/local/lib". Then run "ldconfig" as root. »
Il faut ajouter « /usr/local/lib » et non « /etc/local/lib ».

Je reste dispo pour discuter de ça si vous le souhaitez.

Last edited by monsieur moche (2010-12-01 11:41:22)

Offline

 

#3 2010-12-03 08:01:11

tragerlix
New member
Registered: 2010-01-05
Posts: 9

Re: Probabilités d'apparation des éléments

Salut , monsieur moche , ton calcul de fou est trop compliqué pour moi ,par contre moi je sais ce qui se passe quand on arrive à superposer 3 (t...s .. ...t ) càd le dernier élément,l'une sur l'autre et que celà procure une immense satisfaction lorsqu'on a atteind ce stade comme moi !!      Bon jeu à toi et vivement la version 0.4 (il y aura de la musique ) a +
               Lix 3ème du nom .

Offline

 

#4 2010-12-03 09:18:31

Keph
Developer / Moderator
From: Paris
Registered: 2008-07-18
Posts: 79
Website

Re: Probabilités d'apparation des éléments

Merci pour ton intérêt, Monsieur Moche (c'est étrange à écrire, ce nom).

Je ne sais pas trop quoi te répondre, je suis absolument nul à ce jeu. Je n'ai JAMAIS obtenu le dernier élément autrement qu'en trichant. Je ne mesure pas bien le changement sur le gameplay, et si les joueurs actuels aimeront ta proposition.

Je vais essayer ton code ce weekend sans doute.

Merci, en tout cas.

Guillaume.

Offline

 

#5 2010-12-03 12:03:03

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Re: Probabilités d'apparation des éléments

Moi non plus je ne suis pas spécialement doué, mais j'ai essayé de regarder des vidéos de bons joueurs pour essayer d'adopter leur stratégie.
Par exemple, sur la longue vidéo que j'ai utilisé pour les mesures, le talent du mec vient de sa capacité à placer les petits éléments pour effectuer des combos et arriver à des éléments plus gros tout en faisant le ménage.
C'est en tentant d'appliquer cette stratégie que j'ai remarqué qu'il y avait un problème dans OA : on se retrouve assez souvent avec des gros éléments (parfois même en couple avec des petits), ce qui est totalement ingérable.
Les mesures que j'ai effectuées ont confirmé mon impression : dans le jeu original, la fréquence d'apparition des petits éléments est bien plus élevée. Bref, j'ai expliqué tout ça dans mon premier message wink.

Je n'ai JAMAIS obtenu le dernier élément autrement qu'en trichant.

En espérant ne pas paraitre présomptueux (d'ailleurs je n'ai pas de quoi l'être, vu que je n'ai pu faire apparaitre la pépite qu'une seule fois par gros coup de bol) : ça explique bien pourquoi tu ne vois pas (encore) l'intérêt de ce changement.
Tout comme toi probablement, ma « stratégie » était basée sur l'opportunisme (la chance, quoi) : je réservais une colonne pour empiler les gros éléments en espérant que les bons éléments viendront dans l'ordre qu'il faut et suffisamment rapidement (avant que les cinq autres colonnes ne se remplissent). Ça explique pourquoi le mode triche ALchimique (big_smile) te permet d'appliquer ta stratégie avec plus de réussite.

Voici une partie du même joueur (je ne retrouve pas le lien de la partie que j'ai utilisée pour les mesures… 1 million de points, le mec, quand même !), ce sera sûrement plus parlant : http://www.dailymotion.com/video/xdum03 … videogames
Tu remarqueras qu'il n'hésite pas à recouvrir sa première colonne avec des éléments plus faibles et qu'il a un certain talent pour préparer ses combos et calculer ses coups à l'avance.
J'ai pu lire sur les forums de NA que les bons joueurs étaient unanimes sur ce fait : ils prennent vraiment leur temps pour jouer (la vidéo est accélérée). Il s'agit d'un jeu de réflexion avant tout. C'est pour cela que je suis convaincu qu'un rééquilibrage des probabilités est très important pour le gameplay.

Mon bout de code est certainement perfectible, n'hésite pas à le retravailler si besoin (en particulier la boucle do-while un peu sauvage).

Merci, en tout cas.

Merci à toi wink.

Last edited by monsieur moche (2010-12-03 18:26:34)

Offline

 

#6 2010-12-04 08:55:19

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Re: Probabilités d'apparation des éléments

Voici une simplification + correction du code :

Code:

int Player::_get_next_piece()
{
    //applied function: f(x) = a * x + b
    //a = (m - 0.175) / 5
    //b = 0.175
    //m (mean) = 1 / 11
    static const double cumulated_probabilities[12] =
    {
        /* 0*/ 0.175,
        /* 1*/ 0.33318181818, //+0.15818181818
        /* 2*/ 0.47454545454, //+0.14136363636
        /* 3*/ 0.59909090909, //+0.12454545455
        /* 4*/ 0.70681818182, //+0.10772727273
        /* 5*/ 0.79772727273, //+0.9090909091
        /* 6*/ 0.87181818182, //+0.7409090909
        /* 7*/ 0.92909090909, //+0.5727272727
        /* 8*/ 0.96954545454, //+0.4045454545
        /* 9*/ 0.99318181818, //+0.2363636364
        /*10*/ 1,             //+0.0681818182
        /*11*/ 1              //+0
    };

    assert(_board.unlocked_pieces <= 11);
    const unsigned int random = rand() * cumulated_probabilities[_board.unlocked_pieces];

    for(unsigned int i = 0; i < 10; ++i)
    {
        if(random <= cumulated_probabilities[i] * RAND_MAX)
        {
            return i;
        }
    }
    return 10;
}

Par contre il y a un problème avec la variable _board.unlocked_pieces.

C'est confus. Selon la situation, elle peut désigner :
1. soit le nombre d'éléments débloqués ;
2. soit l'index du plus haut élément débloqué (0 pour la potion verte, 1 pour la potion jaune, etc.).

Au début de la partie, les potions vertes, jaunes et oranges sont débloquées. La variable vaut alors 3 (donc cas n° 1).
Ensuite, lorsque l'on débloque la potion violette, la variable reste à 3 (on passe alors au cas n° 2). Ensuite, on débloque la feuille et la variable s'incrémente correctement à 4, ainsi de suite jusqu'à la pépite où la variable vaut 11.
Par contre, dès qu'on active le mode triche, la variable passe à 12 (et on repasse alors au cas n° 1).

Dans le code ci-dessus, j'ai considéré que la variable désignait l'index du plus haut élément débloqué (donc cas n° 2), vu qu'au cours de la partie c'est comme ça qu'il faut l'interpréter la plupart du temps.
Mais il faudra clarifier ça…
L'incidence (mineure, mais déroutante tout de même), c'est qu'on peut se retrouver avec une potion violette dès le début de la partie (alors que l'élément n'est pas censé être débloqué). J'ai également placé une assertion de façon à éviter un dépassement d'index du tableau des probas. Du coup, dès qu'on active le mode triche, ça plante.
Je te laisse corriger ça.

EDIT : Autre chose sans rapport : lorsque l'on arrive à combiner une pépite, celle-ci disparait immédiatement après être apparue (il me semble que c'est une régression par rapport à la 0.3).

@tragerlix
En réalité les calculs ne sont pas si compliqués. C'est juste que je les ai bien mal expliqués wink.

Last edited by monsieur moche (2010-12-04 09:13:13)

Offline

 

#7 2010-12-06 19:12:27

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Re: Probabilités d'apparation des éléments

Mouais bon, j'ai fait quelques essais et c'est toujours pas ça, pour les probas.
Je fais de bien meilleurs scores sur NA.

Les probas sont certainement bonnes pour le cas où la première pépite est apparue, mais pour le début il y a des ajustements à faire.

Offline

 

#8 2010-12-09 18:46:10

monsieur moche
New member
Registered: 2010-11-27
Posts: 6

Re: Probabilités d'apparation des éléments

Rebonjour,

Je suis tombé par hasard sur l'un des forums de NA sur un topic parlant de la fréquence d'apparition des éléments.
Quelqu'un a fait une mesure similaire à la mienne sur une partie différente :

Suite aux interrogations de certains voici les stats de fréquence d'apparition des éléments de NA2.

Les éléments sont pris en compte à partir du moment où la mercurule a été crée.
La partie s'est déroulée à la Ziggourat (qui se dilate) d'Or, pas de mission en cours. Certaines fois, quelques Katz apparaissaient, ceux-ci n'ont pas été pris en compte. Je ne pense pas que ça faussera les stats.

Au total, 1430 éléments ont été compté soit :
-potions vertes : 240 = 16,8%
-potions jaunes : 236 = 16,5%
-potions oranges : 211 = 14,8%
-potions violettes : 249 = 17,4%
-feuilles menthol : 147 = 10,3%
-foleil : 101 = 7,1%
-cranos : 102 = 7,1%
-flaum : 50 = 3,5%
-1er éléments : 56 = 3,9%
-2ème éléments : 16 = 1,1%
-3ème éléments : 8 = 0,6%
-bonus/armes : 14 = 1%

Il semble donc que la sur-représentation des éléments 4 et 9 (autrement dit les potions violettes et l'élément suivant le flaum) que j'ai également relevé lors de mes mesures ne soit pas un hasard des statistiques.

J'ai donc repris simplement les probas mesurées pour les inclure dans le code… eh bien figurez-vous que ça change tout !
C'est beaucoup plus jouable… j'ai même réussi à faire apparaitre une pépite (et confirmant au passage le bug de la disparition évoqué dans mon message précédent).

Revoici le tableau corrigé :

Code:

    static const double cumulated_probabilities[12] =
    {
        /* 0*/ 0.168,
        /* 1*/ 0.324,
        /* 2*/ 0.472,
        /* 3*/ 0.646,
        /* 4*/ 0.749,
        /* 5*/ 0.82,
        /* 6*/ 0.891,
        /* 7*/ 0.926,
        /* 8*/ 0.965,
        /* 9*/ 0.976,
        /*10*/ 1,
        /*11*/ 1
    };

Il reste encore le bug de _board.unlocked_pieces à corriger.

Offline

 

Board footer

Powered by FluxBB