Вопрос или проблема
Я пытался придумать код для добавления предмета в мой инвентарь в текстовой игре, но пока не смог разобраться. Вот мой текущий код:
rooms = {
'Entrance': {'west': 'Catacombs A', 'north': 'Main Hall'},
'Catacombs A': {'east': 'Entrance', 'item': 'Lesser Artifact'},
'Main Hall': {'north': 'Great Hall', 'east': 'Catacombs B', 'south': 'Entrance', 'west': 'Necron Tomb',
'item': 'Dog Tags'},
'Necron Tomb': {'east': 'Main Hall', 'item': 'Supplies'},
'Catacombs B': {'west': 'Main Hall', 'north': 'Storage Room', 'item': 'Lesser Artifact'},
'Storage Room': {'south': 'Catacombs B', 'item': 'Supplies'},
'Great Hall': {'east': 'Repair Hub', 'south': 'Main Hall', 'item': 'Dog Tags'},
'Repair Hub': {'west': 'Great Hall', 'item': 'Necron Lord'} # Злодей
}
current_room = 'Entrance'
inventory = []
print('Вы являетесь членом отряда Ультрамаринов, который получил задание вернуть 6 предметов из '
'некроновского объекта на орбитальной планете, прежде чем доберется до Некронского Лорда. Вы и ваши братья прорываетесь через вход, куда вы пойдете первыми?')
def move_rooms(current_room, directions):
current_room = rooms[current_room]
new_room = current_room[directions]
return new_room
while True:
print('Вы находитесь в', current_room)
directions = input('Введите направление: north, east, south, west, get item, или exit.')
if directions in rooms[current_room]:
current_room = move_rooms(current_room, directions)
if directions == 'exit':
print('Вы провалили задание Императора и своих братьев...')
break
elif directions not in rooms[current_room]:
print('Вы не можете пойти в эту сторону.')
Я пробовал создать функцию для получения предмета, сделав это
def get_item(item, inventory):
if item in current_room:
inventory.append(item[current_room])
return inventory
Python выдал ошибку и попросил определить item, даже несмотря на то, что он находится в моем словаре rooms. Я совсем новичок в Python, поэтому у меня большие трудности, любая помощь будет высокой оценена!
Итак, я экспериментировал с этим и, кажется, нашел метод, который будет работать. Я сделал функцию, которая принимает currentroom и ваш инвентарь. Она будет искать в словаре этой комнаты, есть ли предмет, и если да, добавит его в таблицу инвентаря. Код выглядит следующим образом:
rooms = {
'Entrance': {'west': 'Catacombs A', 'north': 'Main Hall'},
'Catacombs A': {'east': 'Entrance', 'item': 'Lesser Artifact'},
'Main Hall': {'north': 'Great Hall', 'east': 'Catacombs B', 'south': 'Entrance', 'west': 'Necron Tomb',
'item': 'Dog Tags'},
'Necron Tomb': {'east': 'Main Hall', 'item': 'Supplies'},
'Catacombs B': {'west': 'Main Hall', 'north': 'Storage Room', 'item': 'Lesser Artifact'},
'Storage Room': {'south': 'Catacombs B', 'item': 'Supplies'},
'Great Hall': {'east': 'Repair Hub', 'south': 'Main Hall', 'item': 'Dog Tags'},
'Repair Hub': {'west': 'Great Hall', 'item': 'Necron Lord'} # Злодей
}
current_room = 'Storage Room'
inventory = []
items="item"
def get_item(currentroom, inventory):
roomtosearch = rooms[currentroom]
if items in roomtosearch:
found = roomtosearch[items]
inventory.append(found)
else:
print('Такой предмет не существует')
get_item(current_room, inventory)
print(inventory)
Вы можете добавить условие в свой цикл while true, что когда введено это направление, если оно “item”, то оно вызовет функцию get_item(), ищущую этот предмет в комнате. Например:
while True:
print('Вы находитесь в', current_room)
directions = input('Введите направление: north, east, south, west, get item, или exit.')
if directions in rooms[current_room]:
current_room = move_rooms(current_room, directions)
if directions == 'exit':
print('Вы провалили задание Императора и своих братьев...')
break
if directions == 'item':
get_item(current_room, inventory)
elif directions not in rooms[current_room]:
print('Вы не можете пойти в эту сторону.')
Я увидел ваш комментарий, провел еще несколько тестов и понял, что последовательность нарушена, потому что она ищет, есть ли предмет в комнате, а он есть, и если это проверка “item” выполняется, прежде чем запустить функцию get_item, она установит текущую комнату на предмет, что вызовет ошибку get_item. Решение этой проблемы заключается в том, чтобы переформулировать оператор get_item и проверить его перед moveroom, и если проверка get_item верна, она не будет запускать функцию moveroom. Мой новый код выглядит следующим образом:
while True:
print('Вы находитесь в', current_room)
directions = input('Введите направление: north, east, south, west, get item, или exit.')
if directions == 'item':
print(current_room)
get_item(current_room, inventory)
elif directions in rooms[current_room]:
current_room = move_rooms(current_room, directions)
print(current_room)
elif directions == 'exit':
print('Вы провалили задание Императора и своих братьев...')
break
elif directions not in rooms[current_room]:
print('Вы не можете пойти в эту сторону.')
Проверьте, правильно ли вы вводите данные для функции get_item и передается ли переменная item как список. Я думаю, что items используется как строка внутри словаря “rooms”, но индексируется как список в вашей определенной функции. (проблема в курсиве)
def get_item(item, inventory):
if item in current_room:
inventory.append(*item[current_room]*)
return inventory
Ответ или решение
Для того чтобы реализовать добавление предметов в инвентарь в текстовой игре, необходимо рассмотреть несколько ключевых моментов. Давайте пройдемся по важным компонентам и шагам, которые помогут вам настроить эту функциональность в вашем коде.
Определение структуры данных
Ваша структура данных для комнат уже прописана в виде словаря, что является отличным подходом. Следующим шагом будет добавление логики для взаимодействия с инвентарем:
rooms = {
'Entrance': {'west': 'Catacombs A', 'north': 'Main Hall'},
'Catacombs A': {'east': 'Entrance', 'item': 'Lesser Artifact'},
'Main Hall': {'north': 'Great Hall', 'east': 'Catacombs B', 'south': 'Entrance', 'west': 'Necron Tomb', 'item': 'Dog Tags'},
'Necron Tomb': {'east': 'Main Hall', 'item': 'Supplies'},
'Catacombs B': {'west': 'Main Hall', 'north': 'Storage Room', 'item': 'Lesser Artifact'},
'Storage Room': {'south': 'Catacombs B', 'item': 'Supplies'},
'Great Hall': {'east': 'Repair Hub', 'south': 'Main Hall', 'item': 'Dog Tags'},
'Repair Hub': {'west': 'Great Hall', 'item': 'Necron Lord'} # Villain
}
Реализация Инвентаря
Инвентарь можно реализовать через простой список:
inventory = []
Функция для получения предмета
Теперь создадим функцию get_item
, которая будет проверять, есть ли предмет в текущей комнате, и добавлять его в инвентарь, если он существует:
def get_item(current_room, inventory):
if 'item' in rooms[current_room]: # Проверяем, есть ли предмет в комнате
item = rooms[current_room]['item'] # Получаем предмет
inventory.append(item) # Добавляем в инвентарь
del rooms[current_room]['item'] # Удаляем предмет из комнаты
print(f'Вы взяли {item}.') # Подтверждение успешного получения предмета
else:
print('В этой комнате нет предмета для забирания.')
Реализация игрового цикла
Теперь нам необходимо интегрировать эту функцию в игровой цикл, добавив возможность пользователю вводить команду для получения предмета:
current_room = 'Entrance' # Начальная комната
while True:
print('Вы находитесь в', current_room) # Отображаем текущую комнату
directions = input('Введите направление: north, east, south, west или get item для получения предмета, exit для выхода: ')
if directions == 'get item': # Если вводится команда для получения предмета
get_item(current_room, inventory)
elif directions in rooms[current_room]: # Проверяем, можно ли переместиться
current_room = move_rooms(current_room, directions) # Переход в новую комнату
elif directions == 'exit': # Выход из игры
print('Вы покинули игру.')
break
else:
print('Вы не можете пройти в этом направлении.') # Ошибка при неправильном вводе
Оптимизация и завершение
Теперь у нас есть завершенная логика для перемещения между комнатами и получения предметов. Убедитесь, что в процессе игры вы предоставляете пользователю четкие сообщения, чтобы обеспечить интуитивное взаимодействие с игрой. Также подумайте о добавлении методов для просмотра текущего инвентаря или проверки, какие предметы доступны в конкретной комнате в будущем.
Данная стратегия не только позволит вам просто управлять инвентарем, но и создаст основу для расширения игры, добавляя новые функции и элементы в дальнейшем.