最初の問題は、kwatford が説明したように、毎回ループを返すことです。if
ステートメントをwhile
ループの外に移動することで修正できます。
次の問題は、Vorticity が説明したように、ユーザーが単語全体を推測したとしても、決して早く返されないことです。これを修正するには、if
パーツをループ内に戻しますが、else
パーツをループ外に残します (つまり、 は不要になりますelse
) 。
その後、ループを毎回実行しているため、まだ機能しません。したがって、1 回の推測ですべての文字を推測した場合にのみ勝つことができます (単語が、言う、またはでない限り、これは不可能です)。これを修正するには、その行をループの外に移動します。secretLetters = list(secretWord)
"a"
"aaaaa"
すべてを一緒に入れて:
def isWordGuessed(secretWord,lettersGuessed):
guess = 0
secretLetters = list(secretWord)
while guess <= 8:
secretWordLen = len(secretLetters)
letter = input('Enter a letter: ')
lettersGuessed.append(letter)
print('Letters guessed so far: ',lettersGuessed)
if letter not in secretLetters:
guess += 1
while letter in secretLetters:
secretLetters.remove(letter)
if secretLetters == []:
return True
return False
補足として、これを単純化するためにできることはたくさんあります。
まず、秘密の単語に含まれるすべての文字のセットが本当に必要なだけです。順序や、それぞれの文字のコピー数などを知る必要はありません。したがって、 の代わりに をlist
使用しset
ます。これは、ループアラウンドが必要ないことも意味しますsecretLetters.remove(letter)
。
もっと自明なことに、あなたはそれを作成しますsecretWordLen
が、決して使用しません。
また、呼び出し元から渡された a を受け入れて追加しますlettersGuessed
が、呼び出し元は空のリストを渡すだけで、事後にそれを使用することはありません。また、呼び出し元の利益のためにそれを変更する必要がない場合は、文字列として保持するだけでよいため、ユーザーはhelp
の代わりに表示されます['h', 'e', 'l', 'p']
。これははるかに優れています。
また、真実ではない可能性がある場合でもテストされているケースがいくつかあります。
最後に、空のリスト (またはセット、またはその他のシーケンス) は false であるため、空のリストと明示的に比較する理由はありません。
その間、インデントを見やすくするために間隔を PEP8 化します。
そう:
def isWordGuessed(secretWord):
guess = 0
lettersGuessed = ''
secretLetters = set(secretWord)
while guess <= 8:
letter = input('Enter a letter: ')
lettersGuessed += letter
print('Letters guessed so far:', lettersGuessed)
if letter not in secretLetters:
guess += 1
else:
secretLetters.remove(letter)
if not secretLetters:
return True
return False