Цикл по вложенным словарям и спискам
пытаюсь сделать текстовый квест примерно из вот такого кода:
{"Location_1": ["Enemy10", {"Location_2": ["Enemy15",{"Location_10": [{"Exit": "Win"}]}]}]}
По факту словарь больше и более разветвлен, находится в отдельном json файле. Реализация должна заключаться в том, что нужно выбирать локации(ключ словаря), заходить в них, внутри будут враги, последние числа названий которых нужно суммировать, и также другие локации. Подскажите, какая конструкция должна быть у цикла по таким разветвлениям. Допустим, с помощью цикла фор попадаю в значения первой локации, и как далее реализовывать выбор элементов и последующие проходы в локации не соображу Более подробные правила:
На прохождение дается 100000 секунд. Цель - за отведенное время найти выход
По мере прохождения вглубь происходит затопление, поэтому в каждую локацию можно попасть только один раз, и выйти обратно нельзя (то есть двигаться можно только вперед).
Чтобы открыть выход и выбраться, нужно иметь не менее 300 очков опыта. Если до открытия время заканчивается - гг умирает, а игра начинается заново. Карта это json-файл. Локации в лабиринте описывается объектами, в которых находится единственный ключ с названием, соответствующем формату "Location_nm_tm", где N - номер локации, а T - это время, которое необходимо для перехода. Например, если игрок заходит в локацию "Location_8_1000", то он тратит на это 1000 секунд. По ключу находится список, содержащий строки с врагами а также другие локации. Описание врага представляет собой строку в формате "enemy_ex_tm", где K - количество опыта, которое получает игрок, уничтожив врага, а M - это время, которое потратит игрок для уничтожения врага. Например, уничтожив монстра "Boss_exp10_tm20", игрок потратит 20 секунд и получит 10 единиц опыта. Нужный путь только один. При каждом ходе игрока скрипт должен запоминать в csv файл следующую информацию:
- текущую локацию
- текущий опыт
- текущие дату и время
Ответы (1 шт):
Я только для удобства разделил цифры и названия, чтобы удобно было вычленять, но алгоритм можно любой сделать, например просто отрезать Enemy (если он присутствует в слове)
data = {"Location_1": ["Enemy_10", {"Location_2": ["Enemy_15",{"Location_10": [{"Exit": "Win"}]}]}]}
def analyze_object(object):
count = 0
# если объект - словарь, то проанализировать все значения словаря по ключу
if isinstance(object, dict):
for key in object:
count += analyze_object(object[key])
# если объект - список, то проанализировать все элементы списка
if isinstance(object, list):
for element in object:
count += analyze_object(element)
# если объект - строка, то вычленить числа
if isinstance(object, str):
word = object.split('_')
if len(word) == 2:
count += int(word[1])
return count
print(analyze_object(data))