2012-01-03 18 views
9

現在、絶対初心者向けのPython(第3版)という本からPythonを学んでいます。この本には、ハンベマンゲームのコードを説明する練習があります。私はこのコードと一緒に続いたが、私はプログラムの途中でエラーを取り戻し続けた。ここでPythonエラー:「IndexError:文字列インデックスが範囲外です」

は、問題を引き起こしているコードです:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
     so_far = new 

これはまた、それが返すエラーです:

new += so_far[i] 
IndexError: string index out of range 

誰かが間違っているもので私を助けることができると私はすることができますそれを修正するには?

編集:私はそうのようなso_far変数を初期化:

so_far = "-" * len(word) 
+2

これはあなたの質問とは無関係ですが、i = 0は必要ありません。forループは、まだ定義されていなくても起動時に自動的にループ変数を設定します。 –

+0

@Chadそう、あなたの権利。私はなぜそれにこだわったのか覚えていない:S – Darkphenom

答えて

11

so_far = newをあまりにもインデントしたようです。これを試してください:

if guess in word: 
    print("\nYes!", guess, "is in the word!") 

    # Create a new variable (so_far) to contain the guess 
    new = "" 
    i = 0 
    for i in range(len(word)): 
     if guess == word[i]: 
      new += guess 
     else: 
      new += so_far[i] 
    so_far = new # unindented this 
+4

+1イーグルアイボーナス。 – hochl

+0

ありがとうございました!中括弧を置くのに慣れてしまうようなものにはインデントを付けるのはちょっと混乱していることがわかります! – Darkphenom

5

あなたは1つの文字列(word)を反復するが、その後so_farで文字を検索することへのインデックスを使用しています。これら2つの文字列の長さが同じであるという保証はありません。

1

このエラーは、推測の数(so_far)が単語の長さよりも小さい場合に発生します。どこかの変数so_farの初期化が欠けていましたか?

so_far = " " * len(word) 

編集:

でエラーが発生します行の前に

print "%d/%d" % (new, so_far) 

のようなものを試してみてください、あなたは間違って行く正確に何を見ることができます。私が考えることができるのは、so_farが別の範囲にあり、実際にあなたが考えるインスタンスを使用していないということだけです。

+0

申し訳ありませんが、私はこれを含めるべきでしたが、忘れました。私はすでにその変数を同じ方法で初期化していました。 so_far = " - " * len(word) – Darkphenom

+0

デバッグする方法を追加するために私の応答を編集し、何が間違っているかを示唆しました。 – CNeo

+0

そして、@ Rob Woutersがそれを手に入れたように見えますが、私はそれを逃しました。彼はそうです、so_farはブロックの外にあるべきです:) – CNeo

0

コードにいくつかの問題がありました。 ここであなたは(目標単語として「こんにちは」設定することができます)を分析することができ、機能バージョンがあります:

word = 'hello' 
so_far = "-" * len(word)  # Create variable so_far to contain the current guess 

while word != so_far:   # if still not complete 
    print(so_far) 
    guess = input('>> ')  # get a char guess 

    if guess in word: 
     print("\nYes!", guess, "is in the word!") 

     new = "" 
     for i in range(len(word)): 
      if guess == word[i]: 
       new += guess  # fill the position with new value 
      else: 
       new += so_far[i] # same value as before 
     so_far = new 
    else: 
     print("try_again") 

print('finish') 

私はエラーに注意してください、py2kのIDEにpy3kのためにそれを書き込もうとしました。

+0

あなたのbreak文は間違っています。 –

+1

ロブ、あなたは正しいです – joaquin

+0

ええ、私はポイントに到達するためのコードの小さなセグメントを取り出した。しかし、それを指摘してくれてありがとう。 – Darkphenom

関連する問題