2016-03-24 2 views
0

次のコードは、Lukeという名の英雄を作成します。ルークは、彼が見つけた食物のテーブルからリンゴやハムを食べたいかどうかを選択する必要があります。Python:答えが正しくない場合にクラスを使用してプロンプトを再入力する

ユーザーが「apple」または「ham」を選択しない場合、「apple」または「ham」を選択するようにユーザーに再質問できるようにするにはどうすればよいですか?

私はクラス内でこれを行う方法を学びたいと思います。私は他の中でprintステートメントの下で何かする必要があるかのように感じますが、self.food()はstrが呼び出し可能でないというエラーにつながります。

class Hero(): 

    def __init__(self, name): 
     self.name = name 
     self.health = 100 
     self.food = raw_input("You encounter a table full of apples and ham. Which do you eat first? ") 

    def eat(self): 
     x = True 
     while x == True: 
      if (self.food == 'apple'): 
       self.health -= 100 
       print "%s has %d health points" % (self.name, self.health) 
       x = False 
      elif (self.food == 'ham'): 
       self.health += 20 
       print self.health 
       print "%s has %d health points" % (self.name, self.health) 
       x = False 
      else: 
       print "Incorrect. Please try again" 
       break 

char_1 = Hero("Luke") 
char_1.eat() 

編集:アレックスの助けを借りた後

変更。

class Hero(): 

    def __init__(self, name): 
     self.name = name 
     self.health = 100 

    def eat(self): 
     while self.health > 0: 
      food = raw_input("You encounter a table full of apples and ham. Which do you eat first? ") 
      if (food == 'apple'): 
       self.health -= 10 
       print "%s has %d health points" % (self.name, self.health) 
      elif (food == 'ham'): 
       self.health += 20 
       print self.health 
       print "%s has %d health points" % (self.name, self.health) 
      else: 
       print "Incorrect. Please try again" 


char_1 = Hero("Luke") 
char_1.eat() 

答えて

0

賢明な食品は初期化剤ではなく、eat方法で選択されることを保証するwhileループを置きます。 raw_inputは、そのループの内側にある必要があります。そのため、ユーザーは、正しい状態になるまで繰り返し食べ物を入れることができます。健康に関する論理は、eatメソッドに残ることができます。また、間違ったときにbreakにしたくない場合は、ループを継続したいので削除してください。しかし、x = Falseを設定する代わりに、breakを正しく取得すると、ループをwhile True: ...と書いて、xを完全に取り除くことができます。

ところで、まだxを使用していた場合、それはひどい変数名です。適切な命名が不可欠で、今すぐ正しい習慣を身につけてください。

while x == True:も冗長です。while x:と書くことができます。

+0

ありがとうアレックス! whileループがイニシャライザメソッドでどのように動作するのかは分かりませんでした。そのため、代わりに私のraw_inputステートメントをwhileの条件の下でeatメソッドで移動し、それが動作しました。 "x"変数名ポインタをありがとう。私は今夜​​練習していて、それについて本当に考えなかった。しかし、私は習慣に入るだろう! – staredecisis

関連する問題