Python关于函数类和类方法的问题



我对中间编程还很陌生,但已经玩了一段时间的代码。现在我正在做一个简单的纸牌游戏。这个问题是,我不确定在哪里使用我的函数,也不确定何时使它们成为类方法。

例如,这里有一个简单的功能,它向每个玩家发放5张牌(从预定义的列表中(,然后从包的顶部翻转一张牌(实际上都只是随机选择(。卡片作为项目列表(3个列表(返回。我还开设了一个名为";玩家";。

p1_hand = []
p2_hand = []
flip_card = []
def deal_deck():
count = 0
for i in range(0, 10, 1):
count += 1
if count % 2 == 0:
card = random.choice(deck)
p2_hand.append(card)
deck.remove(card)
else:
card = random.choice(deck)
p1_hand.append(card)
deck.remove(card)
if count == 10:
flip_card.append(random.choice(deck))
return p2_hand, p1_hand, flip_card

在这个例子中,这只是一个交易,所以我想知道为什么它需要是一个"的类方法;玩家"?可能是类";玩家";除了保持分数,跟踪谁在交易以及分数是多少之外,什么都没做?

简单地说,我很难将类理解为一个交互和预成型操作的对象,我创建了其他类,它们最终像一个迷你数据库一样工作,而不是在方法中使用太多复杂性。

设计类和对象是一门艺术。使用类的基本目的是隐藏信息。程序的其余部分不应该知道一副牌是如何实现的,这允许您在不重新设计整个程序的情况下更改实现。因此,您创建了一个Deck类,该类的所有数据都存储在内部,并且只向外部世界公开您想要使用deck执行的操作,如shuffledeal_cardPlayer类可能包括handscore,并具有添加另一张牌的功能,而Game对象(可能(可以协调将牌发到手中并触发游戏。

你的代码混合了所有这些。它必须知道一副牌是如何实现的,一只手是如何实现,一张牌是如何翻转的。

顺便说一句,为了逼真起见,你最好把牌组和发牌从顶部移开,而不是使用random.choice

我最初认为这太宽泛,但在为您写笔记时改变了主意。类是一种编程工具,其实现不会像您所要求的那样受到太多处理。互联网上有很多不错的纸牌游戏课程的例子。。。以及许多坏的。这项研究对你来说并不容易。

使用一个类来表示系统的一个单元(在这种情况下是一个纸牌游戏(,它是有凝聚力的(一组具有易于理解的边界的数据和功能(,并与其他单元或主程序交互。

在这种情况下,您有一个良好的开端:您已经将cardplayerhand标识为游戏系统中的实体。您可能希望将牌组视为hand实例(只是另一张牌列表(,或者由于游戏中的不同功能,您可能希望对其进行特殊处理。

我认为有用的类和函数包括:

Deck
The impartial source of cards
data
a list of cards
methods
reset -- shuffle all 52 cards into a list
deal(n) -- return a list of n cards
Hand
cards held by a single player
data
a list of cards
methods
reset -- whatever is needed to return the hand to a game-start state
draw(n) -- acquire n cards
play(n) -- play n cards to the game area

Card
A single card, containing all information needed to identify it to the game
data
suit
rank
methods
none
Player
Game information about each player
data
hand -- see Hand class above
game-role -- depending on the game, this could be "dealer", "idle", "active", ...
... other, depending on the game: points, money, etc.
methods
... very dependent on the game being played
Game
the overall monitor for the game
data
roster -- list of players
deck -- see Deck class above
... other, depending on the game: round, player to play next, etc.

其中一些有点重叠;Deck.deal;以及";手绘;。您面临的设计决策之一是选择哪个实体将驱动两个对象之间的交互。

至于实现,我确实建议您简化基本操作。对于桌子,通过生成具有嵌套列表理解的所有52张卡片进行初始化。shuffle牌组,然后使用列表切片发牌。例如,给每个玩家发5张牌:

def deal(n):
take = deck[:n]
deck = deck[n:]
return take
# elsewhere, to drive the initial dealing ...
for player in roster:
player.hand = deck.deal(5)

只需减少互动,以与你谈论游戏的方式相匹配:;给每个玩家发五张牌";代码中应该是这样的。埋葬每个班级的机械师。

最新更新