Я пытаюсь посчитать переменные в списке для назначения, а затем назначить его на номер (0,6) - PullRequest
0 голосов
/ 05 мая 2019

Мое задание - создать игру в покер на кости, и текущий вопрос, который я имею в виду, - присвоить игроку ранг, т. Е. Целочисленное значение от 0 до 6.

вот полный вопрос

"Определите ранг руки игрока (то есть целое число от 0 до 6, как описано в разделе" Dice Poker "). Игра и правила игры ». Подсказка: используйте список die_count, в котором указано, сколько раз был брошен каждый номинал кубика. Чтобы определить ранг руки. "

как мне присвоить руке ранг, основанный на количестве кубиков? я не должен использовать .count () или любой другой метод списка

Вот мой код

import dice  
import random

player_hand = [0, 0, 0, 0, 0]    
computer_hand = [0, 0, 0, 0, 0]    
die_count = [0, 0, 0, 0, 0, 0, 0]    
die_count2 = [0, 0, 0, 0, 0, 0, 0]

i = 0    
l = 0 

for x in range(5):
    player_hand[x] = random.randint(1,6)    
    computer_hand[x] = random.randint(1,6)

while i < 5 :
    die_value = player_hand[i]    
    die_count[die_value] = die_count[die_value] + 1
    i = i + 1

while l < 5 :
    die_value = computer_hand[l]    
    die_count2[die_value] = die_count2[die_value] + 1
    l = l + 1

print ("Player's hand:")
dice.display_hand(player_hand, 5)

print (" ")    
print ("Computer's hand:\n")    
dice.display_hand(computer_hand, 5)

print (str(die_count))
print (str(die_count2))

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Добро пожаловать в переполнение стека! Совет на будущее: вы уменьшаете вероятность получения хорошего ответа, когда исключаете важную информацию, например, правила игры, которую программируете. Похоже, существует множество сходных, но разных наборов правил для игры в кости. Было бы полезно узнать, какой вы используете. Не забудьте включить такие вещи.

Например, неясно, почему в 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}"
      )
0 голосов
/ 05 мая 2019

Если вам нужен список с количеством значений кубиков:

dice_count_player=[player_hand.count(x) for x in range(1,7)]

Если вы действительно не хотите использовать счет, то вы можете выполнить эту часть, как написали в вопросе, нонемного короче:

dice_count_player = [0, 0, 0, 0, 0, 0, 0]
for v in player_hand:
    dice_count_player[v] += 1

Если вы хотите, чтобы счет в обратном порядке:

dice_count_player_desc = sorted(dice_count_player, reverse=True)

Затем вы можете рассчитать значение из этого как:

if dice_count_player_desc[0] == 5:
    print("Five of a kind")
elif dice_count_player_desc[0] == 4:
    print("Four of a kind")
...
elif dice_count_player_desc[0] == 2 and  dice_count_player_desc[1] == 2:
    print("Two pairs")

Полный пример:

import random

player_hand = [0, 0, 0, 0, 0, 0]    
computer_hand = [0, 0, 0, 0, 0, 0]    
dice_count_player = [0, 0, 0, 0, 0, 0, 0]    
dice_count_computer = [0, 0, 0, 0, 0, 0, 0]

for x in range(6):
    player_hand[x] = random.randint(1,6)    
    computer_hand[x] = random.randint(1,6)

print ("Player's hand:")
print(player_hand)

print ()    
print ("Computer's hand:\n")    
print(computer_hand)

for v in player_hand:
    dice_count_player[v] += 1

for v in computer_hand:
    dice_count_computer[v] += 1

dice_count_player_desc = sorted(dice_count_player, reverse=True)

if dice_count_player_desc[0] == 5:
    print("Five of a kind")
elif dice_count_player_desc[0] == 4:
    print("Four of a kind")
elif dice_count_player_desc[0] == 3 and  dice_count_player_desc[1] == 2:
    print("Full house")
elif max(dice_count_player) == 1 and  (dice_count_player[1] == 0 or dice_count_player[6] == 0):
    print("Straight")
elif dice_count_player_desc[0] == 3:
    print("Three of a kind")
elif dice_count_player_desc[0] == 2 and  dice_count_player_desc[1] == 2:
    print("Two pairs")
elif dice_count_player_desc[0] == 2 and  dice_count_player_desc[1] < 2:
    print("One pair")
else:
    print("Bust")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...