J'ai le code écrit comme ça avant (mais avec des cartes pour le poker). Une certaine quantité de code est inévitable pour encoder toutes les règles du jeu. Par exemple, le code pour rechercher un n-de-un-type sera complètement différent du code pour chercher une ligne droite.
Considérons d'abord n-de-un-aimable. Comme d'autres l'ont suggéré, créez un dict
contenant les comptes de chaque élément. Puis:
counts = sorted(d.values())
if counts[-1] == 4:
return four_of_a_kind
if counts[-1] and counts[-2] == 3:
return two_sets_of_three
# etc.
La vérification des lignes droites nécessite une approche différente. Lors de la vérification de n-de-un-kind, vous devez obtenir les chiffres et ignorer les valeurs. Maintenant, nous devons examiner les valeurs et ignorer les comptes:
ranks = set(rolls)
if len(ranks) == 6: # all six values are present
return long_straight
# etc.
En général, vous devriez être en mesure d'identifier les règles avec une saveur similaire, le code abstrait que aide à ce genre de règles, puis écrire juste un quelques lignes par règle. Certaines règles peuvent être complètement uniques et ne pourront pas partager du code avec d'autres règles. C'est juste la façon dont le biscuit s'effondre.
Clever. Il pourrait y avoir quelques astuces pour faire un "ensemble" hors de la liste aussi bien. – dkamins
En python 2.7 (ou 3.1) theres une classe Counter dans le module de collections qui le fera pour vous. 'collections.Counter ([1, 2, 1, 4, 5, 1])' se comportera comme ce dictionnaire 'valeur: count'. – AndrewF