2016-05-28 9 views
2

EDIT:これを理解しようとしている人には申し訳ありません...私の他の関数のいくつかの理由で、私はforループを持っていましたAttributeError: 'str'に属性 'shape'がありません

for turt in winningRowTurtles: 
    winningRowTurtles[turt] = '' 

私は本当に理由を知らない...すべての混乱のために申し訳ありません!

私はPythonで4つのゲームを接続しています。勝利したら、勝利のタイルとフラッシュに行くために4匹のカメを持っていきたいです。私はこれが働いている...しかし、それは勝利が発見されるとすぐに、画面の真ん中に亀が産まれて本当にすばやく隠れて(そして気を散らしている)、その場に行くならばうまくいく。私はそれがゲームの終わりにセットアップ段階でゲームの初めに生まれて隠れるようにしたい。ここに私のコードは次のとおりです。

winningRowTurtles = {} 
for turt in range(4): 
    winningRowTurtles[turt] = turtle.Turtle() 
    winningRowTurtles[turt].up() 
    winningRowTurtles[turt].ht() 

この次のコードでは、勝者が発見された後に何が起こるかです:

if winnerFound == 1: 
    for turt in winningRowTurtles: 
     winningRowTurtles[turt].shape('circle') 
     winningRowTurtles[turt].color('blue') 
elif winnerFound == 2: 
    for turt in winningRowTurtles: 
     winningRowTurtles[turt].shape('square') 
     winningRowTurtles[turt].color('red') 

その後、私はこのエラーを取得する:

Traceback (most recent call last): 
File "C:\[redacted]\Python\Connect Four!.py", line 353, in <module> 
play_game() 
File "C:\[redacted]\Python\Connect Four!.py", line 258, in play_game 
winningRowTurtles[turt].shape('circle') 
AttributeError: 'str' object has no attribute 'shape' 

play_game()がありますコードの第2部分が実行される関数です。なぜ誰が知っていますか?これは完全に不合理なようです。私は他のコードを実行する前にwinningRowTurtles [1,2,3,4]を定義しました...文字列ではなくカメとして。前もって感謝します。

+0

forループを実行する前にwinningRowTurtlesの値を表示します。それは、winningRowTurtlesが間違って割り当てられているかどうかを教えてください。 – anujm

+0

'winningRowTurtles'ディクショナリが作成されてから、2番目のコードブロックでinを使用するまでの間に、少なくとも1つの値が文字列に置き換えられます。それはあなたが私たちに示していないコードで起こらなければならないので、私たちがあなたにそれを手伝う実際の方法はありません。 – Blckknght

答えて

0

は検討:

for turt in range(4):

と:

I defined winningRowTurtles[1,2,3,4] before I ran the other code.

range(4)

しかし、[0、1、2、3]です。私たちが言ってあなたを期待していたことである:winningRowTurtlesのための辞書を使用して

I defined winningRowTurtles[0,1,2,3] before I ran the other code.

あなたは1ではなく0から始まりますが、それは簡単にインデックスエラーを導入することができ、配列のように見えるものを持つことができますますランダムな文字列がより簡単に入り込むあなたが行うので、問題は4匹のカメの一つが、辞書に持って余分なエントリではないかもしれません。辞書にすべてのものを想定してい

for turt in winningRowTurtles: 

はカメです。

以前に削除したコメントでは、winningRowTurtlesを配列に切り替えて、一貫性のあるインデックス作成を強制し、偶発的なアイテムがインデックスに挿入されないようにすることをお勧めします。 - また、3

winnerFoundが0の範囲
winningRowTurtles = [] 

for _ in range(4): 
    winningRowTurtles.append(turtle.Turtle()) 
    winningRowTurtles[-1].up() 
    winningRowTurtles[-1].ht() 

... 

for turt in range(4): 
    winningRowTurtles[turt].shape(winningRowTurtles[winnerFound].shape()) 
    winningRowTurtles[turt].color(winningRowTurtles[winnerFound].color()) 

:よう

何か。

はい、すべてを1ベースではなく0ベースに再考する必要があります。

あなたが本当に適切にあなたのrange()を調整することを確認し、1ベースのインデックスと辞書に滞在したい場合:

for turt in range(1, 5): 
    winningRowTurtles[turt] = turtle.Turtle() 
    ... 

いずれかの方法で、あなたはそれが一貫性のあることを確認するために、インデックス作成を検討する必要があります。

関連する問題