2017-10-05 2 views
-2

私はテキストベースのRPGに取り組んでおり、コーディングにはかなり新しく、1ヵ月ほど前にPythonを学んだので、誰かが救命救助者になることができれば助けになるでしょう。私のピクルされたオブジェクトが復元されないのはなぜですか?

ゲームを保存して読み込むと、デフォルトのプレーヤの統計情報が読み込まれます。どのようにして統計の増加がロードされ、私のポーションとゴールドもデフォルトにリセットされます。

class Player: 
    name = "Razor" 
    atkl = 15 
    atkh = 20 
    magic_light_slashl = 20 
    magic_light_slashh = 25 
    magic_fireballl = 40 
    magic_fireballh = 48 
    magic_lightningl = 55 
    magic_lightningh = 65 
    maxhp = 50 
    hp = 50 
    maxap = 10 
    ap = 10 
    exp = 0 
    level = 1 
    gold = 20 
    potions = 0 
    great_potions = 0 
    max_potions = 0 
    elixers = 0 
    great_elixers = 0 
    max_elixers = 0 

def save(): 
    player = Player 
    level_state = Player.level 
    with open('savefile', 'wb') as f: 
     pickle.dump([player, level_state], f, protocol=2) 
     print("Game has been saved.") 
     start_up() 

def load(): 
    if os.path.exists('savefile') == True: 
     with open('savefile', 'rb') as f: 
      player, level_state = pickle.load(f) 
      print("Loaded save state.") 
      start_up() 
    else: 
     print("Could not find save file.") 
     main() 

ここで私はレベルアップしています。

def level_up(): 
    if Player.level == 1: 
     if Player.exp >= 30 and Player.exp < 80: 
      print("You are level 2") 
      Player.level = 2 
      Player.atkl = 17 
      Player.atkh = 22 
      Player.magic_light_slashl = 23 
      Player.magic_light_slashh = 27 
      Player.maxhp = 53 
      Player.hp = 53 
      Player.maxap = 12 
      Player.ap = 12 

私のコードをもっと必要としたら、私に聞いてみてください。

+0

修正したいエラーを再現する[MCVE](https://stackoverflow.com/help/mcve)を含めてください。おそらく、現在行っているように* class *プロパティの代わりに* instance *プロパティを使用しているはずです。 –

+1

私たちはあなたのコードをもっと必要としません。あなたの問題を明らかにするコードの最小量。また、あなたの問題が何であるかを明確にするのに役立ちます。おそらく(おそらくこのケースでは)あなた自身でそれを解決するでしょう。 –

答えて

3

あなたはクラスの仕組みを誤解しています。インスタンスレベルのプロパティではなく、クラスレベルのプロパティを使用しているため、正しくピクルされません。基本的にクラスをあたかもそれが辞書であるかのように扱っています。それは基本的にはどのように動作するかではありません。

クラスを作成すると、クラスが青写真のように動作します。車のための青写真は、多くの車の "インスタンス"を作成するために使用することができますが、青写真は車そのものではありません。

したがって、Playerクラスからインスタンスを取得するには、そのインスタンスを「インスタンス化」する必要があります。後に括弧()の名前でクラスを呼び出すと、これが実行されます。かっこはPythonに対して、あなたのクラス内に__init__()と定義されているクラスのコンストラクタを呼び出すことを示しています。あなたのクラスにはコンストラクタがありませんので、最初に定義する必要があります。

class Player: 
    def __init__(self): 
     # this is the constructor 

     # let's add some instance-level properties 
     self.name = 'Razor' 
     # you can add the rest of your properties here as long as they being with self 

     print 'I am a new instance of the player class, my name is ' + self.name 

あなたはその後、(私たちのメッセージは、建設中に印刷されることに注意)、これをインスタンス化し、このような変数にインスタンスを保存することができます

player = Player() 

あなたは、そのインスタンス

上のプロパティにアクセスすることができます
print player.name 

それとも、彼らに

player.name = 'Blade' 
print player.name 
# prints 'Blade' 
を変更することができます

このインスタンシエーションが有用で重要な理由は、「プレイヤー」(または文字や敵など)を必要な数だけ作成でき、すべてが独自のプロパティを保持できることです。 selfは、クラス自体ではなく、インスタンスと話していることを明確に示しています。

関連する問題