首页 > 解决方案 > 使用类和函数在 python 上创建纸牌游戏 - 编辑

问题描述

我正在学习 Python 编程,并且正在尝试制作一款流行的纸牌游戏。

我从骨架开始,所以我写了一些代码来创建牌组,发牌和洗牌。现在我想创建 2 个“拥有”手牌的玩家,他们最多可以保留 3 张牌,并且可以从牌组中“抽牌”。我想到了一个玩家类,其中定义了每个不同玩家的名称和手牌属性,但是当我尝试用 player1 抽牌时,它也将牌添加到 player2 的手上。我该如何更改它,以便将卡添加到玩家并且仅添加到他,然后将它们从牌组中移除?我的解决方案有什么问题?

输出:

['10 di Denari', '1 di Coppe']
['10 di Denari', '1 di Coppe', '6 di Denari', '5 di Denari']

你能帮我理解如何让它工作吗?

编辑:是的,我粘贴了错误的代码,这是我需要帮助的代码:

import random
semi = ['Bastoni','Spade','Coppe','Denari']
numeri = [1,2,3,4,5,6,7,8,9,10]
mazzo = []

for element in numeri:
    for seme in semi:
        carta = str(element) + ' di ' + seme
        mazzo.append(carta)
Rimanenti = len(mazzo)
def mischia():
    random.shuffle(mazzo)
class Giocatore:
    nome = None
    mano = []
    tola = []
    def __init__(self,nome):
        self.nome=nome

    def draw(q):
        for n in range(0, q):
            pesco = random.choice(mazzo)
             Giocatore.mano.append(pesco)
            mazzo.remove(pesco)

    def turno():
        Giocatore.draw('Toni',1)
        Giocatore.draw('Piero',1)
    def inizio():
        Giocatore.draw('Toni', 3)
        Giocatore.draw('Piero', 3)


class Piero(Giocatore):
    nome = 'Piero'

class Toni(Giocatore):
    nome = 'Toni'


Toni.draw(2)
print(Toni.mano)
Piero.draw(2)
print(Piero.mano)

另一个编辑:

谢谢大家的答案!现在我对整个事情有了更好的理解,我正在改写它!

标签: pythonclassplaying-cards

解决方案


您使用的课​​程不正确。创建一个 Player 类就像定义玩家身份,这就是成为纸牌游戏玩家的想法。您不能仅凭玩家的想法来玩纸牌游戏;你需要真正的球员来体现球员的身份。在编程方面,玩家将实例化Player 类。

您正在尝试使用类本身而不是类的实例来玩游戏。您需要实例化Giocatore两次(每个玩家一次)并使用实例。要实例化您需要执行以下操作:

player1 = Giocatore('Pietro')
player2 = Giocatore('Toni')

在底部,您Giocatore使用以玩家命名的新类进行了子类化。除非每个玩家具有不同的能力(即属性和/或方法),否则这是不必要的。它与实例化不同Giocatore

当我尝试用玩家 1 抽牌时,它也将牌添加到玩家 2 的手上……我该如何更改它,以便将牌添加到玩家并且只添加到他,将它们从牌组中移除?我的解决方案有什么问题?

有2个原因。首先,正如我在上面描述的那样,您正在使用类本身。但是即使你没有这样做,还有一个额外的问题是你已经将手设为mano属性而不是实例属性。这意味着所有实例都将共享该属性;因此所有玩家将分享完全相同的手牌。在draw方法中,Giocatore.mano.append(pesco)应该是self.mano.append(pesco). 这样一来,您将只将新卡放在该玩家的手上,而不是所有玩家共同共享的手。

要使手成为实例属性,您应该在内部定义它__init__。该方法应如下所示:

def __init__(self, nome):
    self.nome = nome
    self.mano = []

这里self指的是实例。

至于从卡组中取出卡牌,如果你一开始就已经随机使用了,那么在抽新卡时random.shuffle就不需要使用了。random.choice我建议只从列表中删除一个,如下所示:

def draw(self, n):
    for _ in range(n):
        self.mano.append(mazzo.pop())

推荐阅读