1)Чтобы что-то случилось/не случилось, удобно использовать флаги с помощью типа Boolean;
Пример:
if x>1:
no_step_2 = True
if (x<3) and no_step_2:
//Этот код случится только при совпадении двух условий сразу => только при целом значении 2
2)Не стоит писать в таком формате текстовый квест в принципе, лучше сформировать полноценную функцию шага и хранить прогресс прохождения отдельно, по нему извлекать данные этого этапа и ответы из массива строк (JSON отлично подойдет).
Продемонстрирую простейшую реализацию такого подхода:
stages = [
["Вы на краю скалы, совершить прыжок?", "ДаTD1", "НетTD2"],
["Вы превратились в мокрое место у подножия. Зачем?"],
["Ваша жизнь скучна. Но все еще существует", "Я передумал, мне стоит прыгнуть?TD0", "Спуститься той же дорогой, которой пришел сюдаTD3", "Постоять еще немногоTD2"],
["Споткнулись и покатились вниз. Жаль"]
]
k = 0
play = True
def endgame():
print('Игра окончена')
def player(x):
if len(x)>1:
print(x.pop(0))
count = 1
moves = []
for i in x:
td = i.split(sep="TD")
moves.append(int(td[1]))
print(count, '. ', td[0])
count += 1
nextStep = int(input('>>> '))
stage = int(moves[nextStep-1])
return stage
else:
print(x[0])
return 666
while play:
a = stages[k].copy()
k = player(a)
if (k == 666) or (k > len(stages)-1):
play = False
endgame()
- В примере TD является разделителем, после которого я указываю шаг, к которому следует перейти в случае выбора данного варианта ответа.
- Система гибко отобразит любое нужное число ответов и преобразует их в следующий элемент диалога, что позволяет не тратить много времени на создание веток и циклов.
- И, конечно, здесь все еще многое стоит улучшить. Например, вынести массив stages отдельным файлом, сделать словари вместо строк, обеспечить дополнительные интерфейсные возможности (например, картинки или меню).
- Отсутствие вариантов ответа в выбранном элементе массива автоматически сделает данный вариант концовкой.