Найти тему
Удалёнка

Python. Создаем игру "Анаграммы" с подсказками и бонусами.

Сегодня будем решать задачу, которая даётся читателю в книге Майкла Доусона "Программируем на python". Звучит она следующим образом:

"Доработайте игру "Анаграммы" так, чтобы к каждому слову полагалась подсказка. Игрок должен получать право на подсказку, если у него нет никаких предположений. Разработайте систему начисления очков, по которой бы игроки, отгадавшие слово без подсказки, получали больше тех, кто запросил подсказку".

Автор книги приводит в пример код игры "Анаграммы", который необходимо доработать, что я собственно и сделал. Если вы не знаете, что это за игра, то поймёте правила по ходу пьесы. А пока включаем интерпретатор и начинаем писать код (если не знаете как и это делать, загляните сюда).

Начинаем, по классике, с комментариев, в которых прописываем, что это за программа, и зачем она необходима этому миру:

# Анаграммы (Word Jumble)
#
# Компьютер выбирает какое-либо слово и хаотически переставляет его буквы
# Задача игрока- восстановить исходное слово
# В случае неудачи будет даваться подсказка, а призовые баллы будут отниматься

Да, Доусон просил давать подсказку, если у юзера не будет вообще вариантов. Но я решил подсказывать в случае неудачи. И да, я просто облегчил себе задачу.

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

import random

Теперь создадим последовательность слов, которые будет использовать игра.

WORDS = ('питон', 'анаграмма', 'простая', 'сложная', 'ответ', 'подстаканник')

Ну и заодно создадим вторую последовательность, которая в том же порядке будет содержать подсказки.

help = ('Это змея.', 'Это игра.', 'Антоним: сложная.', 'Такая игра заставит попотеть.', 'Это дают на вопрос.', 'Одежда для стакана.')

Теперь с помощью бога рандома выбираем для игры случайное слово.

word = random.choice(WORDS)

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

correct = word

Кстати, не советую копировать отсюда строки кода, лучше набирать всё вручную. Как показал мой небольшой опыт, таким образом в голове информация откладывается значительно эффективнее. А код программы целиком, со всеми отступами, будет представлен внизу статьи.

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

counter = -1

Считать будем с -1, чтобы отсчет в итоге шел с нулевой позиции, так как элементы наших последовательностей имеют индексы начиная с нуля.

Теперь создаем цикл.

for x in WORDS:
counter += 1
if x == correct
help_position = counter

Дзен как всегда уберет отступы, но вы о них не забывайте и смотрите конечную версию кода внизу. Что по поводу цикла, то мы перебираем все элементы WORDS в переменной x, и каждый раз счетчик counter будет увеличиваться на 1, но ровно до того момента, пока x не станет равен correct, которая содержит выбранное компьютером слово. После этого создается переменная help_position, которая присвоит число, содержащееся в counter. Это число будет соответствовать индексу (порядковому номеру) выбранного компьютером слова, а значит и нашей подсказки.

А теперь создадим анаграмму. Это решение автора книги, и оно для меня до сих пор выглядит сложным, и сам бы я до него пока точно не дошел.

Создаётся переменная "анаграммы", которой не присваивается никакого значения.

jumble =''

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

while word:
position = random.randrange(len(word))
jumble += word[position]
word = word[:position] + word[(position + 1):]

А теперь банальщина. Знакомим игрока с правилами игры и выводим ему анаграмму, рожденную предыдущим циклом.

print(
""""
Добро пожаловать в игру 'Анаграммы!'!
Надо переставит буквы так, чтобы получилось осмысленное слово.
(Для выхода нажмите Enter, не вводя своей версии.)
"""
)
print("Вот анаграмма: ", jumble)

Принимаем в переменную guess пользовательский ввод, и сразу создаем переменную бонусов, которая изначально будет содержать в себе значение 100.

guess = input('\nПопробуйте отгадать исходное слово: ')
bonus = 100

И пишем цикл, который дословно переводится как "пока guess неравен correct, но и не равен пустому вводу, выводи текст, что человек не угадал, выводи подсказку, отнимай из bonus 10, и проси заново ввести ответ". Как видите, подсказка будет формироваться по индексу элемента списка help, содержащегося в переменной help_position.

while guess != correct and guess != '':
print('К сожалению, вы неправы. Подсказка: ', help[help_position])
bonus -= 10
guess = input('Попробуйте отгадать исходное слово: ')

А завершается цикл, когда игрок угадывает, т.е. guess становится равен correct. В таком случае выводится поздравительный текст и количество оставшихся бонусов. Если игрок угадал с первой попытки, их останется 100.

if guess == correct:
print('Да, именно так! Вы отгадали!\n')
print('Спасибо за игру! Заработанный вами бону составляет ', bonus, ' очков')
input('\nНажмите Enter для выхода.')

Вот собственно и всё. На всякий случай хочу отметить, что прекрасно понимаю, что такое г****код, но мне бы пока хоть им овладеть. Если имеются замечания, дополнения и прочие советы по усовершенствованию данной программы, буду безмерно благодарен каждому неравнодушному. А внизу вид получившегося у меня кода.