الطابور هو هيكل بيانات خطي يحتوي على مجموعة من العناصر. هناك نوعان من الطوابير على Roblox: الطوابير العادية، التي تتبع مبدأ "الأول في الدخول، الأول في الخروج" (FIFO)، وطوابير الأولوية، التي تحتوي على أولويات للعناصر في الطابور تحدد ترتيب الوصول إلى البيانات. يمكن أن تكون العناصر في كلا النوعين من الطوابير من أي نوع بيانات Luau data type.
الطابور هو هيكل بيانات مدمج في خدمة تخزين البيانات غير الدائم المسماة MemoryStoreService، حيث يمكنك استدعاء الوظائف المدمجة مباشرة للحصول على طابور وإضافة أو قراءة أو إزالة البيانات من الطابور. لأي استخدام آخر، مثل جدولة المهام ومعالجة الطلبات في لعبتك، يمكنك استخدام الجداول لتطبيق الطوابير بنفسك.
الطوابير العادية
تتم صيانة الطوابير العادية وفقًا لتسلسل FIFO، حيث تتم إضافة جميع العناصر إلى نهاية الطابور وقراءتها أو إزالتها بنفس الترتيب الذي تمت إضافتها به، من الأمام إلى النهاية.

طوابير الأولوية
لا تتبع طوابير الأولوية قاعدة FIFO، حيث يمكن إضافة كل عنصر مع رقم أولوية يشير إلى ترتيبه في القراءة أو الإزالة. العنصر في نهاية طابور الأولوية له أولوية افتراضية تبلغ 0، والعنصر في مقدمة الطابور لديه أعلى أولوية محددة، والتي هي 5 في المثال التالي.

في هذا المثال، يتم إضافة عنصر مع أولوية محددة تبلغ 3 إلى الطابور. يضع الطابور العنصر الجديد خلف جميع العناصر الموجودة التي لها أولوية محددة تبلغ 3 أو أكثر. لوضع عنصر في مقدمة الطابور، تحتاج إلى ضبط الأولوية أعلى من أعلى أولوية محددة حالياً. في هذا المثال، تحتاج إلى ضبط الأولوية على 6 أو أعلى.
تكون طوابير الأولوية مفيدة في الحالات التي تريد فيها قراءة أو الوصول إلى البيانات بناءً على ترتيب الأهمية بدلاً من ترتيب الإضافة. يمكنك ضبط الأولوية كعدد صحيح عند إضافة عنصر، ويقوم الطابور بمعالجة العناصر ذات الأولوية الأعلى قبل العناصر ذات الأولويات الأقل. على سبيل المثال، يمكنك استخدام طوابير الأولوية لمطابقة اللاعبين من خلال تعيين أولويات أعلى للمستخدمين الذين انتظروا لفترة طويلة.
تطبيق الطوابير
يمكنك استخدام الطوابير المدمجة في MemoryStoreService أو استخدام الجداول لتنفيذ الطوابير لجميع الاستخدامات الأخرى. يُظهر نموذج الكود التالي تنفيذ طابور عادي. لاستخدام هذا التنفيذ في لعبتك، يجب عليك حفظه كـ ModuleScript وتخزينه في ReplicatedStorage، بحيث يكون الطابور الخاص بك متاحًا لكل من العميل والخادم.
تنفيذ طابور عادي باستخدام جدول
--!strict
local Queue = {}
Queue.__index = Queue
export type Queue<T> = typeof(setmetatable(
{} :: {
_first: number,
_last: number,
_queue: { T },
},
Queue
))
function Queue.new<T>(): Queue<T>
local self = setmetatable({
_first = 0,
_last = -1,
_queue = {},
}, Queue)
return self
end
-- تحقق مما إذا كان الطابور فارغًا
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- إضافة قيمة إلى الطابور
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- إزالة قيمة من الطابور
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("لا يمكن إزالة عنصر من الطابور الفارغ")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
نموذج الكود التالي هو مثال على الاستخدام كـ Script تحت Workspace. يمكنك تعديل الكود والنوع وموقع التخزين ليناسب استخدامك الخاص، ما دمت قد خزنت نموذج كود التنفيذ السابق بشكل صحيح.
مثال عن استخدام الطابور العاديlocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- إضافة بعض القيم إلى الطابورmyQueue:enqueue(5)myQueue:enqueue(10)myQueue:enqueue(15)-- myQueue = { 5, 10, 15 }-- إزالة قيمة واحدة من الطابورlocal first = myQueue:dequeue()print("كانت أول قيمة تمت إضافتها إلى الطابور هي", first)-- myQueue = { 10, 15 }-- إضافة المزيد من القيم إلى الطابورmyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10, 15, 20, 25, 30 }-- إزالة قيمة أخرى من الطابورlocal second = myQueue:dequeue()print("كانت القيمة الثانية التي تمت إضافتها إلى الطابور هي", second)-- myQueue = { 15, 20, 25, 30 }