【问题标题】:High low card game class comparisons高低牌类游戏比较
【发布时间】:2020-09-22 05:57:36
【问题描述】:

我对 Python 比较了解,但我决定使用类创建一个高低牌游戏。我已经完成了所有课程的设置和一切,但我遇到的唯一问题是当我尝试查看来自playerHand 的卡是大于还是小于来自nextCard 的卡时。 playerHandnextCard 都与类相关,我得到的错误是:TypeError: '>' not supported between instances of 'Person' and 'NextCard'

有 100% 是更好的方法来做到这一点,但这是我目前所得到的:

import random

class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def show(self):
        print ("{} of {}".format(self.value, self.suit))

class Deck(object):
    def __init__(self):
        self.cards = []
        self.build()

    def build(self):
        for suit in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for value in ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]:
                self.cards.append(Card(suit, value))

    def show(self):
        for card in self.cards:
            card.show()

    def shuffle(self):
        for n in range(len(self.cards)-1,0,-1):
            r = random.randint(0, n)
            self.cards[n], self.cards[r] = self.cards[r], self.cards[n]

    def drawCard(self):
        return self.cards.pop()

class Person(object):
    def __init__(self):
        self.hand = []

    def draw(self, deck):
        self.hand.append(deck.drawCard())
        return self

    def show(self):
        for card in self.hand:
            card.show()

class NextCard(object):
    def __init__(self):
        self.nextcard = []

    def draw(self, deck):
        self.nextcard.append(deck.drawCard())
        return self

    def show(self):
        for card1 in self.nextcard:
            card1.show()



deck = Deck()
deck.shuffle()

human = Person()
playerHand = human.draw(deck)

newcard = NextCard()
nextCard = newcard.draw(deck)



play = input("Do you want to play High/Low? Y or N? ")
while play.lower()== "y":
    card = playerHand
    print("The current card is: ", str(card.show()))
    guess = input("Guess H for high or L for low." )
    if guess.lower()=="h":
        if card > nextCard:
            print("Congratulations! You guessed correctly! The next card was ", card)
            play = input("Play again? Y or N? ")

        if card < nextCard:
            print("You lost! The next card was ", nextCard)
            play = input("Play again? Y or N? ")

    if guess.lower()=="l":
        if card > nextCard:
            print("You lost! The next card was ", nextCard)
            play = input("Play again? Y or N? ")

        if card < nextCard:
            print("Congratulations! You guessed correctly! The next card was ", nextCard)
else:
    print("The game is over.")

对于类之间比较问题的任何解决方案或变通方法将不胜感激。这是用 python 3 编码的。

【问题讨论】:

  • 你的课有卡的价值吗?然后你可以做if card.value &gt; nextcard.value(或通过getter函数等)你也可以让你的类具有可比性,比如this
  • 我有一个包含所有卡片花色和数值的套牌类,还有一个单独的卡片类,它只是结合了套牌类中的两个变量
  • 我认为您需要分享更多信息。如果我们无法重现您的问题,则无法为您提供帮助。尝试创建一个最小的可重现代码-sn-p。例如。你的问题可以归结为card &lt; nextCard抛出你提到的异常。
  • 您的问题是关于使用类的,这里没有一个类...我们能提供什么帮助?请提供minimal reproducible example。至少显示playerHandnextCard 是什么。顺便说一句,您应该遵循 PEP-8 的 names_with_under_scores 而不是类似 Java 的 CamelCase。所以应该是player_handnext_card
  • 从错误消息playerHand 必须是类Person 的实例,所以声明card = playerHand 没有意义。如果不查看类定义(可能还有程序中的其他逻辑),就不可能进一步帮助您。

标签: python python-3.x


【解决方案1】:

这些是 playerHand 和 nextCard 类吗?

要使用

但那是高级python

这里的错误可能是你没有创建类的对象

你只是给 playerHand 类起别名

让它成为一个对象

card = playerHand()

但它不会解决问题(可能)

请给我看一下课程的内部情况(简要编辑您的问题)

【讨论】:

  • 我粘贴了上面的项目。
【解决方案2】:

现在考虑一下大佬们是如何做到的

在您要比较的类中添加 运算符重载

对于__lt__()方法

for > 在你的类中添加一个__gt__() 方法

那些__lt__()__gt__() 会做操作符的重载

**(重载意味着自定义使用的编程运算符)**

在您的代码中,您需要将它们添加到 class Cardclass Person

class Card(object):
    def __init__(self, suit, value):
        self.suit = suit
        self.value = value

    def __gt__(self, comparing_card):
        # result is gonna be a boolean value
        # the ace jack qween king will need some comparing basis
        # work on it
        result = self.value > comparing_card.value
        return result

    def __lt__(self, comparing_card):
        result = self.value < comparing_card.value
        return result

    def show(self):
        print ("{} of {}".format(self.value, self.suit))

和另一个班级

class Person(object):
    def __init__(self):
        self.hand = []

    def __gt__(self, comparing_obj):
        # result is gonna be a boolean value
        result = self.hand[-1] > comparing_obj.nextcard[-1]
        return result

     def __lt__(self, comparing_obj):
        # result is gonna be a boolean value
        result = self.hand[-1] < comparing_obj.nextcard[-1]
        return result

    def draw(self, deck):
        self.hand.append(deck.drawCard())
        return self

    def show(self):
        for card in self.hand:
            card.show()

这是您比较班级的最后一个片段

    # here we need oparator overloading
    # this initially means '> sign' will call card.__gt__(nextCard)
    # > sign will call card's ___gt__ method and pass nextCard as a parameter
    # ___gt__(nextCard) returns a boolean value that we feed to the if statement down there

    if card > nextCard:
        # in here the print shows the class node
        print("Congratulations! You guessed correctly! The next card was ", card)
        #  change card to card.show()
        play = input("Play again? Y or N? ")

这是一个非常深奥的话题(如果它很难理解的话)和中级的 python 东西。你可以尝试一些网上的东西来简要了解一下。

试试这个极客教程:

https://www.geeksforgeeks.org/operator-overloading-in-python/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多