Войти
ПрограммированиеФорумВеб

PHP / MUD / Построение карты

Страницы: 1 2 Следующая »
#0
(Правка: 11:57) 11:45, 20 мар. 2021

Добрый день!

Сколько не гуглил, не смог найти каких то исходников на php.
Очень интересует вопрос, как грамотно реализовать на php передвижение по миру как в MUD, то есть на север/запад/юг/восток/вверх/вниз, и как хранить карту в базе данных.

К примеру интерфейс - Изображение
И карта - Изображение
То есть каждое передвижение - переход по одной локации. Никаких картинок или графических движков. Все карты соответственно НЕ полигон 1000на1000 комнат, а вот такие вот лабиринты.

Интересует как такое реализовать, и как организовать хранение карты в том числе если комнат будет несколько тысяч.
К примеру возьмем такую карту:
Изображение
Храниться она будет как ассоциативный массив, где первое - уникальный id комнаты, а далее пути, куда можно идти, если false то проход запрещен (Пример, я лучшего не придумал...):

$worldMap = [
  1 => ['south' = false, 'north' = 4, 'west' = false, 'east' => 2, 'up' => false, 'down' => false, 'description' => 'Самая левая нижняя комната'],
  2 => ['south' = false, 'north' = 5, 'west' = 1, 'east' => 3, 'up' => false, 'down' => false, 'description' => 'Комната с канделябрами'],
  3 => ['south' = false, 'north' = false, 'west' = 2, 'east' => false, 'up' => false, 'down' => false, 'description' => 'Самая правая нижняя комната'],
  4 => ['south' = 1, 'north' = 6, 'west' = false, 'east' => 5, 'up' => false, 'down' => false, 'description' => 'Центраяльная левая комната'],
  5 => ['south' = 2, 'north' = 7, 'west' = 4, 'east' => false, 'up' => false, 'down' => false, 'description' => 'Центр здания'],
  6 => ['south' = 4, 'north' = false, 'west' = false, 'east' => 7, 'up' => false, 'down' => false, 'description' => 'Левая северная комната'],
  7 => ['south' = 5, 'north' = false, 'west' = 6, 'east' => 8, 'up' => false, 'down' => false, 'description' => 'Задняя часть дома с окном'],
  8 => ['south' = false, 'north' = false, 'west' = 7, 'east' => false, 'up' => false, 'down' => false, 'description' => 'Правая северная комната'],
];
То думаю не логично если при каждом переходе с локации придется каждый раз подгружать всю базу данных карты которая может быть десятки тысяч локаций. Допустим если реализовать переход в обработчике маршрутов, допустим так site.com/world.php?goToRoomId=3, то таким образом придется делать запрос к БД для начала узнав текущее местоположение, и посмотреть пути, куда можно идти и соответственно сделать активные ссылки. Но при таком подходе простой post/get запрос можно подделать на стороне клиента и телепортировать игрока куда угодно что является грубым нарушением. Да и к тому же если локаций будет несколько тысяч, то одновременный запрос 10-20 игроков при переходах на другие локации я думаю будет сильной нагрузкой и низкой производительностью.

Ребят подскажите может есть какие то наработки на php?

Заранее спасибо


#1
(Правка: 13:59) 13:55, 20 мар. 2021

Сейчас надаю советов не по теме:

- Бери готовый движок MUD, их много, они хорошо проработанные и продуманные. Хотя бы просто попробуй на готовом сделать что-то элементарное, а потом уже делай своё.
- Не загоняйся по оптимизации, совсем не загоняйся, на этом этапе разработки главное получить рабочий прототип. Его потом и будешь по частям оптимизировать.
- Делать MUD (если ты именно его имеешь в виду) на HTTP протоколе — не лучшая идея. Нужно realtime взаимодействие, а HTTP в этом плане не очень хорош.
- Как хранить комнаты в базе не принципиально. Делай сервис, который постоянно крутится и обрабатывает команды игроков. Карту храни в локальной памяти сервиса, так, чтобы она загружалась только при его запуске или при обновлении данных карты админами. Она же у тебя статическая.

>придется делать запрос к БД для начала узнав текущее местоположение, и посмотреть пути, куда можно идти и соответственно сделать активные ссылки.
И это правильно. Просто не надо к БД постоянно лазать, для этого кэш и придумали. Хотя и в БД можно — это мизерная награзука будет скрее всего.

>может есть какие то наработки на php?
На GitHub есть поиск: https://github.com/search?l=PHP&o=desc&q=MUD&s=stars&type=Repositories

#2
14:10, 20 мар. 2021

Tiendil
Большое спасибо за советы!
Как раз хочу что то готовое глянуть, какую то основу взять. Мне для начала надо реализовать карту и передвижение по ней. Никаких клиентов/telnet и прочего не хочу использовать. Чистый php и браузер, бд. Есть в принципе примеры как бывший tale.ru / xin.ru вот там точно нужное мне передвижение по миру было.

Долго искал наработки но ничего толкового не нашел, скорее всего криво искал так как постоянно что то не то попадалось.

Посмотрю по вашей ссылке, может что то будет

#3
16:35, 20 мар. 2021

JanCarlo
> MUD на HTTP - плохая идея
Попробуй WebSocket

#4
20:40, 20 мар. 2021

egoros7
Еще не изучал, но первые гуглозапросы и статьи на хабре подсказывают, что это довольно необходимая вещь для меня. Разобраться бы как применить только для моего случая

#5
0:03, 21 мар. 2021

JanCarlo
Там с js вообще ничего сложного, самое сложное - поднять websocket сервак и писать код для него

#6
11:28, 21 мар. 2021

egoros7
Спасибо, буду изучать.


Господа, может кто то видел наработки готовые похожие?

#7
23:48, 23 мар. 2021

На PHP есть Websocket из коробки: Ratchet. Старенький, но рабочий. Можно еще глянуть в сторону ReactPHP и PHPDaemon.

#8
(Правка: 23:54) 23:53, 23 мар. 2021

MrSunny
Вот как раз начал изучать вебсокеты.

Жаль не могу найти какие нибудь готовые наработки чисто только с локациями, их хранением, и  передвижением по ним. Всё исходники что я видел работают по старом классическому принципу как в телнете, в строку ввода надо ввести команду хода в соответствующем направлении ну и прочие команды. А я же хочу сделать как бы более "натурально", кликнул по ссылке - оказался в другой комнате с другим описанием.

#9
(Правка: 0:31) 0:16, 24 мар. 2021

JanCarlo
Сделай ссылки кнопками, и привязи к ним onclick='goto("right")' например.
И получиться :

function Player (x, y)
{
    this.x = x;
    this.y = y;
};
var Player.prototype.goto = function (direction) // не помню как в js прототипы делаются
{
    if (direction == "down")
    {
        this.y--;
    }
    else if (direction == "up")
    {
        this.y++;
    }
    else if (direction == "left")
    {
        this.x--;
    }
    else if (direction == "right")
    {
        this.x++;
    }
    else { alert("Указано неверное управление!"); };
};
...
description = getDescription(Player.x, Player.y);
$("#room_description").text = description;
...
Тут может даже пхп не понадобится)
#10
0:35, 24 мар. 2021

Плюс передавать данные на сервер:

...
var socket = new WebSocket("ws://IP:port");

...

// тут игровой цикл
socket.send("x:" + Player.x + " y:" + Player.y); // ничего не помню
Дальше парсим на сервере с php, отправляемых описания и карту

#11
2:32, 24 мар. 2021

egoros7
> var Player.prototype.goto = function (direction) // не помню как в js прототипы делаются
уже можно просто классы писать. ES6 всеми кем надо поддерживается

#12
16:50, 2 апр. 2021

Ребят, а кто какие движки может посоветовать именно на php? Я вот тут пачку ссылок накопал, но что то всё не особо то что надо.

Нужно конкретно на php, без всяких telnet, только через браузер. Желательно конечно с билдером карты, но это я уже скорее губу закатал...

https://github.com/andreasganje/dungeon-crawler
https://github.com/lbadger/php-mud
https://www.youtube.com/watch?v=X-1lu0zER60 - тут видос по конструктору карты
https://github.com/incompl/rmbt сам конструктор
https://github.com/ShawnPConroy/MUSE
https://github.com/topics/text-based-game?l=php
https://ranviermud.com/building/
https://github.com/Komiblanka/Dungeon-Generator-php
https://github.com/essanper/DungeonGame
https://github.com/idigital/php-rpg
https://github.com/DoctorMikeReddy/nags-php-mud/blob/master/database/nags.sql
https://github.com/rickatech/dungeon

#13
21:39, 2 апр. 2021

Любой кто знает как написать сайт, знает как написать игру MMO. Соответственно изучайте как делать сайт и как работать с базой данных из PHP.

JanCarlo
> Долго искал наработки но ничего толкового не нашел
достаточно вбить в гугл:
php mmorpg

#14
23:09, 2 апр. 2021

Salamandr
> Любой кто знает как написать сайт, знает как написать игру MMO.
Сильное утверждение)

JanCarlo
Для описанной задачи не нужны никакие движки. Дольше разбираться в них будете, чем сами сделаете. Если прямо брезгуете JS, то просто берете html, php, субд (mongodb или mysql сгодятся) и дело в шляпе.

Почему у вас жесткая привязка к php, если не секрет?

Страницы: 1 2 Следующая »
ПрограммированиеФорумВеб