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.

"Das hat nicht funktioniert" - Können Sie das konkretisieren? Welches Verhalten werden Sie sehen, von Ihrem Programm und welches Verhalten erwarten Sie? Eine andere Sache, die manchmal hilft, ist zu versuchen, es zu Kochen nach unten, um einen sehr kleinen test-Programm, das Sie denken, sich Verhalten soll, eine bestimmte Art und Weise und stellen Sie sicher, dass Ihre mentale Modell der Sprache korrekt ist.
Auch, verwenden Sie Zeilenumbrüche zwischen Methoden, Funktionen und Klassen.

InformationsquelleAutor Simon Coppack | 2013-09-05

Schreibe einen Kommentar