Я думаю, что основная проблема в том, что вы неправильно понимаете разницу между переменными класса и переменными экземпляра. Я буду использовать простой пример:
class Player():
hand = [] # hand is a class variable, as it is not tied to an instance
p1 = Player() # p1 is an instance of Player
p2 = Player() # p2 is a separate instance of Player()
Теперь, если я добавлю что-то к руке p1
:
p1.hand.append(1)
p2.hand
# [1]
Это потому, что я определил hand
на уровне class , и поэтому p1.hand
и p2.hand
действительно Player.hand
. Чтобы изменить это, вам нужно, чтобы hand
был присоединен к экземпляру, используя self.hand
и метод __init__
dunder, который действует как конструктор для экземпляров класса.
class Player():
def __init__(self): # self is always passed as the first argument
self.hand = []
p1 = Player()
p2 = Player()
Теперь p1.hand
- это совершенно другой объект, чем p2.hand
, потому что они были созданы при каждом вызове __init__
. Теперь, если я добавлю что-то к p1.hand
:
p1.hand.append(1)
p1.hand
# [1]
p2.hand
# []
Они оба не изменены. Теперь коснемся функций класса. По умолчанию функции в классах имеют уровень экземпляра, что означает, что self
, или класс instance , будет неявно передан в качестве первого аргумента. Если у вас нет места для self
, вы получите ошибки:
class A():
def a():
print("did something")
inst = A()
a.a()
# TypeError: a() takes 0 positional arguments but 1 was given
# To fix this
class A():
def a(self):
print("did something")
inst = A()
a.a()
# did something
Программа
К счастью, вы определили, что нужно для правильной работы этой программы, двух игроков, колоды карт и механизма по очереди. Поскольку вы используете random.choice
для выбора карт, я бы сказал, что вам на самом деле не нужна функция, чтобы перетасовать колоду. Вы можете получить карту, выбрав случайную карту, как вы делали раньше:
semi = ['Bastoni','Spade','Coppe','Denari']
numeri = [1,2,3,4,5,6,7,8,9,10]
mazzo = ['%d di %s' % (element, seme) for seme in semi for element in numeri]
Чтобы нарисовать карту, вы можете использовать следующее:
# Use random.choice as you've done before
idx = random.coice(mazzo)
mazzo.remove(drawn_card)
Метод класса remove
удалит значение из списка. В паре с вашим class.hand
подходом:
Toni = Player()
Toni.hand.append(drawn_card)
Или, как метод в классе Player
:
class Player():
def __init__(self):
self.hand = []
def draw(self):
# Need to convert set to list to choose
drawn_card = random.choice(mazzo)
mazzo.remove(drawn_card)
self.hand.append(drawn_card)
print(self.hand) # If you want to see the hand
toni = Player()
toni.draw()
# ['8 di Spade']
Хотя вы можете считать это немного многословным. Если вы хотите сохранить свой метод перемешивания, вы можете каждый раз перетасовывать колоду и использовать pop
, чтобы взять случайную карту, как @ibonyun предложил