Menu
CoddyTech

אסון אקראי

שיעור 14 מתוך 20 בקורס משחק Roblox: הישרדות באסונות של Coddy.

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

אפשר לאתר פונקציה בטבלה לפי שמה כמחרוזת: Disasters["Meteors"] הוא Disasters.Meteors, ולכן Disasters[name](map) מפעיל את האסון שמופיע ב-name. שם שאינו מופיע בטבלה מחזיר nil, וקריאה ל-nil היא שגיאה, לכן יש לבדוק את Disasters[Settings.Disaster] לפני שמסתמכים על ההגדרה.

כדי לבחור באקראי, יש לרשום את המפתחות של הטבלה ולבחור מיקום. for name in Disasters do עובר על המפתחות ללא סדר קבוע, לכן ממיינים תחילה את הרשימה: כך אותו מספר אקראי תמיד יבחר באותו אסון, מה שמקל על בדיקת המשחק.

local names = {}
for name in Disasters do
	table.insert(names, name)
end
table.sort(names)
local pick = names[math.random(1, #names)]

השחקנים צריכים לדעת מה פגע בהם, לכן הספירה לאחור מציינת את שם האסון: Flood! Time left: 15.

challenge icon

אתגר

בינוני

בחרו אסון אקראי בכל סבב.

  1. כתבו את pickDisaster(): אם Disasters[Settings.Disaster] קיים, החזירו את Settings.Disaster; אחרת, החזירו שם אקראי מתוך הרשימה הממוינת של מפתחות הטבלה.
  2. בסבב: local disaster = pickDisaster(), ואז Disasters[disaster](map).
  3. הציגו את disaster .. "! Time left: " .. seconds בספירה לאחור.

לחצו על "שחק" במשך כמה סבבים: הלוח מציג את שם האסון בכל פעם, למשל Flood! Time left: 15. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)

local lobbySpawn = workspace.LobbySpawn

print("Rounds last " .. Settings.RoundLength .. " seconds")

-- כל שחקן מקבל Wins בטבלת המובילים
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Parent = leaderstats
end)

-- לוח הסטטוס בלובי
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard

local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui

local function setStatus(text)
	status.Text = text
end

local function teleport(player, target)
	local character = player.Character
	if character then
		character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
	end
end

local function defeat(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- האסונות, לפי שם
local Disasters = {}

function Disasters.Flood(map)
	local base = map.Base
	local water = Instance.new("Part")
	water.Name = "Water"
	water.Anchored = true
	water.CanCollide = false
	water.Transparency = 0.3
	water.Color = Color3.fromRGB(40, 120, 255)
	water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
	water.Position = base.Position - Vector3.new(0, 2, 0)
	water.Parent = map
	water.Touched:Connect(defeat)

	local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
	TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end

function Disasters.Meteors(map)
	local base = map.Base
	task.spawn(function()
		while map.Parent do
			local meteor = Instance.new("Part")
			meteor.Name = "Meteor"
			meteor.Shape = Enum.PartType.Ball
			meteor.Size = Vector3.new(3, 3, 3)
			meteor.Color = Color3.fromRGB(255, 120, 30)
			meteor.Material = Enum.Material.Neon
			local x = base.Position.X + math.random(-15, 15)
			local z = base.Position.Z + math.random(-15, 15)
			meteor.Position = Vector3.new(x, 40, z)
			meteor.Parent = map
			meteor.Touched:Connect(defeat)
			Debris:AddItem(meteor, 4)
			task.wait(0.5)
		end
	end)
end

function Disasters.Shrink(map)
	local base = map.Base
	local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
	TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end

-- שיעור 14: אסון אקראי יופיע כאן

-- לולאת הסיבובים
while true do
	for seconds = Settings.Intermission, 1, -1 do
		setStatus("Intermission: " .. seconds)
		task.wait(1)
	end

	local map = ServerStorage.Maps.Island:Clone()
	map.Name = "Map"
	map.Parent = workspace

	local survivors = {}
	for _, player in Players:GetPlayers() do
		local character = player.Character
		if character and character.Humanoid.Health > 0 then
			teleport(player, map.Spawn)
			survivors[player] = true
			character.Humanoid.Died:Connect(function()
				survivors[player] = nil
			end)
		end
	end

	Disasters.Shrink(map)
	for seconds = Settings.RoundLength, 1, -1 do
		setStatus("Time left: " .. seconds)
		task.wait(1)
	end

	local names = {}
	for player in survivors do
		player.leaderstats.Wins.Value += 1
		teleport(player, lobbySpawn)
		table.insert(names, player.Name)
	end
	map:Destroy()
	if #names > 0 then
		setStatus("Winners: " .. table.concat(names, ", "))
	else
		setStatus("Nobody survived!")
	end
	task.wait(3)
end

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

תרגלו בעצמכם: Roblox אונליין