2016-11-08 8 views
-1

ちょっとした質問、tl;下のdr。Pythonのテキストアドベンチャー - ゲーム世界と相互作用するアイテム

ここはPython初心者です。私はそのようながこのテキストの冒険の世界と対話するために項目を取得しようとしています。私はアイテムと貿易アイテムをピックアップするようにプレーヤーを得ることができますが、私は世界と交流するアイテムを手に入れることができません。私の目標:部屋がプレイヤーが続行するためにアイテムを要求すること。現在のところ、別のテキストを表示するだけではなく、「セルがロックされています。キーを見つけてください!」という複雑な操作は必要ありません。在庫なしのキーなしで、「あなたはセルをロック解除しました!」インベントリのキーを使って最終的に私はプレーヤーの入力が必要になります。私はこれが単純な "if item in inventory"ステートメントで実行できることを知っていますが、動作していないようです。

部屋のために私のコード:

class GoalCell(MapTile): 

    def __init__(self, x, y): 
     self.item = items.CellKey() 
     self.have_key = False 
     super().__init__(x, y) 

    def modify_player(self, player): 
     if self.item in player.inventory: 
      self.have_key = True 
      player.inventory.remove(self.item) 
      print("Key used.") #I tried using this to see if this function was even running. Alas, it is not, and the statement does not show up. 

    def intro_text(self): 
     if self.have_key: 
      return "\nYou unlock the cell with your key. Congratulations, you freed your uncle and won the game!" 
     else: 
      return "\nYou enter the cell of your derelict uncle. 'Hey, kid,' he rasps, 'you gotta get me out of here.' The key has to be here somewhere..." 

(編集済み)私の謝罪、上記のコードはエラーを返しません - それは単に動作しません。表示されているのは、たとえキーがプレーヤーの在庫に入っていても、「あなたは孤立したおじさんのセルに入る」というテキストです。

class Player: 
    def __init__(self): 
      self.inventory = [items.Fists(), 
           items.CellKey()] 
      self.x = world.start_tile_location[0] 
      self.y = world.start_tile_location[1] 
      self.hp = 100 
      self.money = 0 
      self.victory = False 

私がメインのゲームコードに次の行を持っているので、総額は問題ではありません:プレーヤークラスが参照されて

player = Player() 

そして私は「player.inventoryを使用する他の部屋を持っていますアイテムがそれを拾って、された後

class FindWeaponTile(MapTile): 
    def __init__(self, x, y): 
     self.item = items.BrassKnuckles() 
     self.item_claimed = False 
     super().__init__(x, y) 

    def modify_player(self, player): 
     if not self.item_claimed: 
      self.item_claimed = True 
      player.inventory.append(self.item) 
      print("Weapon added.") 

    def intro_text(self): 
     if self.item_claimed: 
      return "\nAn empty area of the rec yard. Nowhere to turn but back the way you came." 
     else: 
      return "\nYou spot some brass knuckles on the ground!" 

このコードは、/の前に正しいテキストが表示されます。「コール以下の非常によく似たコードのように、うまくそれらの作品(アイテムなどを削除するには、項目を追加します) apアイテムをプレーヤーの在庫に問題なく保留します。

最終的に私はより複雑な「ロック・アンド・キー」のパズルを使ってゲームを作りたいと思います。この単純な例はできません。すべての助けをいただければ幸いです。

Tl; dr私の部屋には、「刑務所の細胞がロックされています。鍵はどこかにあるはずです...」というようなものが表示されます。プレイヤーがキーを持っているときは、「あなたはセルをロック解除しました!または何でも。インベントリ内のアイテムの場合は試してみてください。挫折した。お願いします。助けて。

編集: 申し訳ありませんが、これは役に立ちます。メインのゲーム機能:

def play(): 
    print("Welcome to the Delaware County Correctional Facility!") 
    world.parse_world_dsl() 
    player = Player() 
    while player.is_alive() and not player.victory: 
     room = world.tile_at(player.x, player.y) 
     print(room.intro_text()) 
     room.modify_player(player) 
     if player.is_alive() and not player.victory: 
      choose_action(room, player) 
     elif not player.is_alive(): 
      print("The inmates got the best of you! Game over!") 

編集: ごめんなさい、私が上に表示されているコードは私にエラーを与えるものではありませんので、私は元の質問を編集しました。私の間違いは間違いありません。そのエラーは処理されました。私の問題は、コードのフラットアウトが私の望むように機能しないということです。それが返すのは、プレーヤーがキーを持っていないとき(たとえそうであっても)のイントロテキストです。それは私がFindWeaponTile()のコードに正しく動作するように似ています。

+0

ここで/あなたは 'modify_player'をどのように呼びますか? –

+0

'Player' * module *には在庫がありません。 'Player' *オブジェクト*はそうです。あるいは、私は "フジツボの負荷"が何を意味するのか誤解しているかもしれません。 –

+0

さて、あなたの問題は非常に明白です。呼び出すと思われるメソッドはありません。 'print'トラッキングを続け、' print( "key used") 'コールから戻ってきて、間違っているものが見つかるでしょう。 –

答えて

0

items.CellKey()自体を使用する代わりに、名前属性(文字列)にアクセスして機能しました。あなたの助けをありがとう!

関連する問題