Определить, содержит ли бросок костей определенные комбинации? - PullRequest
2 голосов
/ 07 октября 2010

Я пишу симулятор игры в кости на Python.Я представляю бросок, используя список, содержащий целые числа от 1-6.Поэтому у меня может быть такой бросок:

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

Мне нужно определить, содержит ли бросок выигрышные комбинации, такие как 3 вида, 4 вида, 2 набора по 3 и стриты.

Есть ли простой Pythonic способ сделать это?Я пробовал несколько подходов, но все они оказались грязными.

Ответы [ 3 ]

4 голосов
/ 07 октября 2010

Реорганизовать в диктовку с value: count и проверить наличие различных паттернов.

2 голосов
/ 07 октября 2010

Я уже писал такой код (но с картами для покера). Определенное количество разрастания кода неизбежно для кодирования всех правил игры. Например, код для поиска n-в-роде будет полностью отличаться от кода для поиска прямой.

Давайте сначала рассмотрим n-в-своем роде. Как предлагали другие, создайте dict, содержащий количество элементов каждого элемента. Тогда:

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.

Проверка на прямые требует другого подхода. При проверке n-of-a-типа вам нужно получить количество и игнорировать значения. Теперь нам нужно проверить значения и игнорировать счет:

ranks = set(rolls)
if len(ranks) == 6: # all six values are present
    return long_straight
# etc.

В общем, вы должны быть в состоянии идентифицировать правила со схожим вкусом, абстрагировать код, который помогает с такими правилами, а затем написать всего несколько строк на правило. Некоторые правила могут быть совершенно уникальными и не смогут делиться кодом с другими правилами. Именно так печенье крошится.

1 голос
/ 07 октября 2010

Есть два способа сделать это:

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

Этот вдохновлен Игнасио Васкесом-Абрамсом и Дкаминами

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
...