Недавно я начал маленький Python Project – текстовые приключения. Жанр старый как компьютеры, этот тип игр очень прост в разработке, а процесс – это награждение обучения и творческого опыта.
Современные языки позволяют процедуру программирования быть рядом с безболезненным. Это не значит, что вы можете быть LAX в дизайне и планировании мира и базового кода. Он позволяет вам постепенно заполнить вашу вселенную объектами, новые способы игроки могут взаимодействовать с ними, создавать квесты и головоломки.
Здесь я хотел бы показать первые несколько шагов процесса, как объектно-меньше пустоты заполнены новыми элементами.
Дизайн игры – это комната для побега. Персонаж игрока находит себя в лаборатории с закрытой дверью. Чтобы выиграть игру, им придется взаимодействовать с объектами, найдя способ открыть дверь и выйти из лаборатории. Каждая попытка взаимодействовать с миром считается «поворотом». Игрок взаимодействует с миром, набрав команды на английском языке. Игра бежит в терминале.
Начнем с простой реализации, где игрок может либо Смотри
или Выйдите из лаборатории
для победы:
def parseInput(s): if s == "look": return True, "You are in the middle of laboratory. There is a lot of equipment and door leading outside" elif s =="exit the lab": return False, "Congratulations, you've escaped the lab!" else: return True, "Sorry, I don't know what you mean." game = True turns = 0 while game: inp = raw_input(">") # here we ask user to type something turns += 1 game, result = parseInput(inp) print ("%d$\n%s" % (turns, result)) # this is called String Formatting print "Game over."
Теперь мы можем начать добавлять некоторые объекты в комнату. Скажем, ключ сидит на столе ящик.
Давайте начнем добавлять некоторые объекты в объектно-ориентированной моде. Объект
это класс, который будет конвертировать все в этом маленьком мире, в том числе самих характер. Для начала мы хотим иметь возможность назвать объекты, хранить вещи внутри объектов и иметь возможность увидеть, что внутри объектов.
class Object(): def __init__(self,description): self.contents = [] self.description = description def add_item(self,item): self.contents.append(item) return True def remove_item(self,item): if item in self.contents: self.contents.remove(item) return True else: return False def inspect(self): return "\n".join(map(lambda x: x.description, self.contents))
На этом этапе мы уже узнаем о маленькой магии современных языков, а именно карта
: Это позволяет нам построить список элементов внутри данного объекта, повернув список объектов в список их описаний. Мы также использовали анонимную (Lambda) функцию здесь, что чрезвычайно полезный практический инструмент.
# if items are: [red hat, blue apron, green sunglasses] # then map(lambda x: x.color, items) # equals to [red, blue, green]
Посмотрим, что есть Объект
Класс позволяет нам делать:
from Object import Object room = Object('Big laboratory room with one door') desk = Object('Desk with one drawer') drawer = Object('Drawer with some stuff inside') desk.add_item(drawer) key = Object('Key to the door') papers = Object('Bunch of useless papers') drawer.add_item(key) drawer.add_item(papers) player = Object('You, trying to escape this weird place') room.add_item(desk) room.add_item(player)
Этот код, который выглядит совершенно читаемо для меня, создает комнату, создает несколько предметов в нем и помещает их в правильные контейнеры. Теперь, если вы хотите посмотреть, что находится внутри комнаты, вы можете просто позвонить Room.inspect ()
И получить список предметов Описание в комнате:
if s == "look": room_description = "You are in the middle of laboratory. There is a lot of equipment and door leading outside.\nIn this room:\n" room_description += room.inspect() return True, room_description # >look # 1$ # You are in the middle of laboratory. There is a lot of equipment and door leading # outside. # In this room: # Desk with one drawer # You, trying to escape this weird place
Давайте закончим нашу комнату побега, укрепляя дверь. Это не должно быть так легко выйти, поэтому мы создадим новый объект и подключаем его к миру:
door = Door('Door leading to freedom', key) room.add_item(door) [...skipped...] elif s =="exit the lab": if door.opened: return False, "Congratulations, you've escaped the lab!" else: return True, "Door is closed"
Теперь, черт возьми, это Дверь
объект? Ну, это возможность узнать о наследстве в Python. Объект выглядит так:
from Object import Object class Door(Object): def __init__(self,description,key): # Door is just another Object, so we initialize it as such Object.__init__(self,description) # but also Door has unique properties, such as key that unlocks this particular door self.key = key self.unlocked = False self.opened = False def open(self): if self.unlocked: if not self.opened: self.opened = True return "Door is now open" else: return "Door is already open" else: return "Door is locked" def unlock(self, who): if self.key not in who.contents: return False else: self.unlocked = True return True
Теперь я пойду завтракать и остановить этот пост на наблюдении. В этом коде, когда кто-то пытается разблокировать дверь, Дверь
сам проверяет, имеет ли этот человек правильный ключ. Это как это должно быть? На практике это будет выглядеть так:
door.unlock(player)
Или, может быть, игрок должен проверять, есть ли у них ключ?
player.unlock(door)
Есть третий вариант, добавляя какой-то Взаимодействие
объект, который проверит все необходимые требования к действию, так что нам придется писать
world.unlock(what, who)
Это важный вопрос об общем программировании: как отделить ответственность объектов, и почему один вариант лучше другого. Я постараюсь исследовать эту проблему в двух частях, тем временем здесь есть Github Link в текущую игру, описанную здесь
Краткий список тем, упомянутых здесь:
- Чтение ввода пользователя
- создание класса
Карта
и анонимные функции- Наследование класса
- разделение ответственности
Оригинал: “https://dev.to/aandreev0/learning-language-by-creating-world-of-text-based-adventure-a5g”