【问题标题】:Implementing a `Card` class实现一个“卡片”类
【发布时间】:2018-05-04 22:38:25
【问题描述】:

这个程序是关于定义一个类Card,它在被叫到时生成一张牌(只有等级,没有花色)。我做的方式与说明不同,所以现在我对这个程序应该如何工作感到非常困惑。

import random
class Card:
    def __init__(self):
        self.__value = 0

    def deal(self):
        self.__value(random.randint(1,13))      

    def set_value(self, value):
        self.value = set_face_value

    def get_value():



    def set_face_value(self):
         faces = {1: "Ace", 2: "two", 3: "Three",  4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine", 10: "Ten", 11: "Jack", 12: "Queen", 13: "King"}
         self.face_value = faces[self.value]

    def __str__(self):
        return self.face_value

我不得不抹去它,因为我仍在试图弄清楚我做错了什么。这是她对我的节目的回应:

import random
class Card:
    def __init__(self):
        self.value = 0       # THIS SHOULD BE PRIVATE - PUT __ AS THE FIRST
                             # TWO CHARACTERS IN THE NAME
        self.face_value = '' # YOU DO NOT SAVE THIS
                             # YOU SHOULD HAVE ONLY ONE DATA ATTRIBUTE


    def deal(self):
        self.set_value(random.randint(1,13))
        # THIS METHOD DOES NOT NEED TO CALL "set_value
        # IT SHOULD JUST SET THE self.__value ATTRIBUTE



    def set_value(self, value):
        self.value = value
        self.set_face_value()  # READ THE ASSIGNMENT - YOU DO NOT HAVE A
                               # SET FOR THE FACE VALUE

    # YOU SHOULD NOT HAVE ANY SUCH METHOD IN YOUR CLASS
    def set_face_value(self):
         faces = {1: "Ace", 2: "two", 3: "Three",  4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine", 10: "Ten", 11: "Jack", 12: "Queen", 13: "King"}
         self.face_value = faces[self.value]

    # YOU SHOULD HAVE A "find_face_value" METHOD THAT RETURNS THE FACE VALUE BASED ON THE VALUE OF THE
    # PRIVATE DATA ATTRIBUTE "__value"

    # THIS IS NOT CORRECT    
    def __str__(self):
        return self.face_value

这些是她的批评:

  • 您将在您的 Card 类中定义一个 deal 方法:此方法将处理一张卡片(使用随机数生成器)。
  • 您将定义一个find_face_value 方法,该方法将返回卡片对象的面值。您将从程序中删除 display_face_value 函数。
  • 您的deal_hand 函数会将对象列表传递给display_hand 函数和hand stats 函数,(从Card 类向函数发送5 张卡片)

所以,我的主要问题是执行 deal_hand 并显示 5 手,它会显示如下:

    The 5-card hand is: 
         Jack
         Three
         Queen
         Two
         Seven
    The average value of your hand is:
         7.0
    #Also it should display like this
    print("Your card is", card)

英语不是我的第一语言,所以我很难理解它真正想要什么。
这是他们要求的数据属性:

Class name:              Card
 Data attributes:        __value
 Methods:                __init__()
                         deal()
                         set_value()
                         get_value()
                         find_face_value()
                         __str__()

【问题讨论】:

  • 我得到的主要错误是:第 9 行,在交易中 self.value(random.randint(1,13)) AttributeError: 'Card' object has no attribute 'value'
  • 请将您的评论移到您的问题中。这是非常重要的信息。
  • 是的,请在您的问题中添加该错误,就像在第一段中一样。您需要说明激励错误是什么,人们对看起来像是发布整个班级定义并说“这不起作用”的事情皱眉 - 这不是你在这里所做的。我还做了一些修改,希望能提高清晰度。

标签: python python-3.x class playing-cards


【解决方案1】:

您似乎被要求以一种非常具体的方式执行此操作。 我也不认为这是一个好方法。 看起来您的老师在开始时使用 __ 调用字段私有,就好像它是一个 java 私有字段一样,请注意事实并非如此。在 python 中,如果你想使用 java 风格的 getter 和 setter,你应该使用 @property 注释器。 还有很多其他可以改进的地方,由于需求,我没有这样做,我希望这会有所帮助。

import random


class Card:
    def __init__(self):
        self.__value = 0

    def deal(self):
        self.__value = random.randint(1, 13)

    def set_value(self, value):
        self.__value = value

    def get_value(self):
        return self.__value

    def find_face_value(self):
        faces = {1: "Ace", 2: "two", 3: "Three", 4: "Four",
                 5: "Five", 6: "Six", 7: "Seven", 8: "Eight",
                 9: "Nine", 10: "Ten", 11: "Jack", 12: "Queen",
                 13: "King"}
        return faces[self.__value]

    def __str__(self):
        return self.find_face_value()


def main():
    card = Card()
    total = 0
    print("Your 5 hand card is:")
    for i in range(5):
        card.deal()
        print("Your card is", card)
        total += card.get_value()
    print("The average value of your hand is:")
    print(total/5)


main()

【讨论】:

  • 感谢您,您确实帮助我理解了这一点。把所有东西都拿到它只是很复杂。
  • 是的,老师正在推动一种过时的 Java 混合,应该使用 Python property,而不是 getter 和 setter。对于 OP 不得不忍受这种级别的指导,我感到很抱歉。
【解决方案2】:

我做的不一样,如果我理解正确的话,你假设发 5 张牌。

from random import *

suits = ["Clubs", "Diamonds", "Hearts", "Spades"]
values = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]
deck = []
for s in suits:
    for v in values:
        deck.append(v + " of " + s)

shuffle(deck)
hand = deck[:5]
print (hand)

你手中有五张不重复的牌用于输出。

【讨论】:

  • 是的,类似的东西,但我真的不需要西装。我需要在我的班级卡片上使用它并能够在其他程序中执行它。这就是为什么她让我们使用 Card Class 以便能够在每次需要时执行它。
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2020-08-20
  • 2019-12-11
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多