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
endL'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.
Sfida
Medio- Crea
petInfo, conSettings.Petsindicizzato per Name. - In
givePet, imposta gli attributiRarityePowerdel pet usandopetInfo. - Scrivi
rollPet(), l'estrazione ponderata, e fai schiudererollPet()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)
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
3Uova e animali domestici
Fai schiudere un uovo