Python Карточная Игра

Задача - разработать и протестировать карточную игру на основе карточного модуля.

Сначала написать вспомогательную функцию card_value(card), которая, учитывая карту, возвращает ее значение. Значения карт соответствуют их численному значению от 2 до 10, все лицевые карты (валет, дама, король) считаются 10, а туз - 11. Если цвет карты черный (т.е. трефовой или пиковой масти), ее значение равно удвоилось.

Затем написать новую функциюplay(seed_value), которая возвращает строку с отсортированными и разделенными пробелом победителями игры (например, «P1 P4»). Победители каждого хода, у которых самые ценные карты, получают по одному очку, а финальными победителями становятся те, кто набрал максимальное количество очков. Метод семени (из модуля случайных чисел) должен использоваться для инициализации генератора псевдослучайных чисел с использованием random.seed(seed_value).

Как и в исходной функции play() из модуля карточек, игра происходит следующим образом:

Каждому игроку раздается по 13 карт. Затем выбирается первый игрок, и игроки по очереди разыгрывают свои карты. Игроки будут случайным образом разыгрывать по одной карте на каждом ходу, пока их руки не опустеют. Победителем на терне или в случае ничьей становятся те, у кого самая ценная карта. Победитель игры или победители в случае ничьей определяются в конце.

Исходный код:

import random
from typing import List, Tuple

SUITS = "♠ ♡ ♢ ♣".split() 
RANKS = "2 3 4 5 6 7 8 9 10 J Q K A".split()

Card = Tuple[str, str]
Deck = List[Card]

def create_deck(shuffle: bool = False) -> Deck:
    deck = [(s, r) for r in RANKS for s in SUITS]
    if shuffle:
        random.shuffle(deck)
    return deck

def deal_hands(deck: Deck) -> Tuple[Deck, Deck, Deck, Deck]:
    return (deck[0::4], deck[1::4], deck[2::4], deck[3::4])

def choose(items):
    return random.choice(items)

def player_order(names, start=None):
    if start is None:
        start = choose(names)
    start_idx = names.index(start)
    return names[start_idx:] + names[:start_idx]

def play() -> None:
    deck = create_deck(shuffle=True)
    names = "P1 P2 P3 P4".split()
    hands = {n: h for n, h in zip(names, deal_hands(deck))}
    start_player = choose(names)
    turn_order = player_order(names, start=start_player)

    while hands[start_player]:
        for name in turn_order:
            card = choose(hands[name])
            hands[name].remove(card)
            print(f"{name}: {card[0] + card[1]:<3}  ", end="")
        print()

if __name__ == "__main__":
    play()

Пример использования:

print(play(999)) #P2 P4
print(play(31)) #P2
print(play(72)) #P3
print(play(19)) #P2
print(play(98765432)) #P1 #P2 #P3

Ответы (1 шт):

Автор решения: Kostya Khmylov

Проблема, была в функции choose().

Чтобы функция работала правильно, она всегда должена брать образец размером 1 из руки каждого игрока.

def choose(items):
    return random.sample(items, 1)   # Not len(items)!

Используя len(items) для k, я заставлял генератор псевдослучайных чисел вызываться дополнительные раз при каждом вызове Choose(hands[name]).

→ Ссылка