2010-10-07 16 views
2

J'écris un simulateur de jeu de dés en Python. Je représente un rouleau en utilisant une liste contenant des entiers de 1-6. Donc, je pourrais avoir un rouleau comme celui-ci:Détermine si un jet de dés contient certaines combinaisons?

[1,2,1,4,5,1] 

Je dois déterminer si un rouleau contient des combinaisons de notation, telles que 3 d'une sorte, 4 d'une sorte, 2 séries de 3 et lignes droites.

Y a-t-il un moyen simple de faire cela? J'ai essayé plusieurs approches, mais elles se sont toutes avérées désordonnées.

Répondre

4

Réorganiser en dict avec value: count et tester la présence de divers modèles.

+0

Clever. Il pourrait y avoir quelques astuces pour faire un "ensemble" hors de la liste aussi bien. – dkamins

+2

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

1

Il y a deux façons de le faire:

def getCounts(L): 
    d = {} 
    for i in range(1, 7): 
     d[i] = L.count(i) 
    return d # d is the dictionary which contains the occurrences of all possible dice values 
      # and has a 0 if it doesn't occur in th roll 

Celui-ci est inspiré par Ignacio Vazquez-Abrams et dkamins

def getCounts(L): 
    d = {} 
    for i in set(L): 
     d[i] = L.count(i) 
    return d # d is the dictionary which contains the occurrences of 
      # all and only the values in the roll 
2

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.