Como algunos ya sabréis, Space Settler, en su versión Pre-Alpha 3 traerá un nuevo sistema para crear universos. El antiguo sistema era complicado de programar, y suponía un grave problema a la hora de añadir nuevos objetos o de arreglar problemas existentes. Con este nuevo algoritmo pretendo poder hacer un universo más realista, más rápido y que incluso podrá tener muchas posibilidades en el futuro. Además, hoy me propongo explicar no solo cuanto he avanzado, sino como funciona, para que entendáis como usarlo y, muy importante, para que podáis crear un sistema parecido para vuestras aplicaciones.
El nuevo algoritmo tiene como base unos cuantos objetos que representan los distintos tipos de cuerpos que podemos encontrar en nuestro universo. Actualmente tenemos siete tipos de estrellas en la secuencia principal, y luego otros objetos que funcionan bastante parecido a las estrellas: los agujeros negros, las estrellas de neutrones, las enanas blancas y luego un tipo curioso de estrella llamada estrella de quarks. No voy a ponerme a explicar que es cada cosa y como afecta al juego, ya que para eso está Wikipedia. No obstante, si quiero apuntar algunos sistemas que se han usado para calcular probabilidades a la hora de crear este tipo de objetos.
Como habréis notado, todavía no hay planetas, lunas o cinturones de asteroides, que se incluirán en futuras versiones de desarrollo. Pero por el momento, el programa crea satisfactoriamente el resto de objetos con las proporciones correctas para un universo realista. Para que os hagáis un idea, estas son las proporciones reales de estrellas en el universo:
- Estrellas de tipo O: 0.00003%
- Estrellas de tipo B: 0.13%
- Estrellas de tipo A: 0.6%
- Estrellas de tipo F: 3%
- Estrellas de tipo G: 7.6%
- Estrellas de tipo K: 12,1%
- Estrellas de tipo M: 76.45%
Dado que las estrellas de neutrones, de quarks, enanas blancas y agujeros negros solo se pueden formar de algunos tipos de estrellas, he decidido darles un 0,1% de proporción, en total. En el último universo que he creado, con una única galaxia de 1 035 497 de estrellas, estas han sido las cantidades:
- Agujeros Negros: 346
- Estrellas de Neutrones: 331
- Estrellas de Quarks: 0
- Enanas Blancas: 347
- Tipo O: 0
- Tipo B: 1 330
- Tipo A: 6 236
- Tipo F: 30 921
- Tipo G: 79 022
- Tipo K: 124 860
- Tipo M: 792 104
Dado que las de tipo O salen tres de cada 10 000 000 de estrellas, era bastante probable que no hubiera ninguna, y en el caso de las de quarks sale una de cada 10 000 000, así que era muy probable que no hubiera ninguna. para el resto, las proporciones son bastante correctas, dado que la cantidad final ha sido algo superior al millón de estrellas, parece todo correcto.
Tengo que recordar que muchas de estas estrellas tendrán planetas, muchas de ellas varios, y cada uno de ellos podría tener varias lunas, así que esto no parece viable, y supongo que tendré que rebajar la cantidad de estrellas por galaxia. Para que os hagáis una idea, el programa crea una galaxia y la guarda en la base de datos cada vez que se ejecuta, respetando siempre las que haya actualmente. En este caso, esto ha sido lo que ha tardado:
- Tiempo tardado en crear la galaxia: 108,0932 segundos
- Tiempo tardado en guardar las 1 035 497 estrellas: 399,8887 segundos
Visto esto puede no parecer mucho, pero si hacemos un calculo estadístico de la cantidad de planetas que podría haber en la galaxia, serían unos 4 000 000. lo cual aumentaría mucho el tiempo de creación, llegando a ser superior a una hora casi seguro, y si añadimos una media de 2 o 3 lunas por cada planeta, el tiempo ya se dispara, pudiendo estar varias horas creando una única galaxia, y usando hasta 6 o 7 GB de RAM. Puede parecer mucho, y lo es, pero también hay que tener en cuenta que una vez creado el universo ya no se toca, así que tenemos a nuestra disposición miles de objetos que podrán ser usados, y si nos quedamos faltos de planetas habitables siempre podremos añadir una nueva galaxia.
Ahora paso a detallar el aspecto técnico de la programación:
La idea es tener un objeto para cada tipo de cuerpo en el universo, no obstante, todos los objetos aquí descritos son considerados distintos tipos de estrellas, ya que usan la misma tabla en la base de dato y tienen las mismas propiedades. Pero también tenemos objetos de tipo planeta, luna, o cinturón de asteroides. De esta manera, he aprovechado la posibilidad de crear constructores con distintos parámetros (en el caso de la estrella) para saber si lo que tengo que hacer es crear una estrella o cargarla de la base de datos. Para cargar una estrella solo debemos incluir el parámetro de la ID de la estrella, mientras que para la creación debemos incluir la ID de la última estrella en crearse y la cantidad de galaxias actualmente en la base de datos.
En el segundo caso, usa una serie de probabilidades para crear una estrella. podéis ver el código PHP aquí. Así, le genera unos cuantos parámetros basados únicamente en variaciones estadísticas, de manera que nos sale un universo aleatorio, pero a su vez respetando las fórmulas físicas reales. Todavía, como podréis ver no está programada la formula de Titius Bode, ya que tengo que hacer un estudio estadístico, pero esta fórmula sacará unos parámetros que colocarán a las distancias correctas a los nuevos planetas que se incluyan en el futuro.En el primer caso, todavía sin programar, cargaría la estrella y corregiría los valores en la base de datos, los cuales se guardan como enteros para evitar problemas de magnitudes. Así, podremos sacar los parámetros de una estrella directamente, sin tantas dificultades como hasta ahora.
Como curiosidad, para la creación de objetos como estas entidades en CodeIgniter, los he creado en una carpeta llamada «entities» dentro de la aplicación, para luego poder cargarlos con un require_once desde el constructor de la librería Big Bang.