#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.