Menu
CoddyTech

הגרלות נדירות

שיעור 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"]) מאפשרת למצוא אותן במהירות.

challenge icon

אתגר

בינוני
  1. בנו את petInfo, כאשר המפתחות של Settings.Pets הם שמות.
  2. ב־givePet, הגדירו את מאפייני Rarity ו־Power של חיית המחמד מתוך petInfo.
  3. כתבו את 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)
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Roblox: סימולטור חיות מחמד