Внеурочное занятие по информатике. Пишем игру «Поле чудес» на Python.

Данная статья будет полезна для учителей информатики, которые занимаются программированием с детьми внеурочно. Опыт  показывает,  что написание даже простых консольных игр придает мотивации для изучения программирования у детей. Сегодня мы рассмотрим процесс написания консольной игры «Поле Чудес» на Python. Что необходимо знать, чтобы понимать, о чем идет речь:

  • Модуль Random
  • Словари
  • Циклы
  • Списки и строки

При написании программы не будут использоваться функции и ООП.

Часть 1

Моделирование игры — важная часть всего процесса. Без понимания того,  что должно получится, написание кода приведет к путанице.

Логика игры:

  1. Компьютер загадывает слово — выбирает пару «вопрос — ответ» из словаря или считывает из файла.
  2. Два игрока (для упрощения) по очереди вращают барабан, где может выпасть либо какое-то количество очков, либо «банкрот» (когда все очки сгорают), либо «переход хода следующему игроку»
  3. Игрок в свой ход может назвать букву или отгадать слово целиком. Если буква не отгадана, очки все равно зачисляются
  4. Если игрок отгадывает слово, от может потратить заработанные очки на призы (призы для усложнения задачи)
  5. Далее спрашиваем, будет ли супер игра?
  6. При положительном ответе задается финальный вопрос и предлагается назвать несколько букв (количество зависит от длины слова)
  7. Если вопрос отгадан — игрок получает супер-приз. В противном случае теряет все призы, заработанные ранее.

Часть 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&#91;i&#93;, " - ", gifts&#91;gifts_keys&#91;i&#93;&#93;)
    print("Выбирайте призы на заработанные очки. Введите номер приза и нажмите клавишу Enter")
    # список выбранных подарков
    my_gifts = &#91;&#93;
    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&#91;i&#93;, " - ", gifts&#91;gifts_keys&#91;i&#93;&#93;)

    else:
        print("У вас закончились очки")
        print("\nВот, что вы выиграли:", *my_gifts)

&#91;/python&#93;
<!-- /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("Спасибо за участие в игре. Увидимся")

Скачать файл программы (ZIP)

Andrey K

Share
Published by
Andrey K

Recent Posts

Решение задачи №6 и задачи №22 ЕГЭ по информатике 2021

Настала пора написать серию мини-обучалок по решению задач ЕГЭ по информатике версии 2021 года. В…

4 года ago

Основные алгоритмы в помощь школьнику. Часть 1

Рассмотрим набор наиболее часто встречающихся задач на программирование в школьном курсе информатики. Добавляйте свои задачи…

6 лет ago

Школьный тур Всероссийской олимпиады школьников по информатике 9-11 класс (2018-2019). Разбор задач. Часть 2

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

6 лет ago

Школьный тур Всероссийской олимпиады школьников по информатике 9-11 класс (2018-2019). Разбор задач. Часть 1

Закончился школьный тур Всероссийской олимпиады школьников. Разберем первую и вторую задачи тура, проводимого в московских…

6 лет ago

Школьный этап Всероссийской олимпиады школьников по информатике 2017 (9-11 классы). Задача №4. «Плацкартный вагон»

Задача. В плацкартном вагоне 54 места, пронумерованных числами от 1 до 54. Вагон разбит на 9…

7 лет ago

Школьный этап Всероссийской олимпиады школьников по информатике 2017 (9-11 классы). Задача №3. «Не про спиннеры»

Вот и закончился школьный тур Всероссийской олимпиады школьников. Как мне показалось, задания были несколько сложнее,…

7 лет ago