Задать вопрос
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Самый простой вариант клонировать обьект это конвертировать его в JSON, а потом обратно. Другое дело, что это не подойдет, если в объекте есть типы данных, которые нельзя представить внутри JSON. Вам обязательно цикл нужен?
    Ответ написан
    2 комментария
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    0xD34F
    @0xD34F
    Используйте стек.

    Например, в стек помещаем комплекты из трёх значений - под каким именем, что и куда копируем. Крутим цикл, пока стек не окажется пуст. Если копируемое значение является примитивным, то просто записываем его в копию, и уходим на следующую итерацию. Если же перед нами объект, то закидываем в копию пустой объект; этим же свежесозданным пустым объектом дополняем пары ключ-значение исходного объекта, и кладём это всё в стек.

    function clone(value) {
      const clone = [];
    
      for (const stack = [ [ 0, value, clone ] ]; stack.length;) {
        const [ k, v, target ] = stack.pop();
        const isObj = v instanceof Object;
        target[k] = isObj ? v.constructor() : v;
        if (isObj) {
          stack.push(...Object.entries(v).map(n => [ ...n, target[k] ]).reverse());
        }
      }
    
      return clone[0];
    }

    Или, если в копируемом объекте могут быть циклические ссылки или какой-то из вложенных объектов встречается несколько раз и так же должно быть и в копии, то надо запоминать встреченные объекты, чтобы не обрабатывать их повторно - воспользуемся Map'ом, где ключами будут оригинальные объекты, а значениями их копии.

    Как выглядит получение копии объекта: проверяем, встречался ли указанный объект ранее, если нет - создаём новый объект, сохраняем его в Map, а также кладём его вместе с оригиналом в стек, для последующей обработки; достаём из Map'а копию.

    Крутим цикл, пока стек не пуст, на каждой итерации достаём из стека объект и его копию, перебираем свойства оригинала, записываем в копию копии значений.

    function clone(value) {
      const stack = [];
      const clones = new Map;
      const getClone = v => v instanceof Object
        ? (clones.has(v) || stack.push([ v, clones.set(v, v.constructor()).get(v) ]),
           clones.get(v))
        : v;
    
      for (getClone(value); stack.length;) {
        const [ source, target ] = stack.pop();
        for (const k in source) if (Object.hasOwn(source, k)) {
          target[k] = getClone(source[k]);
        }
      }
    
      return getClone(value);
    }

    как правильнее всего будет это сделать?

    Перестать заниматься ерундой и начать использовать готовые решения - structuredClone или cloneDeep, например.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @acwartz
    Тут должна быть ваша реклама.
    Всё просто - написать на WebAssembly & WebGL & WebSockets копию игрового клиента, и запускать её в браузере. Можно конечно на javascript'е выехать, но увы, производительность будет не ахти, ровно как и потребление ресурсов. И да, обычные модификации тоже придется полностью переписать на этот тех. стэк, по сути встроить в новый игровой клиент. на гитхабе кучи вариантов реализации маинкрафт-клиента на том же openGL (который родной для маинкрафта если что) и C++ вместо джавы. И подумать над тем, что браузер просто не имеет нормального доступа к файловой системе.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @rPman
    Раньше было можно, официально, через java applet (посмотри вроде тут обсуждалось что подсовывать и как)

    Теперь этот режим отключен в браузерах по умолчанию, так как еще более ненадежный чем flash (проблем больше чем пользы)
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Самый простой и дешёвый (из всех возможных) вариант это сделать - написать свой майнкрафт. В качестве примера могу привести minecraft classic, который сделали на 10-летие майнкрафта.
    Ответ написан
    Комментировать
  • Как сделать возможность игры в Minecraft прямо из браузера?

    @mxrdxfxrrx
    flstudio20, py3.x
    У меня один вопрос - как ты собрался играть в java(почти) игру, .exe приложение в БРАУЗЕРЕ?
    Может ты имел ввиду "хостинг"?
    Ответ написан
    3 комментария
  • Как сделать возможность игры в Minecraft прямо из браузера?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я конечно не занимаюсь геймдевом, но чтобы играть в браузере вам нужна клиентская часть не на Java, а на JavaScript. А в качестве бекенда можно взять Java. Так вот, просто так адаптировать игру не получится... разве что переписать ее на JS. Но если у вас подобные вопросы, то явно вашего текущего уровня не хватит, чтобы это сделать...
    Ответ написан
    5 комментариев
  • Как сделать возможность игры в Minecraft прямо из браузера?

    MinTnt
    @MinTnt
    Напрямую - вряд ли что-то дельное да выйдет.

    Максимум лишь за некую сумму денег купить VDS и настроить по типу playkey. Чтоб потом в браузере, выделять некую сессию. А на самой странице, в кабинете сессии, сделать трансляцию видео с выделенного сервера, и кнопки для управления. Но предполагаю задержка выйдет значительная. Да и затраты себя не окупят.
    Ответ написан
    Комментировать