Passer au forum
Développement Logic...
 
Notifications
Retirer tout

[Fermé] Développement Logiciel de poker : Besoin d'aide pour le multi-pot

15 Messages
6 Utilisateurs
0 Réactions
1,356 Vues

Bonjour,
Je ne sais pas trop si j'ai posté dans la bonne partie du forum mais j'en voyais pas d'autre.

Dans le cadre d'un projet pour l'école je développe une plateforme de tournois de poker (en C). La plateforme est quasiment fini il ne me reste plus qu'a intégrer le multi-pot (quand plusieurs personne sont All In).
Le problème c'est que je n'arrive pas a recréer l'algorithme qui permettrait de gérer ce multi-pot. Dans "la vie réel" je sais comment faire mais la j'y arrive pas.
Si jamais vous avez une idée sur l'algo a adopter ou si vous connaissez un site qui en parle, ça pourrait m'aider.

Avec chance ce forum regorge de développeur :)

Merci.


14 réponses
Piskou
Inscrit : 08.05.2009
PokerStrategist

lorsque au moin un joueur est all in, tu détermine le plus petit tapis
-> tu fait un pot avec ca, et tu diminue le stack de tout le monde + crée un nouveau pot
-> tu peux faire une liste de pot qui contient la plupart du temps un seul item Pot

si un gros tapis est all-in, et que plusieur suivent, dont un short, tu crée un pot, tu diminues les mises (mais elles ne seront pas nulles vu que seul le short sera à 0, les autres seront a X-short) tu met tout ca dans un pot de x* la taille du short, puis tu crée un nouveau pot, et tu refait le même pour n-1 joueurs

quand tu n'as plus qu'un seul joueur qui mise (ou 0 mais c'est pas le cas ici) tu remet sa mise dans son stack, car soit c'est que tu le couvre, soit un fold, soit je sais pas quoi.

tu va à la street suivante, et tu continue dans le dernier pot en cour.

vu que quand un joueur est all-in, tu remplit le pot, et tu crée un nouveau pot courant, ca devrait marcher

bon je te donne ca vite fait, j'ai pas vraiment réfléchit plus loin que ca, mais dans un premier jet, je réfléchirais la dessus.

En esperant t'avoir donné une piste :)


_Anonymous_ Auteur du sujet
_Anonymous_

J'avais commencer a coder un algo de ce genre voir le meme mais j'avais trouver un problème quand des personnes call puis fold avant que les joueurs partent All In du coup le nombre de joueur sera eronner. Quand je créé le plus petit pot en me basant sur le nombre de joueur dans le coup et le tapis du short, ça ne tenais pas compte des joueurs qui avait mis de l'argent dans le pot mais avait fold.

Je ne suis pas sur d'avoir été très clair.
Ce week end, je réessayerais d'implémenter cette algo . Je te tiens au courant.

En attendant si vous avez d'autre algo n'hésitez pas.

Merci.


arzybudd
Inscrit : 18.05.2007
PokerStrategist

ton programme doit considerer le joueur qui fold non pas comme un joueur en moins mais comme un joueur perdant sur le side-pot qui lui était attribué.


Piskou
Inscrit : 08.05.2009
PokerStrategist

du genre

hero bet
vialin 1 call
vilain 2 call
vilain 3 raise all-in
hero fold
vilain 1 call
vilain 2 fold

c'est ca ?

dans ce cas la, tu peux consdirérer, qu'un joueur qui fold, met sa mise dans le pot, et sort du coup, ca ne change rien pour le reste :)

il fold, son argent va au milieu mais laisse le reste de la situation identique, ton pot sera toujours a augmenter du nombre de joeur restant * tapis du short

en gros parce que sans voir ton code c'est plus compliqué, mais bon (le C, c'est sick, je préf le c++ pour ce genre de truc, mais passons ^^ tu n'as peut-être pas le choix hein ^^)

en pseudo code :

//les joueur sont dans une liste circulaire, la tête représentant le bouton, ou utg-1 fonction de tes gouts
tous les joueurs commencent dans le coup
mise <- big blind ou 0 fonction de la street actuelle
for(joueur actuel <- tete de liste ;joueur = dernier joueur a faire de l'action; joueur actuel ++)
-action <- joueur actuel.action(mise) //le retire de la liste si il fold, diminue son stack s'il call -raise
-if(action > 0) //raise
--mise <- action
--dernier joueur <- joueur actuel
-else if (action < 0)
--liste <- enlever joueur actuel et mettre le pointeur sur le précédent, ou passer le joueur inactif plutot, fin tu vois ca comme tu veux

si un joueur call ou raise all in, on considère que si on continue de miser apres lui, il va toujours call avec un stack nul

tu as maintenant une liste des joueurs avec leur mise totale (action contient la mise la plus haute du tour d'enchère, pour comparer avec la dernière mise de chaque joueurs)

tu regarde si un joueur est all in, si oui, tu prend le plus petit, tu fait un pot, tu le retire de la liste, (idem s'il sont plusieurs avec des stack identiques) tu crée un nouveau pot avec les autre, jusqu'a ce que chaque joueur aie sa mise = 0

tu passe ensuite à la street suivante, en demandant l'action que des joeurs toujours en cours dans le dernier pot crée

à la fin, tu regardes pour chaque pot qui a la meilleur main, en commencant par le plus grand vers le plus petit (ce qui te permet de garder la meilleur main de chaque pot pour la comparer avec celle que tu n'as pas encore regardé dans les plus petit pots)

je suis conscient que ce que je te dit ici ne va pas spécilament t'aider, car il reste le problème de savoir qui appartient a quel pot, mais je dirais que ca tu peux sans doute le déterminer dans la classe pot, ou tu as une liste des participants qui ne peuvent gagner que ce pot (pour pas regarder plusieurs fois les mêmes mains) et tu donne comme paramètre la meilleur main du pot supérieur (si pas de pot supérieur, tu envoies rien obv ^^)

du genre joueur winPot(hand bestHandPrevPot) et joueur winPot()

fin si tu as d'autres questions, je laisse les autres répondrent, je ne pense pas pouvoir t'être encore utile ^^ étant également en train d'apprendre la programation moi même, tu n'as la que des idées, et de nouveaux, sans voir le code, difficile de savoir la facon dont tu te représente le coup

EDIT : tu peux donner un attribut "dans le coup" pour le considérer ou pas, et donc ne pas chipoter a ta liste de joueurs :) si "dans le coup" = false, als tu l'ignore et tu saute au suivant :) genre while( ! joueur actuel->dans le coup) joueur actuel ++ et voilà, tu zape direct les mecs qui sont sortit :)


Piskou
Inscrit : 08.05.2009
PokerStrategist

Message original de arzybudd
ton programme doit considerer le joueur qui fold non pas comme un joueur en moins mais comme un joueur perdant sur le side-pot qui lui était attribué.

comment résumer en une phrase ce que je n'arrive pas a dire en un pavé kilométrique ... ^^

merci :)


_Anonymous_ Auteur du sujet
_Anonymous_

Il y a des idées intéressantes dans ce que tu dis. J'avais même pas penser a la liste circulaire pour les joueurs, je me suis casser la tête avec des tableau et des ID.

Je le code en C car les membres de mon groupe connaissent que le C ^^

Le code est très sale (quoi que par rapport a ce qui se trouve sur le net, ça va ^^) donc je ne vais pas le link et comme c'est pour l'école ça me tente pas.

Je vais essayer de mettre a jour la liste chainée (ajouter des maillons) de pot a chaque fois que quelqu'un se met all-in.
Je vais sauvegarder dans la structure les joueurs qui ont mis de l'argent dans le pot et combien. Ça devrait fonctionner.


chika78
Inscrit : 06.08.2009
PokerStrategist

Ya pas de cours d'algorithmes, dans ton école ?
(comme dans la quasi totalité des écoles d'informatique, d'ailleurs. Pareil pour les cours de rigueur. Jamais vu, et c'est pourtant un des trucs les + importants dans ce métier. Mais je m'égare...).

C'est un peu comme apprendre à des gens à monter un mur sans faire des plans, quoi.

Ou essayer de placer les guirlandes et les boules avant le sapin.

Après, on cherche les bugs et on s'étonne que ça marche pas.

:f_mad:

Les phrases les plus entendues dans une salle de programmeurs ?
1) "Ya un truc bizarre...."
2) "Chez moi, ça marche"
3) "Tiens, ça marche !?!" (<= ma préférée, celle-là)


_Anonymous_ Auteur du sujet
_Anonymous_

Message original de chika78
Ya pas de cours d'algorithmes, dans ton école ?
(comme dans la quasi totalité des écoles d'informatique, d'ailleurs. Pareil pour les cours de rigueur. Jamais vu, et c'est pourtant un des trucs les + importants dans ce métier. Mais je m'égare...).

C'est un peu comme apprendre à des gens à monter un mur sans faire des plans, quoi.

Ou essayer de placer les guirlandes et les boules avant le sapin.

Après, on cherche les bugs et on s'étonne que ça marche pas.

:f_mad:

Les phrases les plus entendues dans une salle de programmeurs ?
1) "Ya un truc bizarre...."
2) "Chez moi, ça marche"
3) "Tiens, ça marche !?!" (<= ma préférée, celle-là)

Ya même pas de cours du tout. (En quelque sorte)
Je sais comment fonctionne le multi-pot, c'est juste que j'arrive pas a l'appliquer, pas besoin de cours pour ça.
Sinon je vois pas quel utilité a ton commentaire ?


Piskou
Inscrit : 08.05.2009
PokerStrategist

Message original de chika78
Ya pas de cours d'algorithmes, dans ton école ?
(comme dans la quasi totalité des écoles d'informatique, d'ailleurs. Pareil pour les cours de rigueur. Jamais vu, et c'est pourtant un des trucs les + importants dans ce métier. Mais je m'égare...).

C'est un peu comme apprendre à des gens à monter un mur sans faire des plans, quoi.

Ou essayer de placer les guirlandes et les boules avant le sapin.

Après, on cherche les bugs et on s'étonne que ça marche pas.

:f_mad:

Les phrases les plus entendues dans une salle de programmeurs ?
1) "Ya un truc bizarre...."
2) "Chez moi, ça marche"
3) "Tiens, ça marche !?!" (<= ma préférée, celle-là)

j'ai des cour de programation, d'algotithmique et d'architecture et dans les prochaine année de base de donnée, réseaux, etc :)

maintenant ca dépend ce que tu appelle école informatique, moi je suis a la fac

et je vois pas d'algo tout fait ou dans le genre qui pourrait l'aider mais c sur que pour coder qu'en C, ca doit pas avoir de grand cour de progra :) sinon ca ferait au minimum du python, sinon du java ou du c++


chika78
Inscrit : 06.08.2009
PokerStrategist

Message original de magiker
Ya même pas de cours du tout. (En quelque sorte)
Je sais comment fonctionne le multi-pot, c'est juste que j'arrive pas a l'appliquer, pas besoin de cours pour ça.
Sinon je vois pas quel utilité a ton commentaire ?

Ben à te dire qu'avant de programmer un truc (surtout si on n'y arrive pas), on réfléchit à son problème, on cherche un algorithme, on le teste, on le valide, et à la fin on le code. En C ou dans un autre langage.

C'est plus cela le vrai métier d'informaticien, concevoir un algorithme. La programmation, finalement, c'est très secondaire.

Et un bon algo fera (normalement) un bon programme, même avec un programmeur moyen.
Un mauvais algo ne fera jamais un bon programme.

Donc fais-toi plaisir (en plus tu apprendras certainement des choses) : réfléchis et trouve un algorithme, ça sera le tien et en plus tu maîtrisera ton sujet.
;)


_Anonymous_ Auteur du sujet
_Anonymous_

J'ai passe deux jours a chercher l'algo pour le multi-pot, c'est pas dans mon habitude de demander de l'aide mais la je suis bloquer.

et je vois pas d'algo tout fait ou dans le genre qui pourrait l'aider mais c sur que pour coder qu'en C, ca doit pas avoir de grand cour de progra sinon ca ferait au minimum du python, sinon du java ou du c++

Je suis en deuxième année a Epitech, on a pas vraiment de cours, on a des aides sur certain point plus ou moins compliquer (surtout en deuxième années) comme les sockets, les threads, les sémaphores ...
Durant la 1ere années ont fait que du C, durant la deuxième du C, du PHP et de l'ASM et enfin en 3eme années c'est du C++ et Java. (en 4eme et 5eme c'est libre).


Il y en a qui vont avoir un choc quand ils vont voir leur premier taf je crois.
Le metier c'est plus souvent de pisser du code qui marche sans y passer 3 jours, que de faire de jolis algos.

Faire autre chose que du script en python, jamais vu. Cours d'algo, sert 1 fois tous les 2 ans. Et ouais faire du C quand t'a le choix, c'est moche.

Good luck pour ton algo, mais vu que c'est ton code, et qu'il y a rien de super complexe ou super classique dans ce probleme, tu ira plus vite a te creuser les meninges que de chercher la solution sur le net.


jowy88
Inscrit : 09.08.2008
Elite Grinder

bahhh tu fais en sorte que to, algo retienne les stacks initailes dans une variable.

Admétons que joueur 1 gagne en ayant misé 1000 chips :

il gagne, sa mise + la mise du joueur 2 qui ets une variable à laquelle on retranche 1000 etc... (car 1000 est retiré du pot.) et joueur un ne peut pas gagné plus de 1000 chips par joueur dans le coup.

quand joueur 1 à reçu ses sous, tu fais la meme chose avec le 2eme gagnant, en réutilisant les variable qui ont suivi un changement suite à la victoire de joueur un.

Et il te faut une variable all in je pense. du genre
if (mise==stack_initail)
{
........
}

J'ai pas trop l'algo en tête, ça fait un moment que j'ai pas fait de C, mais je ferais comme ça.

en espèrant que ça t'aidera un minimum.


Piskou
Inscrit : 08.05.2009
PokerStrategist

c'est marrant, nous on a appris le C++ et on a fait du C pour tout ce qui est réseaux, pour le reste on encapsule en c++.

pisser du code ? ca se fait out-sourcer en inde, maintenant les ingé en info ils font surtout de l'analyse, de la conception (sauf peut-être dans certaines boites précises ou des petits projets)

je suis d'avis avec KingofDonks pour réfléchir plutot que chercher, c'est ev+ pour ton skill

pour jowy88, pas besoin de faire du C pour avoir une idée :) mon père m'a aidé plus d'une foi pour définir mes conditions dans mes projets de cours, alors qu'il touche pas une ligne de code simplement parce qu'il suffit de réfléchir sur une idée, de dire je fais ca si ou ca si etc. Le code c'est secondaire et ca rejoint ce que je dit, que tu out-source ca en inde, et toi en tant qu'ingé info, tu fait les algos, le design, et tu pisse pas du code :) (même si tu fait que ca pendant tes études)