0

I'm relatively new to python but think I have a decent enough understanding, except for (apparently) the correct way to use the "import" statement. I assume that's the problem, but I don't know.

I have

from player import player

def initializeGame():
    player1 = player()
    player1.shuffleDeck()
    player2 = player()
    player2.shuffleDeck()

and

from deck import deck

class player(object):
    def __init__(self):
        self.hand = []
        self.deck = deck()

    def drawCard(self):
        c = self.deck.cards
        cardDrawn = c.pop(0)
        self.hand.append(cardDrawn)

    def shuffleDeck(self):
        from random import shuffle
        shuffle(self.deck.cards)

But when i try to initializeGame() it says "player1 has not been defined" and I'm not really sure why. In that same file if I just use "player1 = player()" then it woks perfectly fine but it refuses to work inside of a function. Any help?

EDIT: ADDING THINGS THAT WEREN'T INCLUDED BEFORE

class deck(object):
    def __init__(self):
        self.cards = []

    def viewLibrary(self):
        for x in self.cards:
            print(x.name)

    def viewNumberOfCards(self, cardsToView):
        for x in self.cards[:cardsToView]:
            print(x.name)


from deck import deck

class player(object):
    def __init__(self):
        self.hand = []
        self.deck = deck()

    def drawCard(self):
        c = self.deck.cards
        cardDrawn = c.pop(0)
        self.hand.append(cardDrawn)

    def shuffleDeck(self):
        from random import shuffle
        shuffle(self.deck.cards)

and the traceback error is

player1.deck.cards

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    player1.deck.cards
NameError: name 'player1' is not defined
4

2 に答える 2

6
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    player1.deck.cards
NameError: name 'player1' is not defined

これは、エラーがスローされた行を示していますplayer1.deck.cards。この行はあなたが私たちに与えたコードに含まれていないので、私たちはあなたが例外を取得する理由についてのみ推測することができます。

ただし、スクリプトは次のようになっている可能性があります。

initializeGame()

# and then do something with
player1.deck.cards

player1ただし、これは機能しません。これは、関数player2内のローカル変数にすぎないためinitializeGameです。関数が返すとすぐに、それらへの参照は残りなくなり、ガベージコレクションが保留されている可能性があります。

したがって、これらのオブジェクトにアクセスする場合は、それらが存在することを確認する必要があります。initializeGameこれを行うには、変数をグローバルに設定するか、関数から変数を返すだけです。

def initializeGame():
    player1 = player()
    player1.shuffleDeck()
    player2 = player()
    player2.shuffleDeck()
    return player1, player2

次に、次のように呼び出すことができます。

player1, player2 = initializeGame()

そして、作成されたオブジェクトへのローカル参照があります。

または、さらに良いことに、プレーヤーがインスタンス変数であるゲーム全体を表すオブジェクトを作成します。

class Game:
    def __init__ (self):
        self.player1 = player()
        self.player1.shuffleDeck()
        self.player2 = player()
        self.player2.shuffleDeck()

次に、インスタンスを作成し、またはGameを使用してプレーヤーにアクセスできます。そしてもちろん、ゲーム自体のオブジェクトを持つことで、ゲームに関連する多くの機能をオブジェクトにカプセル化することもできます。game.player1game.player2

于 2012-12-03T15:57:19.867 に答える
4

player1を参照しているコードは関数の外にあると思います。関数内で定義された変数はその関数に対してローカルであり、関数呼び出しが終了すると破棄されます。

player1とplayer2をグローバル変数として宣言するか、すべてをクラスでラップして、それらをクラスインスタンスの属性にする必要があります。

于 2012-12-03T15:50:55.190 に答える