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上遇到了困难,我不确定这是一个好的开始,还是我应该去哪里.其中大部分是通过阅读其他来源和示例创建的.任何人都可以提供关于我可能想要运行我的游戏的其他课程的建议,以及这些课程如何与彼此互动/继承?谢谢.
这更多的是代码/方法审核.纸牌游戏是一种组合而非继承的案例; 的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".这样你就不会复制rank和value了card.
接下来,我认为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)