2014-11-18 2 views
1

Хорошо, поэтому я застрял в этой части в своем коде. Когда я хочу, чтобы письмо, которое пользователь предпочел заменить эту букву в строке подчеркивания, заменяет каждую букву этой буквой. Я не знаю, что делать. Вот код.Мне нужна помощь, исправляющая эту функцию палача

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 

ответ

0

Строки неизменны в Python. Следовательно, это не подходящая структура данных для представления вашего слова. По-моему, подход Кайла Фридлина, вероятно, правильный путь.

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] 
1

Что происходит, что линия 10 думает, что вы хотите заменить «_» с «угадать». Вместо этого:

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

Существует, скорее всего, более элегантный способ сделать это, а не изменять вес из строки в список и из списка обратно в строку снова, но я не могу думать об этом с верхней части моей головы ,

+0

Если 'Обл (а)' быть 'ш = ''. присоединиться к (ж) '? – TessellatingHeckler

1

Изменение цикла для перебора содержимого индексов:

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

В противном случае, цикл будет выполняться от 0 до длины массива индексов, так как было упомянуто диапазон. Кроме того, возможно, вам захочется переместить оператор печати за пределы цикла for.

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 имеет одно решение, другое - создать новую строку с одним символом за раз, либо из догадки, либо из тайны , в зависимости от того, были ли вы в индексе или нет.

Смежные вопросы