python - 使用类和函数在 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)
另一个编辑:
谢谢大家的答案!现在我对整个事情有了更好的理解,我正在改写它!
解决方案
您使用的课程不正确。创建一个 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())
推荐阅读
- android - 构建失败,出现异常
- reactjs - redux 状态变化时如何导航?
- java - WifiInfo getSSID 在断开连接时返回最后一个 SSID
- angular7 - 有条件地以角度更改 owl-date-time 选择器的日期格式
- css - 文本溢出省略号
不起作用 --> Shadow-Dom-Element 不占用父宽度 - android - 如何修复:Flutter 中的物理设备上不显示图像背景
- php - 我如何在 Symfony 中设置 API-Platform 的配置以加载我的 resources.xml
- google-sheets - 重复 N1:Nx 行 Y1:Yx 次?
- python - Tensorflow 数据集 API 是否完全摆脱了 feed_dict 参数?
- asp.net-core - 优化 API 的响应时间,涉及 SQL Server