Данная статья будет полезна для учителей информатики, которые занимаются программированием с детьми внеурочно. Опыт показывает, что написание даже простых консольных игр придает мотивации для изучения программирования у детей. Сегодня мы рассмотрим процесс написания консольной игры «Поле Чудес» на Python. Что необходимо знать, чтобы понимать, о чем идет речь:
- Модуль Random
- Словари
- Циклы
- Списки и строки
При написании программы не будут использоваться функции и ООП.
Часть 1
Моделирование игры — важная часть всего процесса. Без понимания того, что должно получится, написание кода приведет к путанице.
Логика игры:
- Компьютер загадывает слово — выбирает пару «вопрос — ответ» из словаря или считывает из файла.
- Два игрока (для упрощения) по очереди вращают барабан, где может выпасть либо какое-то количество очков, либо «банкрот» (когда все очки сгорают), либо «переход хода следующему игроку»
- Игрок в свой ход может назвать букву или отгадать слово целиком. Если буква не отгадана, очки все равно зачисляются
- Если игрок отгадывает слово, от может потратить заработанные очки на призы (призы для усложнения задачи)
- Далее спрашиваем, будет ли супер игра?
- При положительном ответе задается финальный вопрос и предлагается назвать несколько букв (количество зависит от длины слова)
- Если вопрос отгадан — игрок получает супер-приз. В противном случае теряет все призы, заработанные ранее.
Часть 2.
Приступим к написанию игры.
Сначала создадим банк вопросов для основной игры и банк вопросов для финала (более сложных)
У нас два варианта, чтобы создать базу вопросов:
- база вопросов в виде словаря
- база вопросов, записанных в файл
Рассмотрим создание базы вопросов в виде словаря:
import random # база вопросов в виде словарей questions_main = { "Язык программирования (русским алфавитом)": "фортран", "Устройство вывода информации": "принтер", "Электронная схема, управляющая внешним устройством": "контроллер", "Разъемы подключения внешних устройств": "интерфейс" } questions_final = { "Тип пометки, используемый для быстрого нахождения пользователей и фотографии": "хэштег", " Процесс разметки компьютерного диска — разбиения его на логические части сектора, дорожки и их пометка": "форматирование", "дин из простейших логических элементов, который преобразует значение в другое ему противоположное": "инвертор", "Наука об общих свойствах процессов управления в живых и неживых системах": "кибернетика" }
Теперь компьютер должен выбрать случайный вопрос из базы, вывести его на экран, а ответ на вопрос представить в виде символов * (количество звездочек равно количеству букв в слове) и так же показать их игрокам
Для того, чтобы играть было интереснее, добавим ведущего, который будет приветствовать игроков и давать комментарии. Получим следующее:
# приветственное слово ведущего print("Добро пожаловать на игру Поле чудес.\n\ Вам предстоит ответить на вопрос и если повезет выиграть супер приз") print("Внимание!\n") # выбираем случайный вопрос question_main = random.choice(list(questions_main.keys())) # ответ на выбранный вопрос answer_main = questions_main[question_main] # создаем переменную для хранения списка звездочек star_answer = [] for i in range(len(answer_main)): star_answer.append("*") print("Вопрос:", question_main) print(*star_answer)
С помощью метода random.choice() мы выбираем случайный вопрос (вопросы являются ключами словаря) в словаре questions_main.
Ответ на выбранный вопрос сохраняем в переменную answer_main (в словаре questions_main находим значение по ключу question_main)
Ответ на вопрос нам показывать нельзя. Его необходимо заменить символами *.
Так как в процессе отгадывания звездочки должны заменяться буквами, необходимо хранить их в виде списка, а не в виде строки (строка — неизменяемый тип в Python).
Для этого мы создаем список star_answer, в который записываем столько звездочек, сколько букв в загаданном слове. Ну и выводим на экран вопрос и загаданное слово в виде звездочек.
Часть 3.
Так как на барабане (который вращают игроки) лишь ограниченное количество значений, реализуем его в виде списка (можно использовать кортеж)
# список возможных очков при вращении барабана scores = [100, 200, 300, 400, 500, 0, "next", "Б"]
Вы можете создать больше возможных значений, а также, к примеру, сектор ПРИЗ)))
next — переход хода к следующему игроку
Б — банкрот (все набранные очки сгорают и ход переходит к другому игроку)
Теперь реализуем процесс вращения барабана игроками, который показывал бы случайное количество баллов.
Так как игроков в нашем случае двое, то нам нужно создать две переменные для хранения набранных очков.
- score1 — очки первого игрока
- score2 — очки второго игрока
Для реализации вращения барабана и отгадывания букв нам понадобится цикл while, так как количество ходов неизвестно. Создадим переменную gameOver = False, которая будет сигнализировать об окончании игры при разгадывании слова, если изменит свое значение на True.
Также необходимо завести переменную, отслеживающую какой игрок ходит — первый или второй (player).
Если player четное — значит речь идет об Игроке-1, если нечетное — значит об Игроке-2.
Вот такой получился код данной части программы:
score1 = 0 score2 = 0 gameOver = False player = 0 break_main = False # значение изменится на True, если кто-то ошибся, называя слово целиком while not gameOver: # Слова ведущего if player % 2 == 0: print("\nИграет Игрок-1") else: print("\nИграет Игрок-2") print("Готовы ли вы назвать слово целиком? Введите 'да' или нажмите любую клавишу") if input().lower() == "да": print("Назовите слово целиком") answer = input().lower() if answer == answer_main: print("Поздравляю, вы ответили правильно!") print("Ответ", answer_main) break else: print("К сожалению, вы ошиблись. Вы проиграли") if player % 2 == 0: print("Победил Игрок-2") print("Набранное количество очков", score2) break_main = True else: print("Победил Игрок-1") print("Набранное количество очков", score1) break_main = True break else: print("Вращайте барабан") play_score = random.choice(scores) if play_score == "next": print("Ход переходит к другому игроку") player += 1 continue elif play_score == "Б": print("У вас банкрот. Очки сгорают, а ход переходит к другому игроку") if player % 2 == 0: score1 = 0 player += 1 continue else: score2 = 0 player += 1 continue else: print("Вы заработали", play_score, "очков") if player % 2 == 0: score1 += play_score else: score2 += play_score print("Назовите букву") letter = input() nxt_plr = False for i in range(len(star_answer)): if letter == answer_main[i]: nxt_plr = True star_answer[i] = letter if nxt_plr == True: print("Вы отгадали. Откройте пожалуйста такие буквы в слове") print(*star_answer) else: player += 1 print(*star_answer) win_score = 0 if break_main == False: # если никто не ошибся, называя слово целиком if player % 2 == 0 and break_main == False: print("Победил Игрок-1") print("Набранное количество очков", score1) win_score = score1 else: print("Победил Игрок-2") print("Набранное количество очков", score2) win_score = score2
play_score — переменная, в которой храниться выпавшее значение (очки) барабана.
При вводе слов используется метод lower(), чтобы было неважно, в каком регистре пользователь вводит буквы (заглавные или строчные).
Переменная nxt_plr отвечает за то, будет ли переход хода другому игроку или нет (принимает значение False/True)
Определять, какой игрок ходит в данный момент через четность переменной player может быть не самый лучший вариант. Можете реализовать по-своему и поделиться в комментариях.
Часть 4.
Реализуем выбор призов на заработанные очки.
Создадим словарь вида: очки — приз.
Например
- 100 — Блокнот
- 200 — Тетрадь общая
- 300 — Калькулятор
- 500 — Флешка
- 1000 — Мини плеер
- 1500 — Телефон
- 2000 — Планшет
- 2500 — Сотовый телефон
или что-то другое:)
# список возможных подарков gifts = {100: "блокнот", 200: "общая тетрадь", 300: "калькулятор", 500: "Флешка", 1000: "mp3-плеер"}
Теперь сделаем так, чтобы игрок видел лишь те призы, на которые ему хватает очков и мог их выбирать. При этом, выбрав приз, количество имеющихся очков должно уменьшаться.
# отсортированный список ключей словаря gifts_keys = sorted(list(gifts.keys())) my_gifts = [] if win_score == 0: print("У вас ноль очков. Увы, вы без подарков") else: for i in range(len(gifts_keys)): if gifts_keys[i] <= win_score: print(i + 1, ") ", gifts_keys[i], " - ", gifts[gifts_keys[i]]) print("Выбирайте призы на заработанные очки. Введите номер приза и нажмите клавишу Enter") # список выбранных подарков my_gifts = [] while win_score > 0: num = int(input()) print("Вы добавили себе в корзину", gifts[gifts_keys[num - 1]]) my_gifts.append(gifts[gifts_keys[num - 1]]) win_score -= gifts_keys[num - 1] for i in range(len(gifts_keys)): if gifts_keys[i] <= win_score: print(i + 1, ") ", gifts_keys[i], " - ", gifts[gifts_keys[i]]) else: print("У вас закончились очки") print("\nВот, что вы выиграли:", *my_gifts) [/python] <!-- /wp:shortcode --> <!-- wp:paragraph --> <p><strong>Часть 5.</strong></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>Осталось включить в игру супер-иргу на супер-приз!<br>Если игрок положительно отвечает на предложение сыграть в супер игру, выбирается случайный вопрос из <strong>questions_final<br></strong>Далее код программы похож на описанный в Части 3. Отсутствует вращение барабана и нет противника, которому переходит ход. Финалист называет буквы (их количество подсчитывается автоматически). Далее звездочки заменяются буквами, если таковые есть в слове. Остается отгадать слово целиком или принять поражение и попрощаться с выигранными подарками.</p> <!-- /wp:paragraph --> <!-- wp:shortcode --> # супер игра print("Готовы ли вы рискнуть всем и сыграть со мной в супер игру? Да или нет?") super_yes_no = input() if super_yes_no.lower() == "да": print("Вы согласились сыграть в Супер игру и получить супер приз") # выбираем случайный вопрос из списка финальных вопросов question_final = random.choice(list(questions_final.keys())) print("Финальный вопрос: ", question_final) answer_final = questions_final[question_final] star_answer = [] for i in answer_final: star_answer.append("*") print(*star_answer) print("Вы можете открыть в этом слове букв - ", len(star_answer) // 2 + 1) for i in range(len(star_answer) // 2 + 1): letter = input() for j in range(len(star_answer)): if answer_final[j] == letter: star_answer[i] = letter print(*star_answer) print("Итак, ваше слово") # вводим слово целиком word = input() if word == answer_final: print("Вы супер-человек, вы гений, вы победитель супер игры и супер-приз ваш.\n И все подарки ваши") else: print("Увы, но вы все проиграли. Но вы пытались и это достойно уважения!") else: print("Поздравляю вас с победой. Но вы не абсолютный чемпион!") if len(my_gifts) == 0: print("Вы ничего не забираете домой") else: print("Вы ничего забираете домой:", *my_gifts) print("Спасибо за участие в игре. Увидимся")