Я уже писал такой код (но с картами для покера). Определенное количество разрастания кода неизбежно для кодирования всех правил игры. Например, код для поиска 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.
В общем, вы должны быть в состоянии идентифицировать правила со схожим вкусом, абстрагировать код, который помогает с такими правилами, а затем написать всего несколько строк на правило. Некоторые правила могут быть совершенно уникальными и не смогут делиться кодом с другими правилами. Именно так печенье крошится.