Нацеливание на пробелы в строке

#python #python-3.x

#питон #python-3.x

Вопрос:

Я создаю игру, похожую на палача. В принципе, допустим, у меня есть секретное слово, например, «красавица и чудовище», и пользователь должен угадать буквы и, в конечном счете, все слово целиком.

Пока мой код работает нормально, но если вы все равно хотите его проверить, пожалуйста. Вот соответствующая часть:

 def draw(good_guesses, bad_guesses, secret_word):  # DRAW spaces, letters amp; strikes
    clear()
    print(secret_word)
    # printing strikes first
    print("Strikes: {}/7".format(len(bad_guesses)))
    print("")

    # printing bad guesses so far
    for letter in bad_guesses:
        print(letter, end=" ")  # have a space between each element
    print("n")  # double blank lines

    # print discovered/undiscovered letters
    for letter in secret_word:
        if letter in good_guesses:
            print(letter, end=" ")
        else:
            print('_', end=" ")
    print('')
 

Однако вернемся к нашему примеру. Для строки «красавица и чудовище» пользователь увидит распечатанное для него следующее:

«_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _»

Как вы можете видеть, пробелы в строке выводятся как символы подчеркивания, и это именно то, что я хотел бы изменить.

Было бы намного лучше, если бы это было распечатано вместо этого:

«_ _ _ _ _ _ / _ _ _ / _ _ _ / _ _ _ _ _»

Я думаю, может быть, есть способ настроить таргетинг на пробелы и распечатать их как пробелы вместо подчеркиваний? Хотя я не могу понять, как это сделать.

Спасибо.

Ответ №1:

В логике вашего кода вам нужно обработать этот случай с помощью оператора равенства: == . Итак, что-то вроде этого будет работать:

 for letter in secret_word:
    if letter in good_guesses:
        print(letter, end=" ")
    elif letter == ' ':
        print('/', end=" ")
    else:
        print('_', end=" ")

print('')
 

Комментарии:

1. Это определенно лучший ответ на ваш буквальный вопрос.

Ответ №2:

Я думаю, что вы хотите изменить строку 40 на следующую:

 if letter in good_guesses or letter == ' ':
 

Кроме того, вы можете привязать символы к good_guesses :

 if letter in good_guesses   ' ':
 

Это позволяет добавлять и другие символы:

 if letter in good_guesses   ' -,': # Commas, spaces, and dashes are "given" to the player.
 

Ответ №3:

Вы можете внести ряд улучшений в свой код, в основном с помощью str.join и понимания.

Вот draw функция, которая делает то, что делает ваш оригинал, но с запрошенными изменениями и некоторыми другими изменениями:

 def draw(good_guesses, bad_guesses, secret_word):
    # DRAW spaces, letters amp; strikes
    clear()
    print(secret_word)
    # printing strikes first
    print("Strikes: {}/7n".format(len(bad_guesses)))

    # printing bad guesses so far
    print("{}n".format('  '.join(bad_guesses)))

    # print discovered/undiscovered letters
    print("{}n".format(''.join(letter if letter in good_guesses else '/' if letter == ' ' else '_' for letter in secret_word)))
 

' '.join(bad_guesses) имеет преимущество перед исходным for циклом в том, что он не выводит завершающий пробел.

''.join(letter if letter in good_guesses else '/' if letter == ' ' else '_' for letter in secret_word) объединяет все элементы итератора с пустой строкой. Итератор возвращает букву, если она была угадана правильно, '/' для пробелов и '_' для всего остального.

В обоих случаях предварительное форматирование строки делает ненужным использование пользовательских окончаний строк print .

Вот пример вывода для вашей входной строки, в которой пользователь угадал все гласные:

 >>> draw('aeuy', 'io', 'beauty and the beast')
beauty and the beast
Strikes: 2/7

i  o

_eau_y/a__/__e/_ea__
 

Комментарии:

1. Спасибо за подробное объяснение. В последнее время меня смущают методы .join() и .split(). Ваше решение, хотя я избегал однострочников… может быть, мне пора начать их использовать.

2. На самом деле, теперь, когда я пытаюсь это сделать, похоже, это изменило поведение программы.

3. По какой-то причине подчеркивание не отображается.

4. Используете ли вы Python 3?

5. Да, насколько я могу судить. Запуск этого в терминале с помощью команды python3.