LINUX.ORG.RU

Логический движок на js

 ,


0

1

Короче, я опять упоролся и душа захотела декларативщины. Надоело писать всякую оопоту, охота описывать объекты, правила из взаимодействия и чтобы всё это работало. Покрехтев немного над клавиатурой я выдавил из себя dgejs (declarative game engine js). Задача была сделующая: есть в комнате человек, мешок и яблоко. Человек может взять яблоко, засунуть его в мешок, поднять мешок, бросить мешок, вытащить из него яблоко и бросить на пол. Для этого были сделаны, собственно сами объекты (человек, яблоко, мешок), действия (взять, бросить, засунуть, достать), условия для действий (руки свободны/заняты, в объекте есть хранилище/нету), сборщики (в движке) (всё что: в руках, в том же месте, хранится в объекте), код для действий (например, прописать объект в руках, поменять его место, добавить объект в массив для контейнера, переписать его место и т.д.) и сам движок, который всё это связывает, заставляет работать и говорит что, кто может делать в данном состоянии системы.
Итак, вопросы к знатокам.
1.Не херню ли я делаю? Есть ли какие-то вменяемые готовые реализации для подобной задачи?
2.Если нет, то есть ли компилируемые языки, где можно проворачивать то, что я проворачиваю на js. То есть вызов метода по строке с его названием, хранение функций в левых структурах и прочее.
3.На каком скриптовом языке всё это можно реализовать красивее и лаконичнее, чем на js?
Сорцы тут: https://github.com/Crutchmaster/dgejs
Работает локально в браузере.
inb4: говнокод с for in, for of, es6... - должно работать на duktape, for in тормозной и должен стать for (i=0;i<c;i++) где это можно.

1.Не херню ли я делаю?

Всё правильно делаешь

xDShot ★★★★★
()

вызов метода по строке с его названием

Это как, типа через какой-нибудь eval или что? Если да то как-то это не очень хорошее решение.

На каком скриптовом языке всё это можно реализовать

Раз у тебя все в браузере то выбора у тебя и нет.

micronekodesu ★★★
()

есть в комнате человек, мешок и яблоко. Человек может взять яблоко, засунуть его в мешок, поднять мешок, бросить мешок, вытащить из него яблоко и бросить на пол. Для этого были сделаны, собственно сами объекты (человек, яблоко, мешок)

(комната, пол, человек, яблоко, мешок)

anonymous
()
Ответ на: комментарий от micronekodesu

Это как, типа через какой-нибудь eval или что? Если да то как-то это не очень хорошее решение.

Нет, это типа if (foo[str] && typeof(foo[str]) == "Function") foo[str](args);}

Раз у тебя все в браузере то выбора у тебя и нет.

Я могу перетащить всё это куда-нибудь на сервер. От клиента нужен только выбор из предложенных вариантов. На js писал, потому что на нём, на мой взгляд, удобно быстро накидать прототип.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 3)
Ответ на: комментарий от anonymous

До комнаты с полом не дошёл, но в принципе ничего сложного. Пол содержит яблоко, мешок и человека, у которых есть на него ссылка. Комната содержит пол. Сборщик по содержимому есть.

crutch_master ★★★★★
() автор топика

Ну, глянь wren, gravity и lua(lua-jit). В первых двух есть fibers (корутины) и легкий c-api, тока они ооп языки, не очень понятно что тебя не устроило в ооп и зачем так извращаться с вызовом методов. В принципе, если тебе именно компилируемые надо, то тебе зайдут и go и swift. Swift с твоими потребностями погибче будет, но имей ввиду, что он собран тока под конкретные убунты...и мак ос, т.ч. рекомендую попробовать его в Докере.

menangen ★★★★★
()

На каком скриптовом языке всё это можно реализовать красивее и лаконичнее, чем на js?

ты не поверишь... как оно бывает:

anonymous
()
Ответ на: комментарий от menangen

не очень понятно что тебя не устроило в ооп и зачем так извращаться с вызовом методов

С ооп надо много иметь себе мозг с наследованиями и закончится это тем, что всё придётся перетаскивать с сущности на сущность. Чтобы просто получить то, что какой-то объект может сделать - т.е. список методов надо много писать - как минимум список, который тащить из классов-родителей. И опять проблема - узнать что может делать какой-либо объект и запустить это действие - надо преобразовать строку в метод, писать портянку swith-case, а мне это вдруг стало очень лень. Тут подход с другого края - описываются действия, описывается кто, что может делать и над кем, описывается код этих действий, а потом уже это всё цепляется к объектам. Если мне надо что бы нечто с руками делало «take», я просто дописываю это «take» в массив и не имею себе мозг с классами или копипастой методов.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ты не поверишь... как оно бывает:

Ты не понял о чём речь. ООП - портянки с наследованиями мне надоели, я хочу от этого уйти в декларативщину. А еще у меня есть libtcod-duktape.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от dk-

Продолжай, мне очень интересно твое мнение.

crutch_master ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Пробовал его понять два раза, оба раза перекосило, так и не въехал. Вместо примеров кода везде какая-то херня, которую проще написать не чём угодно другом.

crutch_master ★★★★★
() автор топика
Последнее исправление: crutch_master (всего исправлений: 2)
Ответ на: комментарий от Einstok_Fair

На самом деле Idris, с его зависимыми типами.

anonymous
()

Вот с этого и начался скайнет! ИИ зохватит мир!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.