Python简单纸牌学习类游戏

2024-09-26 22:54:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个简单的纸牌游戏,以更好地理解面向对象编程和类。

游戏如下:一副牌中有两张牌。然后第三张牌被发了。如果第三张牌在前两张牌之间,则玩家获胜。如果第三张牌等于前两张牌中的任何一张,或者不在设定的范围内,则玩家会输。

这就是我目前所拥有的:

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

我在上课和面向对象编程上遇到了困难,我不确定这是否是一个好的开始,或者我下一步应该去哪里。其中大部分是通过阅读其他来源和例子而产生的。有谁能提供一些建议,告诉我还有哪些类可以用来运行我的游戏,以及这些类之间如何交互/继承?谢谢您。


Tags: self游戏forobjectinitvaluedef玩家
2条回答

这更多的是一个代码/方法审查。纸牌游戏是一种组合游戏,而不是继承游戏;Deck包含Cards,但它本身不是Card的一种类型,反之亦然。

我认为你在复制Card中的信息。只需存储套装和等级,然后使用__str__创建'x of y'。您还可以实现rich comparison methods

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

现在例如str(Card(13, 'Clubs')) == "King of Clubs"。这样就不会在card中复制rankvalue

接下来,我认为Deck应该将population生成合并到__init__;您可以为非标准组提供可选参数。我包含了两个实现;注释掉的版本是一个列表理解,使用itertools在一行中完成相同的工作。我还提供了一个从self.deck中选取n不同随机卡的函数。

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)

现在这个游戏很简单了;由于比较方法的缘故,你可以每手发三张牌,然后自然地(使用<)比较牌。

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.")

正如“托拜厄斯”在评论中所指出的+我的一些想法

class Deck(object):
    def __init__(self):
        self.deck = []
        self.dealt = [] #Prevents from dealing the same card

    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"
                else:
                    value = str(rank)

                self.deck.append(Card(value, suit))

    def deal(self):
        #Randomly select card
        remaining_cards = [card for card in self.deck if card not in self.dealt]
        card_index = random.randrange(0, len(remaining_cards)-1)
        card = remaining_cards[card_index]
        self.dealt.append(card)
        return card



    def shuffle(self):
        self.dealt = []

class Card(object):
    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit
        self.card = str(self.rank) + " " + str(self.suit)
    def __eq__(self, other):
        return self.rank == other.rank and self.suit == other.suit

def play():
    deck = Deck()
    card1 = deck.deal()
    card2 = deck.deal()
    card3 = deck.deal()

#And here you will compare the cards to see if the player wins or not. Not sure 
#what exact criterion you're using.

deck.shuffle() #And leave your deck nicely shuffled for next game

play()

Random documentation

我没有运行此代码,它可能包含错误。但这是你能做什么的例证。

相关问题 更多 >

    热门问题