заменяя затем числа 11-14 на строковые валет, дама, король, туз

Итак, я делаю войну, и я не знаю, как сделать так, чтобы числа 11–14 не появлялись при раздаче, а вместо этого отображались валет, дама, король и туз при дельте. Тем не менее, я все еще хочу, чтобы строковые валет, дама, король и туз по-прежнему имели значение чисел 11-14, поэтому, когда я определяю победителя, я могу сравнивать две карты по значению, а не по строкам.

выход колоды:

{'value': 2, 'suit': 'Hearts'}, {'value': 2, 'suit': 'Diamonds'} and so on

вывод:

11 of hearts
12 of diamonds
13 of clubs
14 of spades

ожидаемый результат:

Jack of hearts
Queen of diamonds
King of clubs
Ace of spades

#deck of cards
deck = []
values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
suits = ["Hearts", "Diamonds", "Clubs", "Spades"]
dealDeck =[]

for number in values:
  for suit in suits:
    newCard = {"value": number, "suit": suit}
    deck.append(newCard)

    #code
    for card in deck:
        if card["value"] == 11:
          card["value"] = "Jack"
        if card["value"] == 12:
          card["value"] = "Queen"
        if card["value"] == 13:
          card["value"] = "King"
        if card["value"] == 14:
          card["value"] = "Ace"

person Chamong Lo    schedule 04.12.2018    source источник


Ответы (2)


Это действительно хороший пример того, когда использовать класс для ваших карточек. Вы можете сохранить значение и масть, но отображать имя.

class Card:
    value_map = {
        11: 'Jack', 
        12: 'Queen', 
        13: 'King', 
        14: 'Ace'
    }

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit
        self.name = str(self.value_map.get(value, value)) + ' of ' + suit

    def __str__(self):
        return self.name

    def __repr__(self):
        return f'<Card "{self.name}">'

deck = []
values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
suits = ["Hearts", "Diamonds", "Clubs", "Spades"]
dealDeck =[]

for number in values:
    for suit in suits:
        newCard = Card(number, suit)
        deck.append(newCard)

deck
# returns:
[<Card "2 of Hearts">,
 <Card "2 of Diamonds">,
 <Card "2 of Clubs">,
 <Card "2 of Spades">,
 <Card "3 of Hearts">,
 <Card "3 of Diamonds">,
 ...
 <Card "King of Clubs">,
 <Card "King of Spades">,
 <Card "Ace of Hearts">,
 <Card "Ace of Diamonds">,
 <Card "Ace of Clubs">,
 <Card "Ace of Spades">]
person James    schedule 04.12.2018

Сделайте список карточек словарём, а не списком. Таким образом, вы можете объединить имена и ценности.

import random

class deck:
    cards = {2 : 'Two',
            3 : 'Three',
            4 : 'Four',
            5 : 'Five',
            6 : 'Six',
            7 : 'Seven',
            8 : 'Eight',
            9 : 'Nine',
           10 : 'Ten',
           11 : 'Jack',
           12 : 'Queen',
           13 : 'King',
           14 : 'Ace'
           }

suits = ['Hearts', 'Spades', 'Clubs', 'Diamonds']

def __init__(self, cards, suits):
    pass

def create_deck(self):
    new_deck = {}
    for suit in self.suits:
        for value, card in self.cards.items():
            card_name = card + ' of ' + suit
            new_deck[card_name] = value
    return new_deck

Затем я добавил код перетасовки и способ разделить колоды на две.

def shuffle_deck(card_deck):
    card_list = []
    for card_key in card_deck:
        card_list.append(card_key)
        random.shuffle(card_list)
    return card_list

Тогда простой круглый счетчик

def war_round(deck_player_1, deck_player_2):
    # Print round number here???
    round_winner = 0
    flip_player_1 = deck_player_1.pop()
    flip_player_2 = deck_player_2.pop()
    print('Player 1 flips a ' + flip_player_1 + ' (' + str(master_deck.get(flip_player_1)) + ')')
    print('Player 2 flips a ' + flip_player_2 + ' (' + str(master_deck.get(flip_player_2)) + ')')
    if master_deck.get(flip_player_1) > master_deck.get(flip_player_2):
        round_winner = 1
    elif master_deck.get(flip_player_1) < master_deck.get(flip_player_2):
        round_winner = 2
    else:
        #Function call to calculate War goes here
        round_winner = 3
    return round_winner

Затем запустите раунд со счетами ....

# Execute a card flip and update the score
def flip(deck_player_1, deck_player_2, score):
    round_winner = war_round(deck_player_1, deck_player_2)
    if round_winner == 1:
        print(name_player_1 + ' wins round.')
        score['Player 1'] = score['Player 1'] + 1
    elif round_winner == 2:
        print(name_player_2 + ' wins round.')
        score['Player 2'] = score['Player 2'] + 1
    else:
        print('War!')
    return score

Затем выполнение кода ....

# Setup code runs upon startup
# Creates a score for each player
score_player_1 = 0
score_player_2 = 0
score = {'Player 1': score_player_1, 'Player 2': score_player_2}

# Create a new master deck of cards and then shuffle them
new_deck_primer = deck(deck.cards, deck.suits)
master_deck = new_deck_primer.create_deck()
shuffled_deck = shuffle_deck(master_deck)

# Allocates half the cards to player 1 and the other half to player 2
deck_player_1 = [i for x,i in enumerate(shuffled_deck) if x%2==1]
deck_player_2 = [i for x,i in enumerate(shuffled_deck) if x%2==0]

# Gets the players names
name_player_1 = input('Enter player one name: ')
name_player_2 = input('Enter player two name: ')

Чтобы выполнить раунд, введите .....

flip(deck_player_1, deck_player_2, score)
person Justin Wood    schedule 04.12.2018
comment
как бы я сослался на значения, если бы сравнивал, какая карта имеет более высокое значение? - person Chamong Lo; 04.12.2018
comment
@ChamongLo Я немного изменил свой код, тоже повеселился! - person Justin Wood; 06.12.2018