Квест в консоли на Python. Часть 1
Дело было вечером, делать было нечего (с). Ну не то чтобы совсем нечего, но выдалась свободное немножко время, поэтому для того чтобы не забыть (да уж чего там, и вспомнить уже) окончательно Python, решил сделать маленький движёк для текстовых квестов с выполняющихся в консоли (квест в консоли).
Сначала определимся что где и как:
- Локации будем описывать в формате json
- Локации будем складывать в папку locations. Имена файлов — номер локации.
- В ходе квеста можно «сохраняться», чтобы была возможность продолжить квест
- Сохранения будем хранить в папке saves
- Все классы храним в папке classes
В результате у меня получилась такая структура папок и файлов:

Первым делом нарисую минимальный json стартовой локации:
{
"title": "Стартовая страница",
"description": "Стартовая страница описание",
"available_locations": {
"left": 1,
"right": 2,
"forward": 3,
"back": 4
}
}
Т.е. начинаем на стартовой локации (0), доступны переходы в локации 1,2,3 и 4.
Далее реализуем класс игрока, с реализацией функционала сохранения и стадии прохождения квеста:
from datetime import datetime as dt
import json
import os
class TPlayer:
data = {}
def __init__(self, name):
self.data["name"] = name # Имя пользователя
self.data["location"] = 0 # текущая локация
def load(self, filename):
"""
Загрузить состояние квеста из файла
:param filename: имя файла из папки saves
"""
f = open("saves/" + filename, mode='r', encoding='utf-8')
self.data = json.load(f)
f.close()
def list_saves(self):
"""
Показать доступные сохранения
"""
files = os.listdir("saves")
print(files)
def save(self):
"""
Сохранить текущее состояние пользователя
"""
time = dt.now()
filename = time.strftime("%d_%m_%Y_%H_%M") + ".save"
print(filename)
f = open("saves/" + filename, mode='w', encoding='utf-8')
json.dump(self.data, f)
f.close()
В главном файле (main.py), реализуем проверку аргументов командной строки и переход к началу квеста:
#!/usr/bin/env python3
# encoding: utf-8
import classes.player as tplayer
import classes.location as tlocation
import sys
player = tplayer.TPlayer("Васян")
location = tlocation.TLocation()
def start_location():
print(player.data["name"])
location.location_view(player.data["location"])
if __name__ == '__main__':
for param in sys.argv:
if param == "--load":
if len(sys.argv) == 2:
print("Ошибка: нет имени файла")
exit(0)
player.load(sys.argv[2])
start_location()
exit(0)
if param == "--new":
exit(0)
if param == "--list":
player.list_saves()
exit(0)
if len(sys.argv) == 1:
print("Для запуска квеста необходимо использовать следующие параметры:")
print(" --load - загрузить сохранение и начать квест")
print(" --list - получить список сохранений")
print(" --new <имя участника> - начать квест заново")
exit()
Разработка «квест в консоли» может быть действительно просто.. Вы можете посмотреть и другие мои статьи посвященные разработке на Python