Python简单的纸牌游戏来学习课程

pez*_*pez 3 python oop class python-2.7

我正在尝试创建一个简单的纸牌游戏,以更好地了解OOP和类.

游戏如下:从牌组发出两张牌.然后发出第三张牌.如果第三张牌位于前两张牌之间,则玩家获胜.如果第三张牌等于前两张牌中的任何一张,或者在该牌组之外,则该牌手输了.

这是我到目前为止:

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

    def PopulateDeck(self):
        suits = ["Hearts", "Diamonds", "Clubs", "Spades"]
        for suit in suits:
            for rank in range(2, 15):
                if rank == 11:
                    value = "Jack"
                elif rank == 12:
                    value = "Queen"
                elif rank == 13:
                    value = "King"
                elif rank == 14:
                    value = "Ace"

                self.deck.append(str(value) + " of " + suit)

class Card(object):
    def __init__(self, rank, value):
        self.rank = rank
        self.value = value
        self.card = self.rank + self.value
Run Code Online (Sandbox Code Playgroud)

我在课堂和OOP上遇到了困难,我不确定这是一个好的开始,还是我应该去哪里.其中大部分是通过阅读其他来源和示例创建的.任何人都可以提供关于我可能想要运行我的游戏的其他课程的建议,以及这些课程如何与彼此互动/继承?谢谢.

jon*_*rpe 9

这更多的是代码/方法审核.纸牌游戏是一种组合而非继承的案例; 的Deck含有CardS,但本身不是一种类型的Card,并且反之亦然.

我认为你正在重复信息Card.只需存储套装和等级,并用于__str__创建'x of y'.您还可以实现丰富的比较方法:

class Card(object):

    FACES = {11: 'Jack', 12: 'Queen', 13: 'King', 14: 'Ace'}

    def __init__(self, rank, suit):
        self.suit = suit
        self.rank = rank

    def __str__(self):
        value = self.FACES.get(self.rank, self.rank)
        return "{0} of {1}".format(value, self.suit)

    def __lt__(self, other):
        return self.rank < other.rank
Run Code Online (Sandbox Code Playgroud)

现在例如str(Card(13, 'Clubs')) == "King of Clubs".这样你就不会复制rankvaluecard.

接下来,我认为Deck应该将人口生成纳入其中__init__; 您可以为非标准套牌提供可选参数.我已经包含了两个实现; 注释掉的版本是一个列表理解,itertools用于在一行中完成相同的工作.我还提供了从中选择n不同随机卡的功能self.deck.

from itertools import product 
import random

class Deck(object):

    def __init__(self, ranks=None, suits=None):
        if ranks is None:
            ranks = range(2, 15)
        if suits is None:
            suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
##        self.deck = [Card(r, s) for r, s in product(ranks, suits)]
        self.deck = []
        for r in ranks:
            for s in suits:
                self.deck.append(Card(r, s))

    def deal(self, n):
        return random.sample(self.deck, n)
Run Code Online (Sandbox Code Playgroud)

现在游戏很简单; 你可以每手处理三张牌,并且<由于比较方法,自然地比较牌(使用例如).

deck = Deck()
hand = deck.deal(3)
print(" - ".join(map(str, hand)))
if min(hand[0], hand[1]) < hand[2] < max(hand[0], hand[1]):
    print("Winner!")
else:
    print("Loser.")
Run Code Online (Sandbox Code Playgroud)

  • @Andrey这是相当简单的; 如果OP想要学习Python OOP,那么掌握魔术方法至关重要. (3认同)