Este cofre usa exactamente el mismo sistema de pesos que se explica en las guías de la web: una tabla de rarezas, un número al azar y un recorrido acumulando pesos hasta dar con el premio. Ábrelo unas cuantas veces y mira cómo lo que te sale se va acercando (o no) a lo que debería salir.
Pulsa el botón para abrir tu primer cofre.
| Rareza | Peso | Debería salir | Te ha salido |
|---|
Cofres abiertos: 0
Lo que acabas de aprender sin darte cuenta
- Los pesos no son porcentajes. Aquí suman 100 por comodidad, pero podrían sumar 37 o 1.240: lo que importa es la proporción entre ellos. Por eso en el código se divide por el total.
- Un 1 % no significa «uno de cada cien». Puedes abrir 300 cofres sin ver un legendario y seguir dentro de lo normal. Cada tirada no recuerda las anteriores.
- Con pocas aperturas los porcentajes reales bailan muchísimo. Abre 10 y verás disparates; abre 500 y la columna «te ha salido» se pega a la de «debería salir».
Esto importa al diseñar tu juego. Si tu objeto estrella tiene un 1 %, la mayoría de tus jugadores no lo verá nunca y se irá. Por eso muchos juegos añaden un contador de mala suerte que sube la probabilidad tras X intentos fallidos. Está explicado en la guía de equilibrar probabilidades.
El mismo sistema, en Luau
Esta es la versión del código que mueve el cofre de arriba, lista para pegar en un ServerScript:
-- Tabla de botín: el peso es relativo, no un porcentaje
local BOTIN = {
{nombre = "Moneda de cobre", rareza = "Común", peso = 60},
{nombre = "Espada de hierro", rareza = "Poco común", peso = 25},
{nombre = "Alas de tela", rareza = "Raro", peso = 10},
{nombre = "Espada de fuego", rareza = "Épico", peso = 4},
{nombre = "Corona del dragón",rareza = "Legendario", peso = 1},
}
-- Suma de todos los pesos (aquí 100, pero funciona con cualquier número)
local function pesoTotal()
local total = 0
for _, objeto in ipairs(BOTIN) do
total = total + objeto.peso
end
return total
end
-- Elige un objeto al azar respetando los pesos
local function elegirObjeto()
local tirada = math.random() * pesoTotal()
local acumulado = 0
for _, objeto in ipairs(BOTIN) do
acumulado = acumulado + objeto.peso
if tirada <= acumulado then
return objeto
end
end
return BOTIN[1] -- red de seguridad, no debería llegar aquí
end
local premio = elegirObjeto()
print("Te ha tocado:", premio.nombre, "(" .. premio.rareza .. ")")
Si quieres montarlo entero, con el cofre, el tiempo de espera y el inventario que guarda lo que consigue el jugador, lo tienes paso a paso en Sistemas de botín.