Menu
CoddyTech

Tiri di rarità

Lezione 10 di 18 del corso Gioco Roblox: Simulatore di animali domestici di Coddy.

Un uovo non dovrebbe dare sempre un Cat. Settings.Pets elenca ogni animale domestico con una Chance su 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), una rarità e una potenza.

Un tiro ponderato: scegli un numero da 0 a 100, poi scorri l'elenco sottraendo a ogni turno la probabilità di ciascun animale domestico. Vince l'animale domestico che porta il risultato a 0 o meno, quindi un animale domestico con probabilità 45 vince in media 45 tiri su 100:

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

L'animale domestico nato dall'uovo porta anche i suoi attributi Rarity e Power. Una tabella degli animali domestici per nome (petInfo["Fox"]) permette di trovarli rapidamente.

challenge icon

Sfida

Medio
  1. Crea petInfo, con Settings.Pets indicizzato per Name.
  2. In givePet, imposta gli attributi Rarity e Power del pet usando petInfo.
  3. Scrivi rollPet(), l'estrazione ponderata, e fai schiudere rollPet() invece di un Cat (la stampa indica il nome di ciò che si è schiuso).

Premi Play e fai schiudere qualche uovo. Poi Check: i controlli modificano le probabilità per assicurarsi che l'estrazione le rispetti.

Provalo tu

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 = {} -- ogni mucchio -> il punto in cui si trova
local lastHit = {} -- ogni giocatore -> quando ha colpito l'ultima volta

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

-- Un animale domestico: uno StringValue nella cartella Pets del giocatore che ne contiene il nome
local function givePet(player, name)
	local pet = Instance.new("StringValue")
	pet.Name = "Pet"
	pet.Value = name
	pet.Parent = player.Pets
	return pet
end

-- Ogni giocatore riceve Coins nella classifica
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

	-- gli animali domestici che possiedono
	local pets = Instance.new("Folder")
	pets.Name = "Pets"
	pets.Parent = player
end)

-- Un mucchio di monete in un punto: una copia di ServerStorage.CoinPile con la sua salute
-- e il suo valore come attributi
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 colpo riduce di 1 la salute di un mucchio;
-- a 0 il mucchio si rompe e assegna il suo valore
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()
	-- un nuovo mucchio nello stesso punto, qualche secondo dopo
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Un mucchio in ogni punto di Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- Il client chiede di colpire un mucchio. Non fidarti mai del client: chiunque può attivare
-- questo remote con qualsiasi cosa, da qualsiasi luogo, alla velocità che vuole.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- un mucchio vero
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- a portata
	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
	-- non troppo in fretta
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Schiusa: il prompt dell'uovo, pagato in monete
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Roblox: Simulatore di animali domestici