تعلم لغة GDscript: المصفوفات والقواميس #4

GDscriptبرمجة

اهلا بك في درس جديد عن GDscript, هذا الدرس سيكون عن  نوعين البيانات, وهي تعد من هياكل البيانات data structure, اي تخزين البيانات بطريقة مهيئة,وهي التي تسمح لنا بتخزين مجموعة من القيم المختلفة في متغير وحيد, حيث ساتكلم عن المصفوفات arrays و القواميس dictionaries, وطريقة التعامل معهم في GDscript.

المصفوفات Arrays

المصفوفة هي مجموعة من العناصر المختلفة في متغير واحد, هذا التعريف قد يختلف من لغة الى اخرى, ولكن هنا في GDscript, فهي مجموعة من العناصر اما من نفس النوع او من انواع مختلفة وكلهم في متغير واحد.

تستخدم المصفوفة بهذا الشكل ← [1,2,3,”ahmed”], حيث كل عنصر منها يمكننا الوصول اليه بشكل خاص وسهل, وهكذا فيمكن استعمالها مثلا لحفظ مجموعة من البيانات الخاصة باللعبة

مثل مجموعة من حالات انيميشن اللاعب [“idle”, “run”, “walk”, “hit”, “attack”], او مجرد حفظ مجموعة من البيانات المختلفة المهمة, مثل المراحل التي قام اللاعب بدخولها [10, 8, 7, 6, 4, 2, 1], فهكذا لن تحتاج الى متغير جديد لكل عنصر من هذه العناصر

إنشاء مصفوفة

var x := []
var y := Array()

هكذا المتغير x اصبح يساوي مصفوفة لكن تلك المصفوفة فارغة 
يمكننا ان نعرف المصفوفة باسلوب اخر, وهو أسلوب المتغير y

لإضافة عناصر

ان اردت اضافة عناصر فيها فاستعمل دالة تدعى append

var x := []
x.append(5)

دالة append هي دالة خاصة بالمصفوفات, تستخدم فقط مع هذا النوع من البيانات لادخال القيم فيها, هكذا اصبح أول عنصر في المصفوفة x هو 5، تستطيع اضافة ارقام او جمل او حتى قيم boolean.

كما تستطيع ادخال عناصر المصفوفة في لحظة التعريف, لكن تاكد ان تفصلهم عن بعض بعلامة الفاصلة ( , )

x.append(5)
x.append("hi")
x.append(true)
x.append(7.25)
var arr := [5, "hi", true, 7.25]

الوصول إلى عناصر المصفوفة

لكي تتعامل مع عناصر المصفوفة عليك ان تعرف ان كل عنصر لديه عنوان تستطيع الوصول اليه من خلاله,
هذا العنوان نسميه index

اول عنصر في المصفوفة يبدأ من index رقم 0 واخر عنصر يكون عنوانه هو (n – 1) حيث n عدد عناصر المصفوفة, تستطيع الوصول لكل عنصر عن طريقة كتابة الـ index الخاص به في أقواس [ ] بعد إسم المصفوفة، هكذا

var arr := [5, "hi", true, 7.25]
# index ->  0   1      2     3

var arr := [5, "hi", true, 7.25]
print(arr[0]) # will print 5
print(arr[2]) # will print true

هكذا يكون 0 هو أول عنصر و1 هو ثاني عنصر و 2 هو الثالث وهكذا, وانا لم أخطأ في كتابة هذا السطر, المصفوفات تبدء من 0 وليس 1.

عناصر المصفوفة ايضًا لديها عنوان ثانوي وهو عنوان عكسي بالسالب

var arr := [5, "hi", true, 7.25]
# index -> -4  -3     -2    -1

var arr := [5, "hi", true, 7.25]
print(arr[-1]) # will print 7.25
print(arr[-3]) # will print "hi"

اي يمكنك استخدام العناوين السالبة هذه أو العناوين الطبيعية

دوال المصفوفات

كما لاحظت فإن المصفوفات لديها بعض الدوال الجاهزة الخاصة فقط بها, نستعرض القليل منها ويمكنك ان تقرأ وأن تعرف اكثر عن باقي الدوال عبر هذه الروابط الرابط 1, الرابط 2

var arr := [1, 2, 3]
arr.append(4)
var n := arr.size()
var first := arr.back()
var last := arr.front()
  • append – إضافة عنصر
    في المثال, هكذا سيتم اضافة العنصر 4 في نهاية المصفوفة فتصبح المصفوفة [1,2,3,4]
  • size – حجم
    دالة الـ size ترجع لنا حجم المصفوفة و هي عدد عناصرها هكذا قيمة n ستكون 4 لأن المصفوفة arr تحتوي على 4 عناصر (لاحظ اننا اضفنا عنصر في السطر 2)
  • back – رجوع
    دالة الـ back ترجع لنا اخر عنصر في المصفوفة وفي حالتنا سيكون رقم 4  
  • front – مقدمة
    دالة الـ front ترجع لنا أول عنصر في المصفوفة وفي حالتنا سيكون رقم 1

الجدير بالذكر أن النصوص string بحد ذاتها مصفوفة array،, لكنها مصفوفة خاصة بالحروف أي نوع واحد فقط من العناصر وليس عناصر مختلفة مثل المصفوفة العادية, أي لا تقبل سوى بقيم من النوع char

القواميس – dictionaries

هي أحد أكثر هياكل البيانات شهرةً بعد المصفوفات، تستخدم في تجميع البيانات كما تفعل المصفوفات بالضبط، ولكن الفرق أن القواميس تجمّع البيانات بأسلوب مفتاح > قيمة.

اي لا حاجة لك لاستعمال عنوان index للوصول الى العنصر, انما تستعمل المفتاح الذي وضعته انت للوصول إليه

إنشاء قاموس

var x := {}

هنا عرفنا قاموس فارغ يدعى x نحن هنا نستخدم { } على عكس المصفوفات التي كنا نستخدم [ ], عناصر القاموس تتكون من مفاتيح key و قيم value، في المصفوفة كنا نستخدم الـ index لإحضار القيمة, اما هنا فنحن نستخدم المفاتيح بدلا من الـ index لإحضار القيمة.

عند تخزين قيمة يجب أن تعطيها المفتاح الخاص بها، هذا المفتاح قد يكون جملة او رقم وليس مجرد ارقام مثل الـ index, فتكتب المفتاح ثم نقطتين فوق بعض ( : ) ثم القيمة, وتفصل بين القيم بالفاصلة ( , )

var x = {key1: value1, key2: value2}
var dict = {"name" : "Ahmed", "age" : 20}

var dict2 = {
    "name" : "Ahmed",
    "age" : 20
}

فهنا لدينا قاموس يدعى dict به قيمتين القيمة “Ahmed” والقيمة 20 وكل قيمة لها المفتاح خاصتها, ويمكنك استخدام المسافات الفارغة لجعلها أسهل في القراءة مثلما فعلت في dict2

الوصول إلى عناصر القاموس

للوصول لتلك القيم سنستخدم المفتاح الخاص بها, عن طريق كتابة إسم القاموس ثم إسم المفتاح ما بين [ ]  

var dict = {
    "name" : "Ahmed",
    "age" : 20
}
print(dict["name"]) # it will print "Ahmed"
print(dict["age"])  # it will print 20
# to access the value use : DictName[KeyOfValue]

print(dict.name) 
# استعملنا النقطة, لان المفتاح عبارة عن نص
print(dict[100]) # لا نستطيع استعمال النقطة, لان المفتاح ليس بنص

كما هو موضح في المثال, لقد لقد كتبت [“dict[“name للوصول لقيمة “ahmed”, وكتبت [“dict[“age للوصول للقيمة 20

في حالة كان المفتاح جملة string فيمكننا الاستغناء عن الـ [ ] فيمكننا اختصار الأمر باستعمال النقطة هكذا dict.name, ولاحظ كتبنا المفتاح بدون ” “, اما في حالة كان المفتاح ليس من نوع النصوص فلا يمكننا استخدام الـ dot بالطبع

لإضافة عناصر

var dict = {
    "name" : "Ahmed",
    100 : "hello"
}
dict["age"] = 20
dict["level"] = 5
# للاضافة  : DictName[KeyName] = Value
# لو كان المفتاح متواجد بالفعل, فان القيمة تحدث
# dict[100] = "hi"
# “hi” قيمة المفتاح 100 ستحدث إلى

تكتب إسم القاموس ثم تكتب المفتاح داخل [ ] ثم تسند له القيمة هكذا dict[“age”] = 20 

بالنسبة لي أضفت قيمة جديدة وهي 20 والمفتاح خاصتها هو “age”, ان كان المفتاح موجود بالفعل فسوف يتم تحديث القيمة وإن لم يكن موجود فيضاف الى القاموس.

القيمة ليس شرطًا ان تكون مجرد جمل أو أرقام، يمكن للقيمة ان تكون مصفوفة بحد ذاتها

var dict = {
    "name" : "Ahmed",
    "levels" : [1, 2, 3, 4]
}
# للوصول الى مصفوفة بداخل قاموس استعمل
# dict["levels"][index] او dict.levels[index]

هكذا يصبح لديك قيمة عبارة عن مصفوفة ونستطيع الوصول لها عن طريق المفتاح “levels”

كما يمكن الوصول لعناصر المصفوفة بكل سهولة هكذا ← [dict[“levels”][0
هكذا سيحضر أول عنوان 0 من المصفوفة الذي يشير لها المفتاح “levels”, او لو كان المفتاح نوعه نص string فيمكنك اختصار الأمر لـ [dict.levels[0

تستطيع أيضًا جعل القيمة عبارة عن قاموس

var dict = {
    "name" : "Ahmed",
    "subDict" : {
        "fakeName" : "Ali",
        "sayHello" : "hello"
    }
}

هكذا يكون لديك قاموس داخل قاموس ان اردت ان الوصول لقيمة “Ali” داخل القاموس “subDict”, فاستعمل
[“dict[“subDict”][“fakeName او dict.subDict.fakeName

دوال القاموس

القواميس لديها بعض الدوال الجاهزة الخاصة بها فقط , ساعرض القليل منها ويمكنك ان تقرأ وان تعرف اكثر عن باقي الدوال في المقالات المرفقة مع الدرس

var dict = {
    "name" : "Ahmed",
    "age" : 20
}
if dict.has("name"):
    print("the element is exit")
else:
    print("the element is exit")

# dict.has("fakeName") it will return false because "fakeName" key not exitprint(dict["name"]) 
# it will print "Ahmed"
print(dict.get("name")) # it also will print "Ahmed"

دالة has تأخذ قيمة المفتاح وتبحث هل هو موجود في القاموس ام لا, ان كان موجود فسيرجع true عدا ذلك سيرجع false.

دالة get تحضر قيمة العنصر إن أعطيتها المفتاح, لكن ما الفرق بينها وبين طريقة الاقواس [ ] ؟, مشكلة إحضار العنصر عن طريق [ ], انه اذا كان العنصر غير موجود فسيعطيك قيمة null وهذا سيسبب مشاكل لك, لتفادي الأمر فيمكنك اعطاء متغير اضافي للـ get لارجاعه بدلا من ارجاع null

var dict = {
    "name" : "Ahmed",
    "age" : 20
}
print(dict["level"]) # it will return null, maybe cause an error
print(dict.get("level", 5)) # it return 5

معنى هذا الأمر (dict.get(“level”, 5
ارجع قيمة level وإن لم تكن موجودة فأرجع 5, أنت تحدد ما الذي سيرجع في حالة لم يكن المطلوب موجود

مراجع قواميس

هنا بعض المقالات التي تعطي شرحًا مفصلًا عن القواميس ودوالها
https://docs.godotengine.org/en/stable/classes/class_dictionary.htm
https://gdscript.com/dictionaries

3.7 3 votes
Article Rating
Subscribe
نبّهني عن
guest

0 تعليقات
Inline Feedbacks
View all comments