Анатолий Адонин

Анатолий Адонин 

Разработка на Python / Renpy

372subscribers

84posts

Showcase

16

22 Последствия выборов и разные концовки в Renpy

В предыдущем уроке мы научились запоминать выбор игрока. Теперь, благодаря информации сохранённой в переменных, мы можем создать разные последствия в зависимости от этого выбора.
В программировании и в Renpy для этого используются условные операторы (if, elif, else), которые проверяют содержимое переменных и сравнивают, совпадают ли они с определёнными условиями.
Оператор if - в переводе с английского "если", является основным оператором. Он сравнивает переменную с условием, и если они совпадают, то выполняется определённое действие.
В примере мы создали новую переменную, которая запоминает, есть ли у героя ключ от двери спортзала. По умолчанию мы установили значение False. Это булево значение, которое бывает либо True (истина), либо False (ложь). Т.е. либо "да", либо "нет".
Далее в определённом месте игры персонаж может получить этот ключ. В нашем случае Совай отдаст ключ при выборе первого варианта ответа. Это изменение мы запомнили в переменной. Затем, независимо от выбора игрока сюжет может продолжаться линейно (без развилок).
В нужном месте игры мы делаем проверку с помощью условного оператора, который может добавить событие занятия в спортзале, либо пропустить его.
Условие if has_key == True: можно перевести на русский как: если (if) есть ключ - истина, то..
Т.е. условный оператор if смотрит значение, хранящееся в переменной и сравнивает со значением после == (равно). Если они совпадают, то происходят события внутри блока после двоеточия. Если не совпадают, то блок будет пропущен, и персонаж сразу пойдёт к Юзуки.
Итак, при выборе второго варианта переменная по-прежнему будет хранить значение False, поэтому во время проверки условие не сработает, так как False не равно True.
***
Частая ошибка новичков - это путаница символов = и ==. Не забываем, что один знак = это символ присвоения. Два знака == символ равенства.
$ has_key = True # Сохранили в переменной значение True (присвоили)
if has_key == True # Сравниваем значение внутри переменной со значением True
***
Оператор else - иначе / в другом случае. Выполняет блок кода, если предыдущее условие не сработало.
В примере выше, если (if) у Рея есть ключ, то он сможет позаниматься в спортзале. Произойдут события в блоке if has_key == True:
Блок else будет пропущен, потому что сработало предыдущее условие. После герой сразу отправится к Юзуки.
Если у Рея нет ключа, блок if has_key == True не сработает, и будут выполнены события в блоке else. Далее персонаж пойдёт к Юзуки. Т.е. нашу проверку теперь нужно понимать так:
Если есть_ключ, то...
Иначе, это..
Обратите внимание, что оператор else не делает каких-либо сравнений, он сразу выполняет действия, если предыдущие условия не работают.
***
Оператор elif - (сокращение от "else if" - иначе если) позволяет проверить дополнительные условия, если предыдущие оказались ложными.
Давайте создадим новую переменную "Сила Рея", которая будет хранить значение его силы.
В спортзале эту переменную мы можем увеличивать во время тренировок:
Т.е. при ежедневном посещении спортзала Рей может повышать свою силу. Теперь создадим событие, которое будет зависеть от силы героя.
На скриншоте у нас несколько проверок и события, которые произойдут в зависимости от силы персонажа. Вначале движок проверит больше или равна сила десяти:
if rei_strength >= 10:
Если сила персонажа 10 или больше - сработают события внутри блока if, а все остальные проверки будут пропущены.
Далее если сила окажется меньше десяти, события в блоке if пропускаются и происходит следующая проверка - больше или равна сила пяти. Если да - срабатывают события этого блока, а все остальные проверки пропускаются.
Если сила будет меньше пяти, произойдёт нижеследующая проверка. И так до конца всех проверок. Если ни одна из них не сработает - выполнится событие в блоке else.
***
Вложенные условные операторы - это конструкции if / elif / else, внутри другого условного блока. Они позволяют создавать многоуровневую логику принятия решений, где одно условие зависит от выполнения другого. Например, сначала проверяется, есть ли у персонажа ключ, а затем - подходит ли этот ключ именно к текущей двери.
Для примера создадим ещё одну переменную - сломанного ключа:
Далее сделаем вложенные условия:
В таком виде произойдёт проверка на наличие ключа у Рея. Если ключ есть, то произойдёт ещё одна проверка, поломан ключ или нет. Если поломан - Рей не попадёт в спортзал и отправится к Юзуки.
В другом случае - с ключом всё в порядке, Рей прокачает силу на +1 и отправится к Юзуки.
Вложенность даёт возможность моделировать сложные игровые ситуации с множеством зависимостей. При использования вложенности важно соблюдать отступы (табуляцию), так как RenPy, как и Python, определяет структуру кода именно по ним.
Внутри вложенных условий можно создавать другие вложенные условия. Однако стоит иметь в виду, что большое количество вложенностей может сделать код трудночитаемым. В таких случаях лучше вынести дополнительные проверки в отдельные блоки или использовать логические операторы and / or / not для упрощения условий.
***
Логические операторы and, or и not позволяют комбинировать несколько условий в одном выражении.
В примере выше мы записали то же самое условие, что и в примере с вложениями. Только теперь избавились от вложенности.
В условии с оператором and проверяются две и более переменных. Чтобы условие сработало - первая и вторая переменные должны быть равны указанным параметрам. Например:
if has_key == True and broken_key == False:
if rei_strength ==9 and has_key == True and uzuki_remembers == "park":
Для оператора or достаточно, чтобы всего лишь одна переменная отвечала нужным параметрам. Т.е. первая переменная или вторая.
if rei_strength ==9 or has_key == True or uzuki_remembers == "park":
Оператор not инвертирует результат проверки, превращая True в False и наоборот.
if has_key not False: # Если ключ не False
Оператор != (не равно) схож с оператором not
if rei_strength != 9: # Если сила Рея не равна 9-ти
Стоит иметь ввиду, что операторы следуют приоритету: сначала проверяется not (1), затем and (2), и только потом or (3). Для контроля порядка вычислений можно использовать круглые скобки. 
Комбинируя эти операторы, можно создавать гибкую и выразительную игровую логику без излишней вложенности.
***
Скрипт из урока:
rpy
if_elif_else.rpy3.29 Kb
***
Предыдущий урок:
21 Как запомнить выбор игрока в Renpy
Следующий урок:
23 Скрытые варианты ответов в Renpy
Subscription levels3

Личный состав

$1.05 per month
Участник экспедиции

Колонист

$2.78 per month
С комфортом до Бетельгейзе

Штурман

$5.6 per month
Штурмуем геймдев - Пошаговые уроки с нуля до профи
Учимся создавать игры на Renpy
Программируем на Python
Go up