簡體   English   中英

如何在紙牌游戲中刪除重復項-Python

[英]How to remove duplicates in card game- python

#-*- coding: UTF-8 -*-
import random
import time
NUM_CARDS = 5
CARD_WIDTH = 8
SUITS = [('Spades', '♠'), ('Hearts', '♥'), ('Clubs', '♣'), ('Diamonds', '♦')]
NAMES = {11: 'Jack', 12: 'Queen', 13: 'King', 14: 'Ace'}
def get_card_name(n):  return NAMES.get(n, "%2d" % n)
def card_row(text=''): return "|" + text.center(CARD_WIDTH) + "|"
cards = [list() for _ in range(7)]
rem={}
if True:
for _ in range(NUM_CARDS):
    cv = random.randint(2,14)#value
    cs = random.randint(0,3)#suit
    cards[0].append('_' * (CARD_WIDTH+2))
    cards[1].append(card_row(''))
    cards[2].append(card_row(get_card_name(cv)))
    cards[3].append(card_row('of'))
    cards[4].append(card_row(SUITS[cs][0]))
    cards[5].append(card_row(SUITS[cs][1]*(CARD_WIDTH)))
    cards[6].append(card_row("_" * CARD_WIDTH))
    rem[cv]=cs
print 'Welcome to SANDCRAB. This is your deck of cards.'
for k in rem:
print k,rem[k]
for lst in cards:
print ''.join(lst)

你好。 我正在嘗試制作紙牌游戲,但是我不確定如何使所有紙牌都獨一無二,就像在紙牌中一樣。 換句話說,我不希望有任何重復的內容。 我遇到的另一個問題是,當我嘗試將信息添加到詞典rem時,不會打印具有相同值的所有卡片。 謝謝。

就個人而言,這就是我要做的:

card_type = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"]
card_vals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
card_suit = ["Spade", "Clubs", "Diamond", "Hearts"]
internal_deck = []
display_deck = []
for i in range(0, len(card_type), 1):
    for j in range(0, len(card_suit), 1):
        internal_deck.append((card_type[i], card_suit[j], card_vals[i]))
        display_deck.append(card_type[i] + " of " + card_suit[j])
for cards in display_deck:
    print(cards)

如果您想知道為什么有兩個列表,這就是為什么。 我希望一種功能更多,可以將卡打印到屏幕上,另一種功能則可以更好地處理用戶看不到的內部事物。

您應該將已挑選的卡片存儲在列表中,而不是字典中。 這樣,它可以跟蹤具有相同價值或相同花色的多張牌。

適應您當前代碼的最簡單方法是添加一個while循環,該循環使揀選卡尚未存儲在hand (已揀選的卡列表)。

# ...
hand = []
for _ in range(NUM_CARDS):
    while True:
        cv = random.randint(2,14)#value
        cs = random.randint(0,3)#suit
        if (cv, cs) not in hand:
            break
    hand.append((cv, cs))
    cards[0].append('_' * (CARD_WIDTH+2))
    cards[1].append(card_row(''))
    cards[2].append(card_row(get_card_name(cv)))
    cards[3].append(card_row('of'))
    cards[4].append(card_row(SUITS[cs][0]))
    cards[5].append(card_row(SUITS[cs][1]*(CARD_WIDTH)))
    cards[6].append(card_row("_" * CARD_WIDTH))
print 'Welcome to SANDCRAB. This is your deck of cards.'
for card in hand:
    print card
for lst in cards:
    print ''.join(lst)

或者,將卡片存儲在集合中而不是列表中:

hand = set()
while len(hand) < NUM_CARDS:
    hand.add((random.randint(2,14), random.randint(0, 3))

您還可以簡化輸出,例如:

def card_output(value, suit_number):
    suit, symbol = SUITS[suit_number]
    return ['_' * (CARD_WIDTH + 2)] + map(card_row, [
        '', 
        NAMES.get(value, "%2d" % value),
        'of',
        suit,
        symbol * CARD_WIDTH, 
        '_' * CARD_WIDTH])

# method 1. randomly select until we have 5 unique values
hand1 = set()
while len(hand1) < NUM_CARDS:
    hand1.add((random.randint(2, 14), random.randint(0, 3)))

# method 2. make a deck then sample 5 cards from it
deck = [(value, suit_number) for value in range(2, 14) for suit_number in range(3)]
hand2 = random.sample(deck, NUM_CARDS)

print 'Welcome to SANDCRAB. This is your deck of cards.'
for hand in [hand1, hand2]:
    for row in zip(*[card_output(value, suit_number) for value, suit_number in hand]):
        print ''.join(row)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM