【问题标题】:Python Game "House of Cards" help neededPython 游戏“纸牌屋”需要帮助
【发布时间】:2014-07-25 18:41:48
【问题描述】:

我目前是 python 新手,正在使用 python 来创建一些游戏。我写了一个游戏“纸牌屋”,基本上我正在尝试使用我在 OOP 中学到的东西来完成它。规则很简单——你需要最大的牌才能赢。玩家将首先比较数字,然后是卡片的花色——拥有最大卡片的人获胜。我写了以下代码:

import itertools
import random

class Card (object):
    def __init__ (self):
        self.suit = ["Cubs", "Diamonds", "Hearts", "Spades"]
        self.value = ["2","3","4","5","6","7","8","9","10", "J", "Q", "K", "A"]
        self.deck = []
        for card in itertools.product(self.value, self.suit):
            self.deck.append(card)

class Player(object):
    def __init__ (self, name, card = None):
        self.name = name
        self.carddeck = Card()
        self.card_available = self.carddeck.deck
    def draw_a_card(self):
        self.card = random.choice(self.card_available)
        print "%s has gotten a %s" %(self.name, self.card)
    def __cmp__(self, other):
        if self.card_available.index(self.card) > self.card_available.index(other.card):
            print "%s wins!" %(self.name)
        elif self.card_available.index(self.card) < self.card_available.index(other.card):
            print "%s wins!" %(other.name)

player_1= Player("Player 1")
player_2 = Player("Player 2")
player_3 = Player("Player 3")
player_1.draw_a_card()
player_2.draw_a_card()
player_3.draw_a_card()
cards_deck = Card()
player_1.__cmp__(player_2)

经过一番努力,我已经成功比较了玩家 1 和 2 的牌,但我不知道如何将玩家 3 纳入比较中。

【问题讨论】:

  • 按照您的实现方式,您必须进行两次单独的比较:player_1 到 player_2,正如您所做的那样,以及与 player_3 比较的获胜者。
  • 您可以最大化、排序或简单地使用多个 > 来检查谁获胜。
  • @njzk2 看看他的覆盖函数...
  • 奇怪,源中没有提到Frank Underwood!
  • @JoranBeasley:不完全是。使用random.choice 选择卡片,它会随机选择一张卡片。然而,我会先洗牌,然后出牌

标签: python oop object comparison


【解决方案1】:

cmp 函数用于覆盖比较,因此您可以执行类似的操作

if player1 &gt; player2: print "Player1 beat player2!"

不是这样你就可以在函数内打印一些消息......通过不返回任何你本质上说它们相等的东西(我认为在 python 中不从 cmp 返回任何东西大致相当于返回 0),或者更糟糕的是可能提高如果您尝试正常比较,则会出现错误...

class Player(object):
    def __init__ (self, name, card = None):
        self.name = name
        self.carddeck = Card()
        self.card_available = self.carddeck.deck
    def draw_a_card(self):
        self.card = random.choice(self.card_available)
        print "%s has gotten a %s" %(self.name, self.card)
    def __cmp__(self, other):
        if self.card_available.index(self.card) > self.card_available.index(other.card):
            return 1
        elif self.card_available.index(self.card) < self.card_available.index(other.card):
            return -1
        return 0

print max([player1,player2,player3]), "Wins!" 
print min([player1,player2,player3]), "Loses!!!" 

是最简单的方法...

您确实在这里遗漏了 OOP 设计的几个方面

class Card:
    def __init__(self,val,suite):
        self.val = val
        self.suite = suite
    def __int__(self):
        return self.val
    def __str__(self):
         card_name = ["2","3","4","5","6","7","8","9","10", "J", "Q", "K", "A"][self.val]
         suite_name = ["Clubs","Spades","Diamonds","Hearts"][self.suite]
         return card_name + " of " + suite_name
    def __cmp__(self,other):
         return cmp(int(self),int(other))

print Card(1,3)
print Card(4,2) < Card(3,2)

请注意,卡片与套牌无关......它属于套牌

deck = [Card(i,j) for i in range(13) for j in range(4)]
random.shuffle(deck.shuffle)

【讨论】:

    【解决方案2】:

    正如 Joran 所说,.__cmp__() 是一个运算符重载函数,因此您可以只调用player1 &gt; player2 而不是player_1.__cmp__(player_2),您还可以将玩家存储在一个列表中,并在每回合后对列表进行排序。您仍然可以以正常方式引用玩家。例如:

    player_1= Player("Player 1")
    player_2 = Player("Player 2")
    player_3 = Player("Player 3")
    exampleList = [player1,player2,player3]
    player_1.draw_a_card()
    player_2.draw_a_card()
    player_3.draw_a_card()
    exampleList.sort()
    winner = exampleList[0]
    

    有关列表排序的更多信息:https://wiki.python.org/moin/HowTo/Sorting

    【讨论】:

    • @Joran 实际上 __cmp__() 应该返回 -1,0,1。反正他不是很坚持,还可以用sorted() 比如:sorted(exampleList, key=lambda player: player.card_available.index(self.card))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多