Добро пожаловать в переполнение стека! Совет на будущее: вы уменьшаете вероятность получения хорошего ответа, когда исключаете важную информацию, например, правила игры, которую программируете. Похоже, существует множество сходных, но разных наборов правил для игры в кости. Было бы полезно узнать, какой вы используете. Не забудьте включить такие вещи.
Например, неясно, почему в die_count
есть 7 элементов, поскольку у кубика есть 6 сторон. Я могу только предположить, что вы используете правила, где 1 может быть 1 или туз. Но если это так, то любое число 6 должно быть с индексом 5, а не 6, т. Е. Если вы играете пять 6, то die_count
должно быть [0, 0, 0, 0, 0, 5, 0]
, но ваша программа вычисляет [0, 0, 0, 0, 0, 0, 5]
. Кроме того, вы используете значения 1-6 только в качестве индексов для die_count
, что означает, что первый элемент (индекс 0) вообще не используется.
Я использовал правила игры в покер на кости, найденные здесь , которые явно отклоняются от ваших правил (например, 9 рук / рангов вместо 7). Мой код все еще должен быть полезным, и вы можете адаптировать его по мере необходимости. Мой код также предполагает, что номинальные значения игральных костей не влияют на ранг, то есть пара из 2 имеет такой же ранг, что и пара из 6. Как следствие, я сократил переменные die_count_*
до 6 элементов, потому что пара единиц и пара тузов - это на самом деле одно и то же, и тузы нельзя использовать ни на высоких, ни на низких стритах.
Фактический процесс ранжирования происходит в функции rank_hand
с использованием словаря rank_dict
. Я исключил ваш dice
модуль, потому что я понятия не имею, что он делает и где его взять (во всяком случае, он не играет роли в ранжировании рук). Я добавил множество комментариев, чтобы вы понимали, что делает каждая часть - код на самом деле довольно компактен без них.
from random import randint
hand_play, die_count_play = [0] * 5, [0] * 6
hand_comp, die_count_comp = [0] * 5, [0] * 6
# The work done in your three loops can be done in one for-loop.
for i in range(5):
hand_play[i], hand_comp[i] = randint(1,6), randint(1,6)
die_count_play[hand_play[i]-1] += 1
die_count_comp[hand_comp[i]-1] += 1
# Put the rankings in a dictionary with tuples corresponding to hands as keys.
rank_dict = { (5,):8, # five of a kind
(4,):7, # four of a kind
(2, 3):6, # full house
(0, 1, 1, 1, 1, 1):5, # high straight
(1, 1, 1, 1, 1, 0):4, # low straight
(3,):3, # three of a kind
(2, 2):2, # two pairs
(2,):1 # one pair
}
def rank_hand(die_count, rank_dict = rank_dict):
"""
Take in list (length == 6) where each element is a count of the number of
times the digits 1-6 occur in throw of 5 dice. Return a hand ranking using
a dictionary of rankings `rank_dict`.
"""
# If max value is two then key is either (2, 2) or (2,).
if max(die_count) == 2:
rank = rank_dict[tuple([c for c in die_count if c == 2])]
# If max value is 1 then hand is either high or low straight, or no hand.
elif max(die_count) == 1:
# One of the values, first or last, must be 0 if hand is a high/low
# straight. If not, then there's no hand.
if 0 in die_count[0::5]:
rank = rank_dict[tuple(die_count)]
else:
rank = 0
# If not a pair, straight, or no hand, then it must be one of remaining
# hands.
else:
rank = rank_dict[tuple(set([c for c in die_count if c > 1]))]
return rank
# Call rank_hand on die counts for player and computer.
rank_play = rank_hand(die_count_play)
rank_comp = rank_hand(die_count_comp)
print(f"Player's rank: {rank_play}\n" +
f"Player's hand: {hand_play}\n" +
f"Die count: {die_count_play}\n" + 30*"-"
)
print(f"Computer's rank: {rank_comp}\n" +
f"Computer's hand: {hand_comp}\n" +
f"Die Count: {die_count_comp}"
)