我正在尝试制作一个基本的纸牌游戏,为了跟踪轮到谁,我决定制作一个游戏类,每个实例都是一个单独的游戏。然后,当游戏实例初始化时,它还会初始化玩家对象和牌组和牌对象,并将它们绑定到该游戏对象。为此,我尝试将游戏对象'self'传递给初始化其他对象的函数,以便它们可以引用回游戏对象。
这没效果。 编辑:错误是NameError:全局名称'游戏'未定义
这个想法是完全不可能/不道德/最糟糕的事情,还是完全可行的实现目标的方法,但我只是错误地实施它?
整个代码都在最后,但是一个简化的版本,希望能够以一种不那么复杂的方式说明这个场景 - 或至少足以回答核心问题 -
from collections import deque
from random import shuffle
DECK = {"value_range": (1, 6),
"black_multiple": 2,
"red_multiple": 2,
"dead": 12}
class Game:
"""A game instance."""
def __init__(self, deck=DECK):
self.deck = Deck(self, **deck)
self.deck.shuffle()
class Deck:
def __init__(self, game, value_range, black_multiple, red_multiple, dead):
self.deck = deque()
for value in range(*value_range):
for i in range(black_multiple):
self.deck.append(Card(game, value, "Black"))
for i in range(red_multiple):
self.deck.append(Card(game, value, "Red"))
for i in range(dead):
self.deck.append(Card(game))
def shuffle(self):
shuffle(self.deck)
def draw(self):
return self.deck.popleft()
这是完整的(未完成的)代码,如果这还不够信息:
from collections import deque
from random import shuffle
DECK = {"value_range": (1, 6),
"black_multiple": 2,
"red_multiple": 2,
"dead": 12}
class Game:
"""A game instance."""
def __init__(self, player_names=["Simon", "Will"], start_cards=2,
deck=DECK):
self.deck = Deck(self, **deck)
self.deck.shuffle()
self.players = deque()
for name in player_names:
self.players.append(Player(self, name))
for player in self.players:
player.draw(start_cards)
def lose(self, player):
# print(player.name + "loses.")
pass
def new_turn(self):
self.players.rotate(-1)
def get_active(self):
return self.players[0]
def get_passive(self):
return list(self.players)[1:]
class Card:
"""A card instance.
Black cards get an extra method! Dead cards have value and colour False."""
def __init__(self, game, value=False, colour=False):
self.value = value
self.colour = colour
def get_value(self):
return self.value
def get_colour(self):
return self.colour
if self.colour == "Black":
def action(self, target):
active = game.get_active()
responders = game.get_passive()
for responder in responders:
if responder.respond(self.value) == False:
continue
else:
if target == active:
target = responder
else:
target = active
break
target.draw(self.value)
class Player:
def __init__(self, game, name):
self.name = name
self.hand = {}
def draw(self, value):
for i in range(value):
try:
draw_card = game.deck.draw()
except IndexError:
game.lose(self)
break
else:
self.hand.append(draw_card)
continue
def get_hand(self):
return self.hand
class Deck:
def __init__(self, game, value_range, black_multiple, red_multiple, dead):
self.deck = deque()
for value in range(*value_range):
for i in range(black_multiple):
self.deck.append(Card(game, value, "Black"))
for i in range(red_multiple):
self.deck.append(Card(game, value, "Red"))
for i in range(dead):
self.deck.append(Card(game))
def shuffle(self):
shuffle(self.deck)
def draw(self):
return self.deck.popleft()
感谢您花时间阅读本文!我之前没有做过很多正式的编码培训/练习,所以我试图通过试错法/ PyDocs来学习Python。
答案 0 :(得分:2)
你在做什么应该没事。在__init__
和Deck
的{{1}}方法中,您应该将引用存储到Player
game
你现在没有这样做,所以我看不出你以后如何引用游戏。
例如,在玩家的def __init__(self, game, *args):
self.game = game
方法中,您执行draw
。在game.lose()
方法中将其分配给self后,需要self.game.lose()
。