Tirages de rareté
Leçon 10 sur 20 du cours Jeu Roblox : simulateur d’animaux de Coddy.
Un œuf ne devrait pas toujours donner un Cat. Settings.Pets répertorie tous les animaux avec une Chance sur 100 (Cat 45, Dog 30, Bunny 15, Fox 8, Dragon 2), une rareté et une puissance.
Un tirage pondéré : choisis un nombre entre 0 et 100, puis parcours la liste en soustrayant la chance de chaque animal. L’animal qui fait descendre le résultat à 0 ou moins gagne, ainsi un animal avec une chance de 45 gagne en moyenne 45 tirages sur 100 :
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endL’animal éclos porte également sa Rarity et sa Power sous forme d’attributs. Une table des animaux par nom (petInfo["Fox"]) permet de les trouver rapidement.
Défi
MoyenTire au sort l’animal de compagnie qui éclot, selon la Chance de chaque animal de compagnie.
- Construis
petInfo:Settings.Petsindexé par Name. - Dans
givePet, définis les attributsRarityetPowerà partir depetInfo[name]. - Écris
rollPet(), le tirage pondéré, et fais éclore le résultat derollPet()au lieu d’un Cat ; l’instruction print indique le nom de l’animal qui a éclos.
Appuie sur « Jouer » et fais éclore quelques animaux : de temps en temps, Output affiche le nom d’un animal différent. Puis appuie sur « Vérifier ».
Essayez vous-même
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 = {} -- chaque tas -> l’emplacement sur lequel il se trouve
local lastHit = {} -- chaque joueur -> la dernière fois qu’il a frappé
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Un animal de compagnie : un StringValue dans le dossier Pets du joueur contenant son nom
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- Chaque joueur reçoit Coins dans le classement
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
-- les animaux de compagnie qu’ils possèdent
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- Un tas de pièces sur un emplacement : une copie de ServerStorage.CoinPile avec sa santé
-- et sa valeur comme attributs
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 coup retire 1 point de santé au tas ;
-- à 0, le tas se brise et rapporte sa valeur
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 nouveau tas au même emplacement, quelques secondes plus tard
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Un tas à chaque emplacement de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- Le client demande à frapper un tas. Ne faites jamais confiance au client : n’importe qui peut déclencher
-- cet événement distant avec n’importe quoi, de n’importe où, aussi vite qu’il le souhaite.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- un véritable tas
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- à portée
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
-- pas trop vite
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- Leçon 10 : les tirages de rareté vont ici
-- Éclosion : l’invite de l’œuf, payée en pièces
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)
Toutes les leçons de Jeu Roblox : simulateur d’animaux
3Œufs et animaux de compagnie
Faire éclore un œufEntraînez-vous par vous-même : Playground Roblox