הגרלות נדירות
שיעור 10 מתוך 18 בקורס משחק Roblox: סימולטור חיות מחמד של Coddy.
ביצה לא אמורה תמיד לתת חתול. Settings.Pets מפרט את כל חיות המחמד, ולכל אחת סיכוי מתוך 100 (חתול 45, כלב 30, ארנבון 15, שועל 8, דרקון 2), נדירות ועוצמה.
הגרלה משוקללת: בחרו מספר בין 0 ל-100, ואז עברו על הרשימה והחסירו ממנו את הסיכוי של כל חיית מחמד. חיית המחמד שמביאה את המספר ל-0 או פחות זוכה, כך שחיית מחמד עם סיכוי של 45 זוכה בממוצע ב-45 מתוך 100 הגרלות:
local roll = math.random() * 100
for _, info in Settings.Pets do
roll -= info.Chance
if roll <= 0 then
return info.Name
end
endחיית המחמד שבקעה נושאת גם את ה-Rarity ואת ה-Power שלה כמאפיינים. טבלה של חיות המחמד לפי שם (petInfo["Fox"]) מאפשרת למצוא אותן במהירות.
אתגר
בינוני- בנו את
petInfo, כאשר המפתחות שלSettings.Petsהם שמות. - ב־
givePet, הגדירו את מאפייניRarityו־Powerשל חיית המחמד מתוךpetInfo. - כתבו את
rollPet(), ההגרלה המשוקללת, ובקיעו את התוצאה שלrollPet()במקום Cat (ההדפסה מציגה את שם מה שבקע).
לחצו על Play ובקעו כמה חיות. לאחר מכן לחצו על Check: הבדיקות משנות את הסיכויים כדי לוודא שההגרלה שלכם תואמת להם.
נסו בעצמכם
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 = {} -- כל ערימה -> המקום שעליו היא נמצאת
local lastHit = {} -- כל שחקן -> מתי היכה בפעם האחרונה
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- חיית מחמד: StringValue בתיקיית Pets של השחקן, שמכיל את שמה
local function givePet(player, name)
local pet = Instance.new("StringValue")
pet.Name = "Pet"
pet.Value = name
pet.Parent = player.Pets
return pet
end
-- כל שחקן מקבל Coins בטבלת המובילים
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
-- חיות המחמד שבבעלותם
local pets = Instance.new("Folder")
pets.Name = "Pets"
pets.Parent = player
end)
-- ערימת מטבעות במקום מסוים: עותק של ServerStorage.CoinPile עם רמת הבריאות שלה
-- והערך שלה כמאפיינים
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
-- מכה מפחיתה 1 מרמת הבריאות של ערימה;
-- כשהיא מגיעה ל־0, הערימה נשברת ומעניקה את הערך שלה
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()
-- ערימה חדשה באותו מקום, כעבור כמה שניות
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- ערימה בכל מקום באזור Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
-- הלקוח מבקש להכות בערימה. לעולם אל תסמכו על הלקוח: כל אחד יכול לשלוח
-- את האירוע המרוחק הזה עם כל דבר, מכל מקום, בתדירות שירצו.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
-- ערימת מטבעות אמיתית
if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
return
end
-- בטווח הגעה
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
-- לא מהר מדי
local now = time()
if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
return
end
lastHit[player] = now
hitPile(player, pile)
end)
-- בקיעה: ההנחיה של הביצה, שהתשלום עליה הוא במטבעות
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)
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משחק Roblox: סימולטור חיות מחמד
3ביצים וחיות מחמד
בקעו ביצה