Помогите. Пишу игру виселицу, и при вводе буквы, встречающейся в слове 2 раза, программа пишет только одну

Например, слово баскетбол, в слове две буквы 'б'. При вводе буквы б, будет так:

Б_ _ _ _ _ _ _ _

Вот часть кода:

while a!=word:
    letter = input('Ваш выбор: ')
    index = abc.index(letter)
    a[index] = letter
    index = abc.index(letter)
    print(a)

Помогите, буду рад любому объяснению.


Ответы (2 шт):

Автор решения: franmag

Дело в том что метод index возвращает индекс первого совпадения. В коде ниже этот метод также был заменен на find, потому что index вызывает ошибку если не находит совпадения в отличии от find, который возвращает -1. Для того чтобы получить индексы всех букв нужно пройтись по ним циклом, при этом каждый раз рассматривая ту часть слова что идет после предыдущего совпадения. Так как каждый раз мы будем брать кусочек слова меньше к нему нужно будет прибавлять предыдущий индекс чтобы получить необходимый результат.

Вот пример кода:

def gallows(word):
  word = word.lower() # Сводим все к нижнему регистру ради правильного сравнения, что не зависит от регистра

  answer_list = ['_' for i in range(len(word))] # Создаем массив состоящий из _ длинною в слово

  while ''.join(answer_list) != word:
    letter = input('Ваш выбор: ').lower()

    if not letter in word: continue # В случае если буква не в слове прекращаем текущую итерацию

    i = -1 # В цикле будет использовать кусок слова начиная с индекса + 1 так что для того чтобы рассмотреть слово целиком начальный индекс равен -1
    while True:
      i = word[i + 1:].find(letter) + i + 1 # Получаем новый индекс

      answer_list[i] = letter # Заменяем _ на букву

      if i == -1 or not letter in word[i + 1:]: break # Прекращаем цикл вот таким образом для того чтобы произошла хоть одна итерация
    print(' '.join(answer_list))
  print('Вы победили')
→ Ссылка
Автор решения: MarianD
word = "баскетбол"
a = "-" * len(word)

while a != word:
    letter = input('Ваш выбор: ')
    for i, char in enumerate(word):
        if char == letter:
            a = a[:i] + char + a[i+1:]
    print(a)

Объяснение:

  • enumerate(word) сделает из слова wordкак бы список парей (позиция, буква), в нашем случае такой:

    [(0, 'б'),
     (1, 'а'),
     (2, 'с'),
     (3, 'к'),
     (4, 'е'),
     (5, 'т'),
     (6, 'б'),
     (7, 'о'),
     (8, 'л')]
    
  • в цикле for i, char in enumerate(word): будет в переменной i текущая позиция (индекс) и в переменной char соответствующая текущая буква,

  • когда текущая буква совпадает с буквой введенной пользователем, она запишется на текущую позицию, но

  • потому что строку невозможно прямо менять, строка вырабатывается из части перед индексом, затем следует самая текущая буква и за нее часть после индекса:

    a = a[:i] + char + a[i+1:]
    
→ Ссылка