По-хорошему это должно собираться под Linux. Из зависящих от платформы файлов тут только Server.h/cpp, где используются отсутствующие в стандарте C++14 функции для работы с сокетами. Также там используется pthread.h.
-
Сборка части на C++ (сервер) Перейдем в поддиректорию cpp:
$ cd cppСоздадим папку build и перейдем в нее:
$ mkdir build $ cd buildСама сборка:
$ cmake .. $ makeТаким образом в ./cpp/build у нас появился исполняемый файл ./main
-
Часть на Python (клиент и бот) Перейдем в py:
$ cd pyСоздадим виртуальную среду:
$ python3 -m venvПерейдем в нее:
$ source ./venv/bin/activateУстановим зависимости:
$ pip install -r requirements.txtВыйдем из окружения (опционально)
$ deactivate
Нужно последовательно выполнить два пункта. Важно, чтобы порт оказался одинаковым и свободным.
- Сервер
$ ./cpp/build/main <PORT> <N_WORKERS> <TIMEOUT> - Бот (потребуется токен)
$ source ./py/venv/bin/activate $ python3 ./py/main.py
- Игра происходит на квадратом лабиринте. Изначально он связен (даже без порталов), и в нем отсутствуют циклы (если убрать порталы). В лабиринте также существуют специальные виды клеток, о взаимодействии с которыми игроку будет дополнительно сообщаться.
- Игра, как это ни странно, состоит из ходов. Люди и медведи (NPC) ходят по очереди
- Каждый ход человек может сделать ровно одно из шести действий:
- Пропустить ход
- Идти. Об успехе операции вам сообщат. Операция успешна, если вы сдвинулись с места. Идти можно только на соседнюю клетку, где нет стены.
- Стрелять (при наличии патронов и если персонаж живой). Пуля летит по прямой, пока не встретит человека или медведя или стену. Попав в кого-то убивает всех, кто находится на этой клетке. Убитые медведи больше не участвуют в игре. Об успехе сообщат. Операция успешна, если вы в кого-то попали.
- Взорвать стену (при наличии бомб и если персонаж живой). Об успехе операции сообщат. Успешной операцией считается та, в результате которой количество стен уменьшилось.
- Попытаться выйти (если персонаж живой, у него есть сокровище, он на клетке выход. Клетка выход может быть в любом месте лабиринта). В случае успеха вы становитесь победителем.
- Сдаться. Вы больше не участвуете в игре. Ваше сокровище остается на той клетке, где вы были. Вас больше не будет на поле.
- Каждый игрок может закончить игру.
- Состояние игрока. Каждый человек характеризуется 4 показателями:
- Количество патронов. Патронами можно стрелять в свой ход по правилу 2.2. Патроны можно пополнить на клетке арсенал.
- Количество бомб. Бомбами можно взрывать стены. См. правило 2.3. Бомбы можно пополнить на клетке арсенал.
- Наличие сокровища. Только живой человек может переносить сокровище. Сокровище убитого человека остается на месте убийства, человек становится призраком, пока не найдет клетку больница.
- Жизнь. Игрок либо жив, либо мертв.
- Особые клетки:
- Выход. Только здесь можно выйти, используя правило 2.5.
- Арсенал. Здесь пополняются патроны и бомбы. Это происходит автоматически после вашего появления на клетке.
- Больница. Здесь человек может пополнить здоровье. Это происходит автоматически после вашего появления на клетке.
- Портал. Если в конце хода вы на нем, вы перемещаетесь на следующий портал (если вы на последнем, то на первый). Вам сообщат, если вы переместились.
- Сокровище. В одной из клеток изначально лежит сокровище. Может перемещаться из-за игроков (кто-то мог его взять, а потом быть застреленным или съеденным)
- Подсказки. Каждому игроку в начале хода говорят о наличии стен вокруг него, типе клетки под ним, состоянии игрока. В конце хода говорят об успехе операции и о том, переместился ли игрок.
- Все люди оставляют за собой след. Это последние несколько клеток, на которых был игрок. Его может видеть медведь.
- Медведь в игре.
- Кажлый ход медведь может либо идти в одном из направлений, либо атаковать игрока, который находится на клетке с ним.
- Застреленный медведь удаляется из игры и больше в ней не участвует.
- Медведь может использовать порталы. Намеренно этого делать не станет, но может случайно в них забрести или прийти туда, погнавшись за игроком.
- У медведя есть поле зрения. Он видит на определенном расстоянии по прямой следы игрока или его. Медведь не может видеть сквозь стены.
- Медведь не может видеть мертвых игроков или их следы.
- Увидев игрока, издает рычание и обязательно идет в этом направлении. Если игроков несколько, выбирает случайное из направлений на игроков равновероятно.
- Увидев след игрока, также подает какой-нибудь сигнал и идет в этом направлении, если не видит самого игрока. Если видит несколько клеток со следами, выбирает случайное направление на след.
- Медведь любит свою берлогу. Если медведь начинает отходить далеко от клетки спауна, вероятность его хода обратно начинает расти (если медведь не видит игрока или его след). Остальные допустимые направления равновероятны.
- При попадании в портал теряеется и чувствует себя немного неловко. Новой точкой спауна становится место, куда он телепортировался.