2017-08-17 10 views
-1

私は過去数ヶ月にわたって、自分自身でPythonを教えるプロジェクトとしてテキストベースのZorkスタイルのゲームを作成しようとしてきました。dictインベントリ内のアイテムを検索するときのKeyError

私はここstackoverflowとたくさんのYouTubeビデオの素晴らしい人たちのおかげで、まともな進歩を遂げました。私が現在扱っている問題は、Bagクラスのコードの最後です。 私のバッグのクラスでは以下のように、Takeというメソッドがあります。このメソッドはもともとバッグクラス内にはなく、ユーザーコマンドを読み取る下部のセクションにありました。

ユーザーコマンドのロジックを他のゲームから切り離して、指定したクラスに移動することをお勧めしました。

しかし私がこれをする前は、部屋の在庫から特定のアイテムだけを取り上げても問題ありませんでした。今それはすべてを拾う。

は現在、私の部屋の唯一の1つ以上の項目が含まれています(コードは、各部屋には、私は別のの.pyファイルからインポートされてきた最下部に掲載されます定義します)。 "Ornate_Key"と "Knife"を含む "inside cottage"ルーム。

ここには奇妙なことがあります。私がOrnate_Keyを取ろうとすると、それは上手くそれを拾います(また、ナイフをピックアップします)。私はナイフを取るしようとした場合

はしかし、私は、このコードをいじり古いバージョンに戻って、この電流1の比較約6時間を費やしてきた

Traceback (most recent call last): 
    File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 156, in <module> 
    bag.CheckTake() 
    File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 130, in CheckTake 
    self.Take(command) 
    File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 122, in Take 
    if Location.room.roominv[key].name == command.split()[1]: 
KeyError: 'Ornate_Key' 

このトレースバックとエラーが表示されますなぜ私はこの問題にぶつかっていなかったのですか。そして、なぜこれが突然起きたのか理解できません。

私は一般的にコーディングするのがとても新しいので、私はアーキテクチャ/物事の基本について非常に曖昧です。誰もがこの問題の原因を何か考えているのですか?

このページの最後に、この問題が発生していない古いバージョンのコードセクションを掲載します。

この投稿は既に非常に長いと考えているので、私は、まさに何が起こっているかを実証するためのゲーム例を掲載するかもしれません。

>>> look 
You are in a forest, you can hear wildlife all around you. There seems to be a clearing in the distance. 
{'Search the ground', 'Go North'} 
>>> search 
you find a Sword 
>>> Take Sword 
you take the Sword 
>>> n 
moving to clearing 
You are in a clearing surrounded by forest. Sunlight is streaming in, illuminating a bright white flower in the center of the clearing. To the South is the way you entered the forest. A well worn path goes to the East. In the distance a harp can be heard. 
{'Go East', 'Take flower', 'Go south'} 
>>> e 
moving to forest path 
You begin walking down a well beaten path. The sounds of the forest surround you. Ahead you can see a fork in the road branching to the South and East.You can smell smoke coming from the South, and can hear a stream to the East 
{'Go East', 'Go West', 'Go South'} 
>>> e 
moving to stream 
You come upon a relaxing stream at the edge of the woods. It looks like there is something shiny in the water. To your South is a rickety looking shack, to your West is the forest path you came down 
{'Go West', 'Go South'} 
>>> Take Rusty_Key 
you take the Rusty_Key 
>>> s 
moving to shack 
In front of you is a shack, possibly used as an outpost for hunting. It looks dilapidated. 
{'Go North', 'Go South'} 
>>> s 
moving to inside shack 
The inside of the shack is dirty. Bits of ragged fur are scattered about the floor and on a table against the back wall.A sharp looking knife is on the table. There is an ornate key hanging on the wall by a string. 
{'Take Key', 'Take Knife', 'Go North'} 
>>> search 
you find a Knife 
you find a Ornate_Key 
>>> Take Ornate_Key 
you take the Ornate_Key 
>>> Inventory 
Your bag contains: Sword 
Your bag contains: Rusty_Key 
Your bag contains: Knife 
Your bag contains: Ornate_Key 
>>> 
+2

申し訳ありませんが、これは長すぎます。この問題を説明するために最小限の例にまで煮詰めることができますか?たとえば、これがZorkベースのゲームであるという事実は、Pythonクラスの機能とは無関係です – roganjosh

+1

また、Pythonで新しい構造を試している場合は、問題に適用する前に基本的な機能をプロトタイプ化するほうがはるかに簡単です。あなたのアプローチが根本的に欠陥があるものの、それが機能しないことが分かる前にプロジェクト全体で実行されているのであれば、それは修正/取り消しのためのたくさんのものです。 – roganjosh

+0

私はそれを今編集しようとします。私が言ったように、基本的な機能をプロトタイピングする限り、これは私のコードの以前のバージョンで動作していました。私は、なぜそれがクラス内に含まれているので、機能が変更されたのか分かりません。 – SchrodingersStat

答えて

2

あなたはBagTake方法を持っている理由の任意の特定の理由は?あなたがしたいのは、そのアイテムが辞書に存在する場合に追加することだけです。試してみてください:

def CheckTake(self): 
    key = command.split()[1] 
    if Location.room.roominv and key in Location.room.roominv: 
     bag.addToInventory(key) 
     print('you take the', key) 
    else: 
     self.NoneHere(key) 

また、コードが矛盾しています。ある場所ではグローバルに直接アクセスし、他の場所ではグローバルに関数に重複して渡します。私はこれをCode Reviewに持ってきて、あなたがこの作業をしたらあなたの行動を一緒にするよう強くアドバイスします。

+0

私は実際にコードレビューでこのコードの以前のバージョンを投稿しましたが、私の機能をさらに分割するように勧められました。 また、ありがとうございます!私はそれが冗長だと分かっていましたが、それを取り除く方法を理解できませんでした。 key = command.split()[1]は答えでした。 他の人が関数に渡しているときに、私が時々グローバルに直接アクセスする場所の例を挙げてください。 私はここで一番最初から自分自身を教えています。そのようなことは、私がうまくいったものです。 – SchrodingersStat

+1

@ Schrodinger'sStat Yep。あなたは確かにコードのにおいがあります。あなたのコードはTLCを使うことができます...それは確かです。とにかく、これを試してみてください。それがうまくいくなら、自由に投票して/マークを付けてください。 –

+0

@ Schrodinger'sStatたとえば、 'CheckTake'は' command'をグローバルとして扱いますが、 'Take'はそれをパラメータとして受け取ります。 –

関連する問題