How to generate a random number in Game Maker?

Cómo Generar Números Aleatorios en Game Maker

13/11/2023

Valoración: 4.02 (9551 votos)

La aleatoriedad es uno de los pilares fundamentales en el diseño de videojuegos. Aporta la imprevisibilidad que hace que los juegos sean rejugables, desafiantes y, en definitiva, divertidos. Desde la probabilidad de que un enemigo deje caer un objeto valioso hasta la dispersión de las balas de una escopeta, los números aleatorios están por todas partes. En Game Maker, la herramienta principal para manejar el azar es la función random(). A lo largo de este artículo, desglosaremos a fondo cómo funciona, sus aplicaciones prácticas y cómo dominarla para dar vida y dinamismo a tus creaciones.

How to generate a random number in Game Maker?
( Game Maker, 6.1, 7 ) random - generate a random number rnum = random (x) x = upper limit of random number. random () generates a random real number between 0 and less than x. It is produced as a decimal fraction, so if you want a whole number (integer), you should use floor () or ceil () in combination with random (). floor () is used most often.
Índice de Contenido

¿Qué es y cómo funciona random()?

En esencia, random(x) es una función incorporada en Game Maker que genera un número de punto flotante (es decir, un número con decimales) en un rango que va desde 0 hasta un valor máximo que tú especificas. Es crucial entender su sintaxis y el tipo de dato que devuelve para poder utilizarla correctamente.

Sintaxis:

variable_resultado = random(limite_superior);

  • limite_superior: Este es el número máximo que la función puede generar. El resultado será un número real entre 0.0 y este valor. Por ejemplo, random(100) devolverá un número como 54.128, 99.9, 0.5 o cualquier otro valor decimal dentro de ese rango.

Un detalle importante es que el resultado es un número real, no un entero. Si necesitas un número entero, como para simular el lanzamiento de un dado, necesitarás combinar esta función con otras, como veremos a continuación.

De Decimales a Enteros: Usando floor(), ceil() y round()

La mayoría de las veces en el desarrollo de juegos, no necesitamos un número como 2.753, sino un número entero como 1, 2 o 3. Para convertir el resultado decimal de random() a un número entero, tenemos tres funciones principales a nuestra disposición:

  • floor(n): Esta es la función más utilizada. Redondea cualquier número hacia abajo al entero más cercano. Por ejemplo, floor(5.9) devuelve 5.
  • ceil(n): Hace lo contrario a floor. Redondea cualquier número hacia arriba al entero más cercano. Por ejemplo, ceil(5.1) devuelve 6.
  • round(n): Redondea al entero más cercano según las reglas matemáticas estándar. Por ejemplo, round(5.4) devuelve 5, mientras que round(5.6) devuelve 6.

Para la mayoría de las aplicaciones de aleatoriedad, como obtener un índice de una lista o un resultado de un dado, floor() es la elección predilecta. Por ejemplo, si queremos un número entero aleatorio entre 0 y 9 (10 resultados posibles), usaríamos:

numero_entero = floor(random(10));

Esta línea de código primero genera un número decimal entre 0 y 9.999..., y luego floor() lo redondea hacia abajo, dándonos un resultado garantizado de 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9.

Casos de Uso Prácticos y Ejemplos de Código

Ahora que entendemos la teoría, veámos cómo aplicar la aleatoriedad en situaciones reales de un videojuego.

Simulando un Lanzamiento de Moneda (50/50)

Una de las probabilidades más simples es un 50%. Esto es útil para decidir si un evento ocurre o no. Podemos lograrlo fácilmente generando un número entre 0 y 1.

if (random(1) < 0.5) {
// El evento ocurre (Cara)
} else {
// El evento no ocurre (Cruz)
}

En este código, random(1) genera un número entre 0.0 y 0.999... Hay exactamente un 50% de posibilidades de que el número sea menor que 0.5.

Simulando el Lanzamiento de Dados

Este es un ejemplo clásico. Un dado estándar de 6 caras tiene resultados del 1 al 6. Usar floor(random(6)) nos daría un rango de 0 a 5. Para ajustarlo, simplemente sumamos 1 al resultado final.

resultado_dado = floor(random(6)) + 1;

Este patrón es universal para cualquier dado poliédrico. Para un dado de 20 caras (D20), la fórmula sería floor(random(20)) + 1;. El +1 es el ajuste clave para cambiar el rango de 0 a N-1 a un rango de 1 a N.

Posicionamiento Aleatorio de Objetos

¿Quieres que los enemigos o los power-ups aparezcan en lugares impredecibles? Puedes usar la aleatoriedad para definir sus coordenadas X e Y dentro de los límites de la habitación.

Can I use real numbers and not integers in GameMaker?
You can also use real numbers and not integers in this function like this - random (0.5), which will return a value between 0 and 0.500. NOTE This function will return the same value every time the game is run afresh due to the fact that GameMaker generates the same initial random seed every time to make debugging code a far easier task.

var _random_x = random(room_width);
var _random_y = random(room_height);
instance_create_layer(_random_x, _random_y, "Instances", obj_enemigo);

Este código creará una instancia del objeto obj_enemigo en una posición completamente aleatoria dentro de la habitación actual.

Creando Variabilidad y "Factor Humano"

La aleatoriedad es perfecta para hacer que los comportamientos parezcan menos robóticos. Por ejemplo, al programar la precisión de un enemigo, en lugar de que siempre acierte, puedes añadir una pequeña desviación aleatoria a su ángulo de disparo.

var _direccion_al_jugador = point_direction(x, y, obj_jugador.x, obj_jugador.y);
var _imprecision = random_range(-5, 5); // Requiere una función más avanzada
var _direccion_final = _direccion_al_jugador + _imprecision;
// Código para disparar en la _direccion_final

La Importancia de `randomise()`: ¡Evita que el Azar se Repita!

Este es un punto crítico que muchos desarrolladores principiantes pasan por alto. Por defecto, Game Maker utiliza la misma "semilla" de aleatoriedad cada vez que ejecutas el juego. Esto significa que la secuencia de números "aleatorios" que genera será idéntica en cada sesión de juego. Esto es fantástico para depurar (debugging), ya que te permite reproducir errores de forma consistente, pero es terrible para un producto final, donde se espera una experiencia diferente cada vez.

La solución es simple: la función randomise().

randomise();

Esta función utiliza el reloj del sistema para generar una nueva semilla aleatoria. Debes llamarla una sola vez al principio de tu juego. Un lugar ideal para poner este código es en el evento Create del primer objeto que se carga en tu juego (como un objeto controlador o de sistema).

// En el evento Create de obj_controlador
randomise();
// Resto del código de inicialización...

Una vez hecho esto, cada vez que un jugador inicie tu juego, la secuencia de números aleatorios será diferente, garantizando una experiencia verdaderamente impredecible.

Tabla Comparativa de Funciones de Aleatoriedad

Aunque random() es la base, Game Maker ofrece funciones más específicas que pueden simplificar tu código. Aquí tienes una tabla comparativa.

FunciónDescripciónDevuelveEjemplo
random(x)Número aleatorio entre 0 y x.Real (decimal)random(50) -> 25.431
irandom(x)Número entero aleatorio entre 0 y x. Es un atajo para floor(random(x+1)).Enteroirandom(50) -> 37
random_range(n1, n2)Número aleatorio entre n1 y n2.Real (decimal)random_range(10, 20) -> 15.892
irandom_range(n1, n2)Número entero aleatorio entre n1 y n2.Enteroirandom_range(10, 20) -> 18

Preguntas Frecuentes (FAQ)

¿Por qué mis números "aleatorios" son siempre los mismos cada vez que juego?
Esto se debe a que no has inicializado el generador de números aleatorios. Asegúrate de llamar a la función randomise() una única vez al inicio de tu juego para solucionar este problema.
¿Cómo obtengo un número aleatorio entre dos valores, por ejemplo, 10 y 20?
La forma más sencilla y limpia es usar las funciones de rango. Para un número decimal, usa random_range(10, 20). Si necesitas un número entero, la mejor opción es irandom_range(10, 20). Ambas funciones son inclusivas, lo que significa que tanto 10 como 20 son resultados posibles.
¿Es la función `random()` realmente aleatoria?
Técnicamente, no. Los ordenadores no pueden generar aleatoriedad verdadera; generan lo que se conoce como "pseudoaleatoriedad". Parten de un número inicial (la semilla) y realizan una serie de cálculos complejos para producir una secuencia que parece aleatoria y pasa todas las pruebas estadísticas de aleatoriedad. Para el desarrollo de videojuegos, esta pseudoaleatoriedad es más que suficiente y, a efectos prácticos, se puede considerar aleatoria.
¿Puedo usar números negativos?
La función random(x) espera que x sea un valor positivo. Sin embargo, puedes generar números en un rango negativo utilizando las funciones de rango. Por ejemplo, irandom_range(-10, -5) te dará un número entero aleatorio entre -10 y -5.

Dominar la aleatoriedad es un paso esencial para pasar de crear mecánicas estáticas a mundos de juego dinámicos y vivos. Las funciones que ofrece Game Maker son potentes y flexibles. Te animamos a experimentar con ellas, a combinarlas y a descubrir nuevas formas de sorprender a tus jugadores. El azar bien implementado no es un truco, es una herramienta de diseño fundamental.

Si quieres conocer otros artículos parecidos a Cómo Generar Números Aleatorios en Game Maker puedes visitar la categoría Juegos.

Subir