Рубрики
Без рубрики

Язык обучения, создавая мир текстовых приключений

Короткое введение в проектировании текстовых приключений в Python. Теги с Python, Gamedesign.

Недавно я начал маленький 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”