Vorbei Instanz der Klasse einen Verweis auf Funktionen genannt, in der definition der Klasse in Python
Ich versuche zu machen, eine grundlegende Karte Spiel, und um zu verfolgen, wer am Zug ist, entschied ich mich für ein Spiel Klasse, jede Instanz ist ein separates Spiel. Dann, wenn die Spiel-Instanz wird initialisiert, es würde auch die Initialisierung der Spieler Objekte und deck und Karte Objekte und binden Sie an das Spiel-Objekt. Dazu habe ich versucht, passieren die Spiel-Objekt 'selbst', um die Funktionen, die Sie initialisieren die anderen Objekte, so dass Sie sich wieder auf das Spiel-Objekt.
Das hat nicht funktioniert. Edit: Fehlermeldung NameError: global name 'Spiel' ist nicht definiert
Ist die Idee völlig unmöglich/unmoralisch/der-Schlimmste-was-jemals oder ist es ein perfekt gangbarer Weg der Erreichung meiner Ziele, aber ich bin nur die Umsetzung falsch?
Der ganze code ist am Ende, aber eine cut-down-version, die hoffentlich veranschaulichen die Szenario---oder zumindest genug davon, um Antwort auf die Kernfrage--- - in einer weniger komplizierten Weise folgt:
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()
Und hier ist das ganze (noch unfertige) code, denn wenn das nicht genug Informationen:
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()
Dank für die Zeit nehmen, dies zu Lesen! Ich habe nicht viel getan, formale Kodierung Ausbildung/Praxis vor, so versuche ich, meinen Weg durch Python lernen durch Versuch-und-Fehler/PyDocs.
Auch, verwenden Sie Zeilenumbrüche zwischen Methoden, Funktionen und Klassen.
InformationsquelleAutor Simon Coppack | 2013-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind, was Sie tun sollten in Ordnung sein. In Ihrem
__init__
Methoden fürDeck
und undPlayer
speichern Sie den Verweis aufgame
Du nicht tun, im moment, so sehe ich nicht, wie würden Sie als spätere Referenz auf das Spiel.
Für die Instanz, in der Spieler
draw
Methode, die Sie tungame.lose()
. Werden mussself.game.lose()
nachdem Sie zugewiesen haben es selbst in der__init__
Methode.Es ist ein einfaches Missverständnis zu machen, wenn Sie heraus beginnen. Möchten Sie vielleicht, darüber zu Lesen, Python-scopes und namespaces: docs.python.org/2/tutorial/... um wirklich zu verstehen, was Los ist. Aber wenn Sie gerade erst anfangen, dann kann alles ein bisschen verwirrend! Es gibt keinen Sieg 🙂
InformationsquelleAutor aychedee