Menu
CoddyTech

Tiradas de rareza

Lección 10 de 18 del curso Juego de Roblox: simulador de mascotas de Coddy.

Un huevo no debería dar siempre un Cat. Settings.Pets enumera todas las mascotas con una Chance sobre 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), una rareza y un poder.

Una tirada ponderada: elige un número del 0 al 100 y después recorre la lista restando la probabilidad de cada mascota. Gana la mascota que hace que el resultado llegue a 0 o menos, así que una mascota con una probabilidad de 45 gana 45 tiradas de cada 100, en promedio:

local roll = math.random() * 100
for _, info in Settings.Pets do
	roll -= info.Chance
	if roll <= 0 then
		return info.Name
	end
end

La mascota que sale del huevo también lleva su Rarity y Power como atributos. Una tabla de las mascotas por nombre (petInfo["Fox"]) permite encontrarlas rápidamente.

challenge icon

Desafío

Intermedio
  1. Crea petInfo, con Settings.Pets indexado por Name.
  2. En givePet, establece los atributos Rarity y Power de la mascota a partir de petInfo.
  3. Escribe rollPet(), el sorteo ponderado, y haz que al eclosionar se use rollPet() en lugar de Cat (el print muestra el nombre de lo que haya salido).

Pulsa Play y haz eclosionar unos cuantos. Después, Check: las comprobaciones cambian las probabilidades para asegurarse de que el resultado del sorteo las siga.

Pruébalo tú mismo

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
local pileSpot = {} -- cada pila -> el lugar donde está
local lastHit = {} -- cada jugador -> cuándo golpeó por última vez

print("A Meadow pile gives " .. Settings.PileValue .. " coins")

-- Una mascota: un StringValue en la carpeta Pets del jugador que contiene su nombre
local function givePet(player, name)
	local pet = Instance.new("StringValue")
	pet.Name = "Pet"
	pet.Value = name
	pet.Parent = player.Pets
	return pet
end

-- Cada jugador recibe Coins en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local coins = Instance.new("IntValue")
	coins.Name = "Coins"
	coins.Parent = leaderstats

	-- las mascotas que poseen
	local pets = Instance.new("Folder")
	pets.Name = "Pets"
	pets.Parent = player
end)

-- Una pila de monedas en un lugar: una copia de ServerStorage.CoinPile con su salud
-- y su valor como atributos
local function spawnPile(spot)
	local pile = ServerStorage.CoinPile:Clone()
	pile.Position = spot.Position
	pile:SetAttribute("MaxHealth", Settings.PileHealth)
	pile:SetAttribute("Health", Settings.PileHealth)
	pile:SetAttribute("Value", Settings.PileValue)
	pile.HealthGui.Label.Text = pile:GetAttribute("Health") .. "/" .. pile:GetAttribute("MaxHealth")
	pileSpot[pile] = spot
	pile.Parent = piles
	return pile
end

-- Un golpe reduce en 1 la salud de una pila;
-- al llegar a 0, la pila se rompe y entrega su valor
local function hitPile(player, pile)
	local health = pile:GetAttribute("Health") - 1
	if health > 0 then
		pile:SetAttribute("Health", health)
		pile.HealthGui.Label.Text = health .. "/" .. pile:GetAttribute("MaxHealth")
		return
	end
	player.leaderstats.Coins.Value += pile:GetAttribute("Value")
	local spot = pileSpot[pile]
	pileSpot[pile] = nil
	pile:Destroy()
	-- una nueva pila en el mismo lugar, unos segundos después
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Una pila en cada lugar de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- El cliente solicita golpear una pila. Nunca confíes en el cliente: cualquiera puede activar
-- este evento remoto con cualquier cosa, desde cualquier lugar y tan rápido como quieran.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- una pila real
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- al alcance
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or (root.Position - pile.Position).Magnitude > Settings.Reach then
		return
	end
	-- no demasiado rápido
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Eclosión: la interacción con el huevo se paga con monedas
workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
	local coins = player.leaderstats.Coins
	if coins.Value < Settings.EggPrice then
		return
	end
	coins.Value -= Settings.EggPrice
	local name = "Cat"
	givePet(player, name)
	print(player.Name .. " hatched a " .. name)
end)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Roblox: simulador de mascotas