Escuché sobre el juego Dwarf Fortress, pero solo ahora una de las personas que sigo en Youtube hizo un comentario al respecto ... ¡Estaba más que sorprendido cuando noté cómo Dwarf Fortress realmente genera una historia para el mundo!
Ahora, ¿cómo funcionan estos algoritmos? ¿Qué suelen tomar como entrada, excepto la duración de la simulación? ¿Qué tan específicos pueden ser?
Y más importante; ¿Se pueden hacer en Javascript o Javascript es demasiado lento? (Supongo que esto depende de la profundidad de la simulación, pero tome Dwarf Fortress como ejemplo).
algorithm
javascript
random
jcora
fuente
fuente
Person
, que hace tareas, va al ejército, etc. Shallow permitiría que el tamaño del imperio decida los resultados de las batallas, pero profundo sería tener a cada soldado luchando por los suyos.Respuestas:
En primer lugar, hay algunas pistas para la generación de historia sobre Dwarf Fortress. Alguien preguntó en los foros de Bay12 hace un tiempo, y se compartió una transcripción y puede encontrar dónde comienza la discusión buscando: "nuestro tema hoy es la generación mundial y la generación de historia".
No sé exactamente cómo lo hace Dwarf Fortress, pero explicaré cómo planeo implementar un primer borrador muy básico en mi juego. Voy a usar un autómata celular simple . Si observa estos prototipos de esporas , como el cultivo celular y el bioma.
Estos son ejemplos de automatizaciones celulares y lo que pueden producir. Básicamente, crearé reglas para diferentes razas. Algunos ejemplos de reglas serían:
Por lo tanto, el aporte más crítico para que todo esto funcione es un mundo en el que se dediquen estas razas. El terreno determinará sus preferencias y expansión. Entonces, una vez que haya generado un mundo, elija ubicaciones aleatorias en el mundo donde estas razas vivirían adecuadamente y déjelos perder. Ahora las cosas interesantes comienzan a suceder. Ahora que tiene tierras y razas con deseos y capacidades, puede comenzar a construir una historia. Estas razas reúnen recursos, luego se construyen estructuras:
Cualquier estructura puede ser asaltada / conquistada por otras razas. Cuanto más larga sea una estructura (como una ciudad o fortaleza) en la historia, más defendible es, más difícil es hacerse cargo. Y lo más deseable es para las carreras que quieren control. Las batallas se libran donde las razas se encuentran (al menos una es hostil). Las batallas se nombran por puntos de referencia o estructuras cercanas, o si la batalla es significativa o los puntos de referencia no se nombran, los puntos de referencia se nombran después de la batalla.
Los caminos, puentes y túneles se expanden a través del comercio y el transporte de recursos. Cada uno tiene un rendimiento máximo que puede aumentar con el gasto de recursos. ¿Construir una fortaleza de piedra en medio de pastizales? Esos caminos tendrán un uso intensivo para transportar la piedra requerida. Se harán más grandes y obtendrán un nombre.
Ocurren desastres naturales que afectan a las poblaciones y al curso de la historia. Los terremotos pueden reducir una ciudad a ruinas o colapsar un túnel. Una inundación puede arrastrar un camino o puente.
No es tan profundo como Dwarf Fortress, pero es un comienzo. Ahora, como pueden imaginar, (y como Johnathan Hobbs mencionó) cuanto más se expanden estas razas, más células se simulan. No solo se simulan más células, sino que las simulaciones son más complejas, ya que ahora hay estructuras para construir / mantener, batallas para ganar, comercio para ... comercio, etc. Esto se vuelve pesado para cualquier idioma. Javascript podría ralentizarse antes. Sin embargo, siempre puedes sacrificar la complejidad para mejorar la velocidad.
Todo es una simulación (aunque compleja), solo estás registrando los eventos importantes en el camino y llamándolo historia.
También acabo de encontrar una publicación en el foro de Bay12 para personas que hacen una lluvia de ideas sobre cómo hacer que la generación mundial de Dwarf Fortress sea más rápida. No lo he leído, pero puede proporcionar algunas sugerencias si alguna vez se encuentra con problemas con la implementación demasiado lenta.
fuente
Solo como un punto secundario, JavaScript no es tan lento como podría pensar .
Los desarrolladores de navegadores han dedicado mucho tiempo y energía a optimizar sus motores JavaScript . El punto de referencia al que me vinculé muestra que, fuera de las tareas comparadas, en la mediana, JavaScript fue solo 5 veces más lento que C , lo que no se puede decir de otros lenguajes interpretados. Y el límite inferior es aún más impresionante: a la par con C .
Por supuesto, los puntos de referencia del lenguaje no significan mucho, probablemente podría encontrar contraejemplos usando un punto de referencia diferente. Pero el punto es que JavaScript es bastante rápido . No, no es C o C ++, y no intenta serlo. Pero es bueno no quedarse atrapado en la mentalidad de "lenguaje interpretado == lento", porque para cualquier tarea de complejidad no trivial, el rendimiento tendrá más importancia en el diseño de algoritmos y menos en la elección del idioma.
En realidad iba a escribir todo esto en un comentario, pero me quedé sin espacio.
fuente
Sí, se puede construir en javascript, verifique proyectos como ASM.js, que obtienen una velocidad casi 2 veces más lenta que C. Si se ocupa de múltiples núcleos (utilizando trabajadores web), puede ser incluso más rápido que el DF (en términos de recursos) , que es monocore en este momento.
fuente