PDA

Voir la version complète : Poker aux dés



Nattefrost
31/01/2014, 18h32
Salut les canards codeurs, bon voilà le background :
Après quelques années d'errements j'ai repris les études, des études de programmation (dans une école privée).
Mon premier semestre vient de s'achever, lors de ce premier semestre j'ai fait un projet (un jeu de dame 1contre1 jouable par browser) et le langage utilisé était nodeJS.

Ayant un mois de coupure je me suis dit que si je programmais pas du tout ça le ferait pas. Il fallait donc que je fasse quelque chose de mes dix doigts et de mes neurones, et pourquoi pas dans un langage que je connais pas mais qui est accessible.

Du coup j'ai jeté mon dévolu sur python, une fois les différences de syntaxe de base avec nodeJS passées j'me met a faire des petits programmes "à la con" avec l'interpreteur et IDLE.
Dans le cas qui nous intéresse j'ai voulu faire un poker aux dés (pourquoi pas, comme dans the witcher).

Mon problème est au niveau de la manière de faire pour relancer les bons dés. Du coup j'ai fait une méthode sale qui consiste à mettre chaque eventualité dans un else if mais j'me rend bien compte qu'il y a certainement mieux. Avez vous des idées ? J'vous met le code plus bas.

tl;dr Comment rendre mon code plus court quand le programme propose quel dé relancer ? Je sais faire un truc qui fonctionnera mais c'est pas joli-joli.


import random
print("Le but est de faire une combinaison de poker avec les dés")
userInput = input("Lancez les dés en appuyant sur n'importe quelle touche, q pour quitter... ")

if(userInput != "q"):
d0 = random.randint(1, 6) # PREMIER LANCER AVEC LES CINQ DES
d1 = random.randint(1, 6)
d2 = random.randint(1, 6)
d3 = random.randint(1, 6)
d4 = random.randint(1, 6)
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
stop = False
count = 0

while(stop != True):
reroll = input("Quel dé voulez vous relancer (d0 d1 d2 d3 d4) ? Maximum trois relances ")
if(count == 3):
print("""Vous avez relancé trois fois, voici ce que vous avez""")
break # SORTIE DE BOUCLE

if(reroll == "d0" or reroll == "D0"): # ON COUVRE CHAQUE CAS
d0 = random.randint(1, 6)
count = count + 1
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
elif(reroll == "d1" or reroll == "D1"):
d1 = random.randint(1, 6)
count = count + 1
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
elif(reroll == "d2" or reroll == "D2"):
d2 = random.randint(1, 6)
count = count + 1
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
elif(reroll == "d3" or reroll == "D3"):
d3 = random.randint(1, 6)
count = count + 1
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
elif(reroll == "d4" or reroll == "D4"):
d4 = random.randint(1, 6)
count = count + 1
print("D0 :",d0,"--D1 :", d1,"--D2 :", d2,"--D3 :", d3,"--D4 :", d4)
else:
stop = True
print("""------------Vous n'avez pas rentré un dé valide, fermeture du programme------------""")
else:
print("Au revoir")

MrShibby
01/02/2014, 14h22
Stocker les dés dans un tableau au lieu d'avoir une variable pour chaque peut simplifier pas mal je pense.
Une première boucle pour générer un nombre aléatoire pour chaque dés.

Et ensuite un truc du genre:



reroll <= dé à relancer
Si tableau[reroll] existe Alors:
tableau[reroll] = random(1,6)

Nattefrost
01/02/2014, 14h30
Ha voilà, je savais que je pouvais faire plus court, merci :). Suis pas encore bien à l'aise avec les boucles for en python (c'est bien de ça qu'il s'agirait pour la génération du lancer initial ?), la notation est complètement différente de nodeJS.
for(i = 0; i < tableau.length; i++)

Bon j'y retourne :p .

Nattefrost
06/02/2014, 18h50
Bon ça avance :), je pensais faire ça plus vite mais j'avais pas réalisé qu'avec le peu d'experience que j'ai la résolution des combinaisons de dés me demanderait autant d'efforts.

Principalement la double paire et le full. Ca me pose un vrai problème de logique : nous sommes d'accord que le Full c'est un brelan+une paire donc par exemple 555 22.
Aucun soucis pour trouver le brelan ou la paire indépendamment.

Sauf que si on a un brelan (555) on a forcément une paire (55) du coup dire "cherche le brelan puis la paire" ne fonctionne pas puisqu'il retrouvera la paire incluse dans le brelan (55) et non celle qui fait la combinaison (22). En gros il faudrait que je trouve le moyen de dire "quand tu as trouvé un brelan tu exclus les valeurs qui le composent du prochain test", test destiné à voir si une paire est présente en plus du brelan. Comment faire? Je pensais par exemple à supprimer les entrées correspondantes du tableau avant d'effectuer le second test.

Est-ce que ça tient la route ou est-ce que je suis à côté de la plaque et j'me fais fondre le cerveau pour rien ?

PS : J'ai voulu tenter une version graphique avec pygame (Python et SDL) donc ça a pris du temps mais ça se passe bien, c'est toujours la logique qui pose le plus de problèmes :lol:.

SeanRon
07/02/2014, 00h00
j'aurai commençé par sortir le resultat dans un Array.
Puis dans une boucle for, j'aurai testé le nombre d'occurances de chaque nombre, avec une fonction genre array_count_values()

je teste les 1 -> 0
je teste les 2 -> 2 c'est forcement une paire
je teste les 3 -> 0
je teste les 4 -> 0
je teste les 5 -> 3 c'est forcement un brelan
je teste les 6 -> 0

Puis dans un cas de pair+brelan, le resultat devient un full.

je crois que c'est un simple count() en python :

[5, 5, 5, 2, 2].count(5)
3

Nattefrost
07/02/2014, 00h28
Wah putain j'étais passé à côté de ça (le count() sur une liste). J'ai pourtant beaucoup lu mais j'ai du le zapper...
Ca va grandement me faicliter la vie, pour les paires et brelans j'avais couvert tous les cas un par un :wacko:

Merci beaucoup :)

deathdigger
07/02/2014, 10h09
Pour les suites, tu mets ton array dans l'ordre croissant, et tu vérifies si t'as +1 entre chaque dé :)

Nattefrost
07/02/2014, 14h28
Ouais les suites je m'en fais pas je m'y suis pas encore vraiment attaqué mais ça me semble pas être le plus dur, d'autant qu'aux dés il n'y a que 1->5 ou 2->6. Bonne idée en tous cas de le trier avant de faire les comparaisons :).

Mais quel tri utiliser ? :p Bon pour 5 indices on s'en fout pas mal je suppose, un tri à bulles tout bête fera l'affaire.

Sanakan
07/02/2014, 20h33
Tu as probablement une fonction de tri toute faite ^^

Nattefrost
08/02/2014, 12h16
Oui bien sur il y a probablement un quicksort mais je veux m'y frotter, voir si je suis capable de le refaire à la main :) (je l'ai fait pendant mon semestre).

Nattefrost
12/02/2014, 22h36
Bon après quelques jours mouvementés je m'y suis remis et j'ai un résultat jouable, merci aux canards qui m'ont donné des conseils :). En revanche un truc me chiffonne c'est qu'on prend une erreur quand on quitte (pas réellement gênant m'enfin...).
C'est lié à pygame visiblement mais j'ai pas trouvé d'infos là-dessus :-/ .

J'essaierai peut-être de faire une IA même pourrie (en l'état c'est simple y en a pas), en attendant je met ça dispo si y en a qui veulent s'amuser à trouver les bugs (j'ai pas testé comme un dingue j'ai joué une heure)

https://skydrive.live.com/redir?resid=5D23DFE4C4ADD633%21387

Je met un exe (fait avec cx_freeze) pour pas avoir à telecharger pygame+python3.3, si vous voulez les sources (voulez-vous vraiment pleurer? :p ) c'est faisable.

PS : Finalement avec le count() suggeré par seanRon, pas eu besoin de trier ma liste.

SeanRon
13/02/2014, 11h16
dès que j'appuie une touche, ça crashe :
http://tof.canardpc.com/preview/4aa7354e-efd7-42f4-80d3-690f24c204be.jpg (http://tof.canardpc.com/view/4aa7354e-efd7-42f4-80d3-690f24c204be.jpg)

Nattefrost
13/02/2014, 12h07
N'importe laquelle ? Perso j'ai aussi cette erreur mais uniquement quand on quitte (display surface quit) en fait une fois la partie finie, n'importe quel input quitte le jeu.
Donc normalement si tu as ça, tu as appuyé au moins trois fois. Si c'est pas le cas est-ce que tu peux me confirmer ?
Ce serait étrange parce que j'ai testé en téléchargeant sur un autre PC et ça tournait (malgré cette erreur de quit pour laquelle j'ai rien trouvé).