код для игры виселица питон
Игра «Виселица»¶
«Виселица» — игра на угадывание слов. Компьютер загадывает слово. Игроку известны первая и последняя буквы, а также количество букв. Игрок угадывает слово по буквам. Если буква есть в слове, то открываются все ее вхождения. Если буквы нет, то к виселице дорисовывается часть человека. Если слово открыто полностью, игрок побеждает. Если набрано максимальное количество ошибок и человек на виселице нарисован полностью, игрок проигрывает.
Пример интерфейса игры:
В примере мы видим последнюю стадию — игрок не смог угадать слово и проиграл. Перед нами:
Полностью нарисованный человек.
Слово, в котором часть букв закрыто и отображается точками.
Алфавит, в котором вместо использованных букв отображаются точки.
Перед началом работы нужно ответить на вопросы:
Какие структуры данных будут полезны при реализации игры?
Какие подзадачи можно выделить, глядя на пример интерфейса?
Посмотрите на заготовку кода. Расскажите, какие объекты уже созданы. Назовите их типы.
После реализации основной функциональности проверьте, как приложение реагирует на некорректный ввод.
Примеры некорректного ввода:
Пользователь вводит букву в верхнем регистре.
Пользователь вводит не букву (цифру или спецсимвол).
Пользователь многократно вводит уже использованную букву (присутствующую или отсутствующую в слове).
Пользователь вводит несколько букв сразу.
Как вы считаете, какое поведение было бы ожидаемым в данном случае? Доработайте приложение таким образом, чтобы оно было более устойчиво в некорректному вводу.
Доработайте приложение так, чтобы у пользователя была возможность назвать слово целиком.
Как написать игру на Python3
Самоучитель Python3 для начинающих
Глава 9.6 Как работает программа «Виселица»
В строке 62 мы определяем функцию getRandomWord(wordlist). Эта функция сначала генерирует список слов из строки в переменной words, которую мы передадим функции в качестве аргумента. Выбранной секретное слово будет сохранено в переменной secretWord.
В строке64 генерируется случайный индекс для списка секретных слов. Для этого мы воспользуемся, уже знакомой нам, функцией random.randint(). В качестве аргументов мы передаем ей два параметра. Первый из них – 0, для первого возможного индекса (не забываем, что отсчет индексов в списке идет от 0). А второй аргумент вычисляется выражением len(wordList) – 1, которое возвращает индекс последнего элемента в списке.
Так как индексы элементов списка начинаются с [0], возможна некоторая путаница с этим типом данных. Например, у вас есть какой-либо список из трех элементов. Хотя элементов в списке у нас три, индексом последнего элемента будет [2] – ведь первому элементу присваивается индекс [0], второму присваивается индекс[1] и третий элемент будет иметь индекс[2]. Именно поэтому в выражении, которое вычисляет количество элементов в списке, мы отнимаем единицу из полученного числа – чтобы максимальный индекс соответствовал максимальному количеству слов. Теперь вы можете свободно добавлять и убирать слова в переменной words – программа все равно будет работать верно.
Случайно выбранное значение будет сохранено в переменной wordIndex. В строке 65 будет произведен возврат значения из списка wordlist по индексу, который был сгенерирован в предыдущей строке.
Чтобы было немного понятнее, давайте представим, что в нашем списке wordList всего три значения – [‘яблоки’, ‘апельсины’, ‘виноград’], а в переменной wordIndex находится случайное значение 2. Это значит, что будет возвращен элемент списка wordList[2], то есть ‘виноград’. Таким же образом наша функция getRandomWord() возвращает случайное слово из списка wordList.
Таким образом, на вход функции getRandomWord() мы передаем список слов, а на выходе получаем случайно выбранное слово из этого списка. Это будет весьма полезно, так как игрок не сможет заранее предвидеть, какое слово ему предстоит угадывать.
Отображение результатов игры
Далее нам понадобится функция, которая будет выводить на экран изображение виселицы (прогресса «повешенности»), а также количество букв, которые игрок угадал (или не угадал).
С помощью этого кода мы определяем функцию displayBoard(), которая и выполнит все необходимые операции. Она принимает в качестве аргументов 4 значения:
При первом вызове функции print(), в строке 67, отобразится пустая виселица. Строки, которые мы находятся в переменной HANGMANPICS, будут обрабатываться как элементы списка, а в качестве разделителя используется запятая. Как только игрок сделает первую ошибку, длина переменной missedLetters будет вычислена как 1. работа функции print(HANGMANPICS[1]) приведет к тому, что на экране отобразится виселица с головой. Еще одна ошибка дорисует руку. И так далее, пока игрок не допустит 6 ошибок, а на экране не отобразится полностью повешенный персонаж.
Для того, чтобы узнать количество букв в переменной missedLetters, воспользуемся функцией len(). Например, в переменной missedLetters находятся буквы ‘врге’. Тогда функция len(missedLetters) вернет число 4. Используя это число, HANGMANPICS[4] вернет соответствующий набор строк и отобразит изображение виселицы соответствующее четырем допущенным ошибкам.
Строка 71 выводи т на экран сообщение «Неправильные буквы:». Чтобы при завершении функции print() не произошел перенос на новую строку, мы явно указываем символ пробела после ключевого слова end. Это значит, что следующая строка (в которой у нас хранятся неправильные буквы) будет дописываться в конец уже напечатанной через пробел (символ, который мы указали после ключевого слова end).
В строке 72 мы видим еще неизвестный нам тип цикла – for. Вместе с ним очень часто используется функция range(). Оба этих понятия мы рассмотрим в следующей главе.
Написание игры «Виселица»
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Изменить условия игры «Угадай число!»
Здравствуйте! Помогите, пожалуйста. Я новичок. Так получилось, что мне срочно нужно сделать.
Ошибка «»module» has no attribute «pack»»
Здравствуйте! Пишу приложение на python 3.2 Есть главный файл, в нём происходит import struct А.
Вычислить выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «-«)
Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков.
Возьмите лучше нормальный код
странно, вроде же не вызывается
Добавлено через 3 минуты
Возьмите лучше нормальный код
Решение
У вас слово определяется несколько раз, т.к. функция chosing вызывается несколько раз из разных мест. Сами посмотрите:
Вызвано из chosing
ласка
тема-«животные»
Вызвано из chosing
пингвин
Вызвано из intro
Вызвано из intro
Вызвано из intro
Вызвано из intro
Вызвано из intro
Вызвано из intro
Вызвано из intro
_ _ _ _ _ _ _
введи букву:а
Вызвано из chosing
жираф
Вызвано из step
Вызвано из chosing
муравей
Вызвано из chosing
лемур
Вызвано из chosing
бабуин
тема-«животные»
Вызвано из chosing
рысь
Вызвано из intro
Вызвано из intro
Вызвано из intro
Вызвано из intro
_ _ _ _
Разберетесь что к чему? И вызов chosing на 38й строке зачем, если эта функция потом снова из intro вызывается? Слово то потом снова переопределяется.
Добавлено через 10 минут
Каждый раз, когда у вас написано chosing(), функция выбирает новое слово и снова его пишет. Вы не сохраняете результат первого вызова функции в переменной, которую потом можно использовать дальше, а просто снова и снова вызываете функцию, которая снова и снова выбирает новое слово. Написали одну букву, а слово уже изменилось.
П.С. Не успел добавить к оригинальному посту.
Требуется помощь для полного понимания игры «Висельница»на Python? Я её написал практически полностью прокомментировал?
За количество комментариев аплодирую стоя.
Кстати:
висельника.
Тут бы тоже шарп в начале поставить.
Nikola_Piterskiy, Несколько вопросов:
board[cind] = char»’. Что тут происходит.
Не видел нигде чтоб шла переменная и после неё board [список] = char
[cind]-это список же,правильно. »’
print(«\n».join(stages[0: e]))#. (stages[0: e]). что происходит в списке.
3 строчки не понятны:
1)board[cind] = char
2)print(«\n».join(stages[0: e]))
3)print((» «.join (board)))»’. Почему много скобок, можно ли убрать 2 скобки по краям.
Serbi, ты только хуже сделал. Комментариев не должно быть больше кода, их не должно быть даже столько же сколько кода.
Никогда не разделяй условные блоки комментариями, а вот это:
это вообще неадекватный ****ец, да простят меня модераторы.
#если бы я отгадал «к»,то я бы изменил список board на [«к»,»__»,»__»].
Как я понял, вы сами написали ответ на свой вопрос, и вот эти 2 строки это и делают, заменяют ___ на буквы
Serbi, не грубите другим участникам
И хотя бы код читать научитесь, а не просто копипасте
Вы получаете index буквы в слове, если угадываете её. И размещаете её с этим же индексом в списке
Ну так и пиши код, а не сочинение на тему «как работает код с примерами».
2)print(«\n».join(stages[0: e])). что происходит здесь? stages[0: e]
3)print((» «.join (board)))»’. Почему много скобок, можно ли убрать 2 скобки по краям.
Спасибо всем один вопрос раскрылся)
1)board[cind] = char
2)print(«\n».join(stages[0: e]))
3)print((» «.join (board)))»’. Почему много скобок, можно ли убрать 2 скобки по краям.
3) см п.2. Да, скобки «по краям» можно убрать
Программируем на Python
Периодически нам в редакцию приходят письма с вопросом будет ли новый тираж книги «Программируем на Python» М.Доусона. Несмотря на то, что оригинал «Python Programming for the Absolute Beginner, 3rd Edition» вышел в 2010г., он до сих пор в бестах на amazon.com. Содержание книги построено на практических примерах программирования простых игр. Нам очень интересно узнать мнение профессионалов, что позволит принять решение издавать ли книгу.
Полное оглавление можно посмотреть здесь.
Отрывок из Главы 5. Списки и словари. Игра «Виселица»
Кортежи — хороший способ манипулировать элементами разных типов в составе одной последовательности. Но от того, что кортеж неизменяем, иногда возникают неудобства. К счастью, есть последовательности другого вида, так называемые списки (lists), которые умеют все то же самое, что и кортежи, и даже больше — просто потому, что список изменяем. Его элементы можно удалять, а также добавлять новые. Можно даже подвергать список сортировке. Я познакомлю вас с еще одной разновидностью последовательностей — словарями (dictionaries). Если список организован как набор значений, то словарь — как набор пар значений. Подобно своему тезке с книжной полки, словарь позволяет находить то значение, которое соответствует какому-либо другому. Говоря более детально, в этой главе вы научитесь делать следующее:
• создавать списки, индексировать их и делать срезы;
• добавлять и удалять элементы списка;
• применять списковые методы, которые позволяют сортировать список и добавлять значение в конец;
• применять вложенные последовательности, которыми можно представить данные любой сложности;
• пользоваться словарями для работы с парами значений;
• добавлять и удалять элементы словаря.
Знакомство с игрой «Виселица»
В центре внимания этой главы — проект, посвященный игре «Виселица». Втайне от пользователя компьютер выбирает какое-либо слово, и игрок должен попробовать отгадать его, высказывая свои предположения побуквенно. Каждый раз, когда игрок ошибается, компьютер дорисовывает на экране изображение фигурки под виселицей. Если в отведенное количество попыток игроку не удается отгадать слово, то «повешенный» гибнет. На рис. 5.1–5.3 показан игровой процесс во всем его страшном великолепии.
Игра интересна не только сама по себе. Замечательно также и то, что к концу изучения этой главы вы узнаете, как создать собственную версию игры. Вы сможете, например, обзавестись своим личным списком «секретных» слов или заменить мои примитивные рисунки более внушительными.
Рис. 5.1. Играем в «Виселицу». Гм… Что же за слово он загадал?
Рис. 5.2. В этой игре я победил!
Рис. 5.3. А эта игра закончилась не лучшим образом, особенно для псевдографического человечка
Использование списков
Списки, как и кортежи, — это последовательности. Но списки изменяемы. Их элементы поддаются модификации. Вот почему списки обладают той же функциональностью, что и кортежи, и могут кое-что еще. То, что вы уже знаете о работе с кортежами, применимо и к спискам, а значит, научиться ими пользоваться для вас не составит труда.
Знакомство с программой «Арсенал героя 3.0»
Эта программа основана на более ранней игре «Арсенал героя 2.0», с которой мы познакомились в главе 4. Здесь для хранения данных об арсенале героя использованы не кортежи, а списки. Начальная часть «Арсенала героя 3.0» выдает такие же результаты, как и более ранняя версия. Да и код в ней практически тот же самый; разница лишь в том, что вместо кортежей везде использованы списки. На рис. 5.4 показано окно программы после выполнения этой первой части. Следующий за ней код демонстрирует полезные следствия изменяемости списков и некоторые новые приемы работы с последовательностями. Выполнение этой части программы отражено
на рис. 5.5.
Рис. 5.4. Теперь арсенал героя представлен списком. В окне программы все выглядит почти так же, как выглядело в версии 2.0, где использовался кортеж
Создание списка
В первых строках кода создается новый список, который становится значением переменной inventory; система выводит элементы списка на экран. Единственное отличие от «Арсенала героя 2.0» состоит в том, что я заключил элементы списка в квадратные, а не в круглые скобки и получил список, а не кортеж. Код этой программы вы можете найти на сайте-помощнике (courseptr.com/downloads) в папке Chapter 5. Файл называется hero’s_inventory3.py.
Рис. 5.5. Поскольку арсенал героя — это список, то его элементы можно добавлять, изменять и удалять
# Арсенал героя 3.0
# Демонстрирует работу со списками
# создадим список с несколькими элементами и выведем его с помощью for-цикла
inventory = [“меч”, “кольчуга”, “щит”, “целебное снадобье”]
print(“\nИтак, в вашем арсенале:”)
for item in inventory:
print(item)
input(“\nНажмите Enter, чтобы продолжить.”)
Применение функции len() к спискам
Следующий код побуквенно совпадает с аналогичным кодом в «Арсенале героя 2.0». Функция len() работает со списками так же, как и с кортежами.
# найдем длину списка
print(“Сейчас в вашем распоряжении”, len(inventory), “предмета/-ов.”)
input(“\nНажмите Enter, чтобы продолжить.”)
Применение оператора in к спискам
Этот код тоже без изменений позаимствован из предыдущей версии. Оператор in не видит разницы между кортежем и списком.
# проверка на принадлежность списку с помощью in
if “целебное снадобье” in inventory:
print(“Вы еще поживете и повоюете.”)
Индексация списков
Опять ничего нового по сравнению с версией 2.0. Для доступа к элементу списка, как прежде, надо заключить в квадратные скобки номер позиции, в которой находится элемент.
# вывод одного элемента с определенным индексом
index = int(input(“\nВведите индекс одного из предметов арсенала: “))
print(“Под индексом”, index, “в арсенале находится”, inventory[index])
Срезы списков
Готовы ли вы поверить в то, что срезы списков представляют собой то же самое, что и срезы кортежей? Опять же указываем начальную и конечную позиции через двоеточие в квадратных скобках:
# отобразим срез
start = int(input(“\nВведите начальный индекс среза: “))
finish = int(input(“Введите конечный индекс среза: “))
print(“Срез inventory[“, start, “:”, finish, “] – это”, end=” “)
print(inventory[start:finish])
input(“\nНажмите Enter, чтобы продолжить.”)
Сцепление списков
Сцепление списков ничем не отличается от сцепления кортежей. Разница здесь будет только в том, что присвоить переменной chest я решил список, а не кортеж. Это небольшое, но существенное отличие, потому что конкатенации можно подвергнуть лишь однотипные последовательности.
# соединим два списка
chest = [“золото”, “драгоценные камни”]
print(“Вы нашли ларец. Вот что в нем есть:”)
print(chest)
print(“Вы приобщили содержимое ларца к своему арсеналу.”)
inventory += chest
print(“Теперь в вашем распоряжении:”)
print(inventory)
input(“\n\nНажмите Enter, чтобы продолжить.”)
Изменяемость списков
Надо полагать, вас уже утомили бесчисленные фразы, общий смысл которых заключается в том, что список функционирует так же, как кортеж. До сих пор, если не считать замены круглых скобок квадратными, списки не проявили себя ничем новым по сравнению с кортежами. Но разница все же есть, и она огромна. Повторю: списки изменяемы. Отсюда следует, что со списками можно проделывать множество трюков, для которых кортежи непригодны.
Присвоение нового значения элементу, выбранному по индексу
Поскольку список изменяем, то любому его элементу можно присвоить новое значение:
# присваиваем значение элементу по индексу
print(“Вы обменяли меч на арбалет.”)
inventory[0] = “арбалет”
print(“Теперь ваш арсенал содержит следующие предметы:”)
print(inventory)
input(“\nНажмите Enter, чтобы продолжить.”)
В этом коде элементу списка inventory, имеющему индекс 0, присваивается значение
“арбалет”:
inventory[0] = “арбалет”
Это новое строковое значение замещает прежнее (“меч”). Как стал выглядеть список, показывает функция print, с помощью которой на экран выводится новая версия inventory.
Можно приписать новое значение существующему элементу списка, выбрав его по индексу, но создать этим способом новый элемент нельзя. Попытка приписать какое-либо значение элементу, которого ранее не существовало, вызовет ошибку.
Присвоение новых значений срезу списка
Разрешается присвоить новое значение не только отдельному элементу списка, но и срезу. Я присвоил срезу inventory[4:6] значение списка из одного элемента [“магический кристалл”]:
# приписываем значение элементам по срезу индексов
print(“За золото и драгоценные камни вы купили магический кристалл, способный предсказывать будущее.”)
inventory[4:6] = [“магический кристалл”]
print(“Теперь в вашем распоряжении:”)
print(inventory)
input(“\nНажмите Enter, чтобы продолжить.”)
Двум элементам списка — inventory[4] и inventory[5] — присваивается единое строковое значение “магический кристалл”. Поскольку одноэлементный список стал значением двухэлементного среза, длина последовательности inventory уменьшилась на единицу.