微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python卡和甲板OOP

如何解决Python卡和甲板OOP

我正在尝试编写一个具有以下内容的程序:

功能可创建一副纸牌,认情况下为52张纸牌,提供西装时仅为13张。

AND

从卡组中删除第一张card_count卡,将其作为列表返回,并在缺卡时返回相应错误功能

下面的预期结果。

>>> deck2 = Deck('♠')
>>> deck2.shuffle_deck()
>>> print(deck2.cards)
[A of ♠,10 of ♠,3 of ♠,7 of ♠,5 of ♠,4 of ♠,8 of ♠,J of ♠,9 of ♠,Q of ♠,6 of ♠,2 of ♠,K of ♠]

>>> deck2.deal_card(7)
[A of ♠,8 of ♠]

>>> deck2.deal_card(7)
Cannot deal 7 cards. The deck only has 6 cards left!

我的问题是,每次运行代码时,我都会返回一个空列表。我想我有第一类(PlayingCard)设置权和西装的可选参数。但是,我不太确定如何实现交易功能或为什么我的列表返回空白。我想念一些小东西吗?

import random

class PlayingCard():
    def __init__(self,rank,suit):
        acc_suit = ("♠","♥","♦","♣")
        acc_rank = (2,3,4,5,6,7,8,9,10,"J","Q","K","A")
        assert rank in acc_rank,"Not a valid rank for a playing card."
        assert suit in acc_suit,"Not a valid suit for a playing card."
        self.suit = suit
        self.rank = rank
    
    def __repr__(self):
        return self.rank + ' of ' + self.suit

class Deck():
    
    def __init__(self,*suit):
        acc_suit = ("♠","♣")
        self.cards = []
        if suit == None:
            for suit in range(4):
                for rank in range (1,14):
                    card = PlayingCard(rank,suit)
                    self.cards.append(card)
        if suit in acc_suit:
            for rank in range (1,14):
                card = PlayingCard(rank,suit)
                self.cards.append(card)
            

    def shuffle_deck(self):
        random.shuffle(self.cards)
    
    def deal_card(self):
        return self.cards.pop(0)
    
    
    def __str__(self):
        res = []
        for card in self.cards:
            res.append(str(card))
        return '\n'.join(res)

解决方法

您的列表为空的原因是,如果您提供西装,则永远都不会创建套牌。打电话

deck2 = Deck('♠')

将导致suit = ('♠',)-一个 1元组(包含1个字符串),因此它将永远不会统计if suit in acc_suit: => self.deck为空。 / p>


还有很多其他错误,使您的代码可运行-内联注释中指出:

import random

class PlayingCard():
    def __init__(self,rank,suit):
        # you try to create cards by range(2,14) but you assert that suit must
        # be 2 to 10 or "J"-"A" for picture cards
        # also: range(2,14) is [2..13] only so you miss a card
        r = {11:"J",12:"Q",13:"K",14:"A"}   
        rank = r.get(rank,rank) # translate 10 to 14 to "JQMA"

        acc_suit = ("♠","♥","♦","♣")
        acc_rank = (2,3,4,5,6,7,8,9,10,"J","Q","K","A")
        assert rank in acc_rank,"Not a valid rank for a playing card."
        assert suit in acc_suit,"Not a valid suit for a playing card."
        self.suit = suit
        self.rank = rank
    
    def __repr__(self):
        # can not add a string to an integer (rank is an int for 2-10 !)
        return f"{self.rank} of {self.suit}"

和您的甲板课:

class Deck():
    
    # change this to a named param with default so you need to supply suit=' '       
    # omit the,* if you do not like to force suit=" " when calling this
    def __init__(self,*,suit = None):
        acc_suit = ("♠","♣")
        self.cards = []
        if not suit:
            for suit in range(4):
                for rank in range (1,14):
                    card = PlayingCard(rank,suit)
                    self.cards.append(card)
        if suit in acc_suit:
            for rank in range (2,15):
                card = PlayingCard(rank,suit)
                self.cards.append(card)

    def shuffle_deck(self):
        random.shuffle(self.cards)
    
    # this function does not accept parameters like you posted its usage
    def deal_card(self,amount = 1):
        # always returns a list of cards,even if you only request one
        rv,self.cards = self.cards[:amount],self.cards[amount:]
        # this does NOT do the evaluation of enough cards are left,do it yourself:
        #  if len(rv) != amount: raise whatever
        return rv

    def __str__(self):
        return '\n'.join(str(c) for c in self.cards)

测试:

deck2 = Deck(suit = "♠")
print(deck2.cards)
deck2.shuffle_deck()
print(deck2.cards) 
print(deck2.deal_card(7))
print(deck2.deal_card(7))

输出:

# orignal
[2 of ♠,3 of ♠,4 of ♠,5 of ♠,6 of ♠,7 of ♠,8 of ♠,9 of ♠,10 of ♠,J of ♠,Q of ♠,K of ♠,A of ♠]
# shuffeled 
[3 of ♠,A of ♠,2 of ♠,K of ♠]
# first 7
[3 of ♠,6 of ♠]
# next 7 (only 6 remain)
[4 of ♠,K of ♠]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?