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 шт):
Проблема, была в функции choose().
Чтобы функция работала правильно, она всегда должена брать образец размером 1 из руки каждого игрока.
def choose(items):
return random.sample(items, 1) # Not len(items)!
Используя len(items) для k, я заставлял генератор псевдослучайных чисел вызываться дополнительные раз при каждом вызове Choose(hands[name]).