我需要帮助修复这个hangman功能

时间:2014-11-18 05:54:20

标签: python function

好的,所以我在我的代码中遇到了这个部分。当我想要用户猜测的字母替换下划线字符串中的那个字母时,它会用该字母替换每个字母。我不知道该怎么办。这是代码。

 def hangman(secret):
    '''
    '''

    guessCount = 7
    w = '_'*len(secret)

    while guessCount > 0:
        guess = input('Guess: ')
        if guess in secret:
            indices = indexes(secret, guess)
            print(indices)
            for i in range(len(indices)):
                w = w.replace(w[indices[i]],secret[indices[i]])
                print(w)
        else:
            guessCount = guessCount - 1
            print('Incorrect.',guessCount,'incorrect guesses remaining.')

在第9行和第10行中指出我能做些什么的任何帮助都将不胜感激。

这是我之前在此函数中使用的第一个函数。

def indexes(word, letter):
    '''returns a list of indexes at which character letter appears in word'
    '''

    indices = []

    for i in range(len(word)):
        if letter in word[i]:
            indices.append(i)
    return indices

4 个答案:

答案 0 :(得分:1)

正在发生的事情是,第10行认为您想要将“_”替换为“guess”。代替:

for i in indices:
  w = list(w)
  w[i] = guess
  w = ''.join(w)
  print(w)

最有可能采用更优雅的方式来实现这一目标,而不是将w从字符串更改为列表,再从列表更改为字符串,但我无法想到它。

答案 1 :(得分:1)

修改循环以遍历索引的内容:

for i in indices:
    w = w.replace(w[indices[i]],secret[indices[i]])
print(w)

否则,循环将从0执行到indices数组的长度,因为提到了范围。 此外,您可能希望将print语句移到for循环之外。

答案 2 :(得分:0)

如果您使用w[indices[i]]索引编号,w包含_。因此,您总是执行以下操作:w.replace('_', 'e')和:

>>> help("".replace)

Help on built-in function replace:

replace(...)
    S.replace(old, new[, count]) -> string

    Return a copy of string S with all occurrences of substring
    old replaced by new.

所以你得到:

>>> "_____".replace('_', 'e')
'eeeee'

@Vaiska提出了另一个好处,你正在计算索引的长度,而不是索引本身。所以你总是在计算0,1,2,3 ...

@Kyle Friedline有一个解决方案,另一个是建立一个新的字符串,一次取一个字符,无论是从猜测还是从秘密,取决于你是否在索引点。

答案 3 :(得分:0)

字符串在Python中是不可变的。因此,它不是用于表示单词的合适数据结构。在我看来,Kyle Friedline的方法可能是正确的方法。

def hangman(secret, guessCount=7):
    assert guessCount > 0  # Never really good to hard code magic numbers.

    w = ['_'] * len(secret)  # Make 'w' a list instead because list is mutable
    while guessCount > 0:
        guess = input("Guess: ")
        if guess in secret:
            indices = indexes(secret, guess)  # I'm guessing indexes is defined elsewhere?
            for i in indices:
                w[i] = guess  # Make it explicit. secret[i] == guess anyway.
            print("".join(w))  # Join w into a word
        else:
            guessCount -= 1  # More concise
            print("Incorrect. ", guessCount, " incorrect guesses remaining.")

实施索引的一点建议:

def indexes(word, letter):
    return [i for i, c in enumerate(word) if c == letter]

或者只需将对indexes()的调用替换为:

indices = [i for i, c in enumerate(secret) if c == guess]