Используем условия для создания квеста с ветвлением

Условный оператор

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

По сути условный оператор - это команда ЕСЛИ. Если условие верно, выполняется одная часть кода, иначе - другая.

По английски ЕСЛИ - это if, поэтому условный оператор обозначается ключевым словом if. Записывается условный оператор следующим образом:


любой код до условного оператора

if условие:
        код в случае правильности условия
        код в случае правильности условия
        код в случае правильности условия
else:
        код в случае неправильности условия
        код в случае неправильности условия
        код в случае неправильности условия

любой код после условного оператора

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

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

а) Код внутри веток ДА и НЕТ условного оператора отделен пробелами или символами табуляции от остального кода.
б) Если условный оператор вложен в другой условный оператор, размер отступа увеличивается.
в) В одном блоке отступы должны быть одинаковыми и содержать либо только пробелы, либо только табуляцию.

Если ветка "Нет" пуста, else можно не писать. Если сомневаешься, что использовать, табы или пробелы, просто всегда ставь 4 пробела (или не мешай IDLE делать это за тебя 🙂 ).

Пример из урока про алгоритмы будет записан следующим образом:

Код:

time = int(input("Который час? "))
if time > 12:
    print("Добрый день!")
else:
    print("Доброе утро!")

Условия в условном операторе

В условном операторе нам доступны все стандартные для математики операции сравнения переменных:

a > b  # a больше b
a >= b  # больше либо равно
a < b  # меньше
a <= b # меньше или равно
a == b # равно! не путай с = - оператором присваивания
a != b # не равно

Также можно использовать логические операции and, or и not.

  • Операция and соединяет два цельных условия, и верна тогда, когда оба эти условия верны.
  • Операция or также соединяет два цельных условия, но верна тогда, когда верно хотя бы одно из двух условий.

Пример:

print("Добро пожаловать!")
temperature = int(input('Сколько там градусов? '))
is_raining = input('Идет дождь (да/нет)? ')

if is_raining == "нет" and temperature >= 20:
    print("Иди гуляй, че как сыч сидишь!")
else:
    print("Можно и дома посидеть...")

Если арифметические операции применяются к числам, то логические - к высказываниям, утверждениям, которые могут быть истинными или ложными (например, "на часах больше 13 часов"). Если попробовать написать вот так...

temperature = int(input())

if temperature > 15 and < 23:
    print("Температура комфортная")

...то работать ничего не будет. Логический оператор and тут разделяет temperature > 15 и < 23. А < 23 - это не высказывание!

Правильный вариант:

temperature = int(input())

if temperature > 15 and temperature < 23:
    print("Температура комфортная")

Кстати, в примере выше программа даже не запустилась, сообщив, что в коде синтаксическая ошибка. До этого мы уже успели встретиться с ошибкой времени выполнения (когда пытались прибавить число к строке). По аналогии с уроками русского языка, синтаксическая ошибка - это когда написано не правильно ("карова доет малако"), а ошибка времени выполнения - когда невозможно сделать то, что ты просишь (пингвин лети...). Обычно синтаксические ошибки поймать и исправить куда проще, т.к. IDLE сразу подчеркнет место, в котором что-то написано не так.

Вложенные условия

А что делать, если мы заходим добавить еще один вариант - если жарко, предложить погулять под дождем? На самом деле никто не запрещает нам писать условный оператор внутри другого условного оператора.

print("Добро пожаловать!")
temperature = int(input('Сколько там градусов? '))
is_raining = input('Идет дождь (да/нет)? ')

if is_raining == "нет" and temperature >= 20:
    print("Иди гуляй, че как сыч сидишь!")
else:
    print("Можно и дома посидеть...")
    if is_raining == "нет" or temperature >= 23:
        print("Ну вообще и прогуляться можно...")
    else:
        print("Го в КС, я создал!")

Главное не забыть, что для каждого вложенного условного оператора нужно увеличивать отступ, чтобы питон не запутался. Если в первом условном операторе мы сделали отступ в 4 пробела (IDLE нам в этом помог), то во вложенном отступ будет уже 8 (и IDLE снова поможет). Если добавить еще один - отступ будет уже 12. Но лучше не увлекаться, иначе код станет нечитаемым и ты сам в нем скоро запутаешься...

Что делать? Можно уменьшить вложенность кода (один if у нас включен в блок else), используя оператор elif - сокращение от else и if (если... иначе если... иначе...).

print("Добро пожаловать!")
temperature = int(input('Сколько там градусов? '))
is_raining = input('Идет дождь (да/нет)? ')

if is_raining == "нет" and temperature >= 20:
    print("Иди гуляй, че как сыч сидишь!")
elif is_raining == "нет" or temperature >= 23:
    print("Ну вообще и прогуляться можно...")
else:
    print("Го в КС, я создал!")

Если elif много, питон будет по очереди проверять все варианты в условном сверху вниз (ты же уже понял, что программы всегда работают сверху вниз?), пока не найдет подходящий. Если не найдет - выполнит else.

Как и с арифметическими операциями, явно нужно попрактиковаться!


Дано целое число n. Выведите следующее за ним четное число.

Как должно работать:

Что выводит программа?Что вводим?
65
124122

После очередного успеха на олимпиаде Никита и Кирилл решили открыть собственный бизнес. Бизнес не простой, а золотой — продажа яблок сорта Golden.

Миллионер Семён решил порадовать любимую мамочку — купить ей вкусных яблок. Он пришёл на импровизированный рынок НиК, где работали Никита и Кирилл. Семён решил купить все яблоки, благо денег у него хватает.

Продав все яблоки, Никита и Кирилл стали считать прибыль. Известно, что Никита продал A яблок по M тугриков, а Кирилл продал B яблок по N тугриков. К сожалению, с математикой у ребят плохо, поэтому они хотят узнать у вас, кто же получил бОльшую прибыль.

Числа A,B,M,N вводятся пользователем.

Как должно работать:

Что выводит программа?Что вводим?
A:
M:
B:
N:
Никита заработал больше
5
1000
6
500
A:
M:
B:
N:
Кирилл заработал больше
5
1000
10
8000
A:
M:
B:
N:
Никита и Кирилл заработали поровну
5
1000
10
500

Красная Шапочка часто навещает свою бабушку. Но она очень боится, что рано или поздно ее бабушку опять навестит волк. Поэтому она решила договориться с Лесничим об охране бабушки. Лесничий согласился охранять бабушку за 10 пирожков.

Узнав об этом, волк сказал Красной Шапочке, что ей совершенно незачем тратить пирожки на Лесничего. За половину тех пирожков, которые Красная Шапочка несет бабушке, Волк пообещал не трогать ее.

Мама испекла несколько пирожков, и попросила Красную Шапочку отнести их бабушке. Требуется определить, кому выгоднее платить пирожки за спокойствие бабушки.

Что выводит программа?Что вводим?
Кому платить:
Лесничий
50
Кому платить:
Волк
5
Кому платить:
Волк
19
Кому платить:
Лесничий
20

Генерация случайных чисел

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

Генерация случайных чисел доступна в модуле random (уже третий модуль, с которым мы сталкиваемся!), который нужно импортировать в начале программы.

Код:

import random

points = random.randint(1, 100)
print("Очков на барабане: ", points)

if points > 80:
    print("А-а-а-автомобиль!")
else:
    print("Всего лишь банка с огурцами.")

Результат:

Очков на барабане:  70
Всего лишь банка с огурцами.

Для тренировки можно написать программу, в которой пользователю предлагается с первого раза угадать число от 1 до 10. Если пользователь угадал, программа поздравляет его с выигрышем!

Пишем альфа-версию квеста!

Если ты решил задачи в этом уроке, то скорее всего уже более-менее уверенно обращаешься с условным оператором. А значит можно смело приступать к квесту с ветвлением!

Сейчас уже можно придумать полноценный и реализовать небольшую его часть. Кода должно хватать минимум на 30 секунд игры, попробуй добавить несколько сюжетных развилок и случайных событий (с рандомом!).

Удачи! 😉