Квест в консоли на Python. Часть 1
Дело было вечером, делать было нечего (с). Ну не то чтобы совсем нечего, но выдалась свободное немножко время, поэтому для того чтобы не забыть (да уж чего там, и вспомнить уже) окончательно Python, решил сделать маленький движёк для текстовых квестов с выполняющихся в консоли (квест в консоли).
Сначала определимся что где и как:
- Локации будем описывать в формате json
- Локации будем складывать в папку locations. Имена файлов — номер локации.
- В ходе квеста можно «сохраняться», чтобы была возможность продолжить квест
- Сохранения будем хранить в папке saves
- Все классы храним в папке classes
В результате у меня получилась такая структура папок и файлов:
Первым делом нарисую минимальный json стартовой локации:
1 2 3 4 5 6 7 8 9 10 |
{ "title": "Стартовая страница", "description": "Стартовая страница описание", "available_locations": { "left": 1, "right": 2, "forward": 3, "back": 4 } } |
Т.е. начинаем на стартовой локации (0), доступны переходы в локации 1,2,3 и 4.
Далее реализуем класс игрока, с реализацией функционала сохранения и стадии прохождения квеста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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), реализуем проверку аргументов командной строки и переход к началу квеста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/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