post

#17 التاريخ والوقت DateTime – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : NYU

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  التعامل مع التاريخ والوقت DateTime

كيفَ يُمْكِنُنا التَّعامُلُ مَع التاريخ والوقت

كيف يمكننا قراءة التاريخ الحالي ؟  و كيف يمكننا قراءة عدد الأشهر من تاريخ معين ؟ و كيف يمكننا إيجاد الفرق بين تاريخ و تاريخ آخر ؟ هذا ما سوف نتعرف عليه في هذا الدرس بعد الفاصل إن شاء الله . السلام عليكم و رحمة الله و بركاته ، و أهلاً و سهلاً بكم في درس جديد من دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة السي شارب ، تحدثنا في الدروس الماضية عن كيفية التعامل مع الـ Methods ، و كيفية كتابة النصوص ، و كيفية عمل Format للنصوص و كيفية التعديل عليها و أخذ أجزاء منها ، في درس اليوم سنناقش قضية مهمة ، و هي التعامل مع التاريخ و الوقت ، ففي بعض أنواع التطبيقات يجب عليك أن تكون على دراية بكيفية تعريف متغيرات من نوع التاريخ و الوقت ، و كيفية التعامل معها لأخذ معلومات خاصة بها ،

إذاً كما تعلمنا سابقاً نقوم بإنشاء مشروع جديد ، تكلمنا كثيراً أن المكان المخصص لكتابة الأكواد البرمجية هو بين قوسي الدالة void Main ، و تكلمنا أنه يجب أن نستخدم الدالة ReadLine في نهاية التطبيق لنتمكن من مشاهدة النتائج قبل إنتهاء التطبيق.

لتعريف متغير من النوع تاريخ نقوم بكتابة نوع المتغير DateTime  ثم نكتب مسافة ثم اسم المتغير و ينتهي بالفاصلة المنقوطة ، و هذا مشابه لطريقة تعريف المتغيرات من الأنواع الأخرى كالنوع int  و  string ، و نلاحظ هنا  أن الكلمة DateTime التي ظهرت باللون الأزرق الفاتح هي نوع المتغير ، و هو مشابه للأنواع الأخرى ، لكن له صيغة معينة ، لاحظو أنني قمت بتعريف المتغير ، و الآن أريد أن أسند  قيمة إليه . و أفضل طريقة للإضافة تاريخ للمتغير هي إضافة التاريخ الحالي ، لذلك سأقوم بكتابة إشارة الإسناد ، ثم أكتب DateTime.Now ثم الفاصلة المنقوطة ، نلاحظ أنه بمجرد أن قمنا بكتابة النقطة بعد اسم الكلاس DateTime قمت بإضافة الكلمة Now لأخذ التاريح الحالي ، و لو قمت بطباعة المتغير ، سيطبع البرنامج التاريخ و الوقت ، الصيغة التي قام بطباعتها هنا اعتمدها عندما قمت باستدعاء DateTime.Now قام باعتماد الصيغة الموجودة على الجهاز ، و الصيغة تختلف بين بلد و بلد آخر ، فمثلاً في الولايات المتحدة الأمريكية يبدأ بكتابة الشهر بدل اليوم .

و هنا صادف أن التاريخ الحالي 8.8 ، و في هذه الحالي قد لا ندري أهذا هو الشهر أو اليوم ، و هنا في الجهاز الذي استخدمه النظام يبدأ باليوم ثم الشهر و بعده السنة ، و نلاحظ أنه قام بطباعة الساعة بنظام 24 ساعة ، و قد يختلف هذا أيضاً من بلد إلى آخر ، فهناك بلدان تتعامل بنظام 12 ساعة و يقوم بإضافة PM  و  AM  ، فهذا يعتمد على طبيعة النظام الذي تستخدمه على جهازك .

الـ Methods المستخدمة في التعامل مع التاريخ و الوقت :

الآن .. هناك Methods في هذا الكلاس يمكن أستخدمها لطباعة شكل معين من التاريخ ، فنلاحظ أنه قام بطباعة التاريخ مع الوقت ، ماذا لو أردت طباعة الوقت فقط . أو طباعة التاريخ فقط . و سنتعرف على هذه الدوال واحدة تلو الأخرى .

في السطر الذي قمنا بطباعة المتغير به ، و بمجرد وضع النقطة التي أسميناها الـ Member Access ستظهر الدوال التي يمكننا استخدامها  أو العديد من القيم التي يمكن أن تحصل عليها .

فلو قمت بوضع ToShortDateString و قمت بطباعة الناتج ، فلاحظو أنه سيعطيني التاريخ فقط و بالصيغة المختصرة ، و التي هي عبارة عن أرقام ، فنلاحظ أنه يظهر 8.8.2017 .

لكن هناك إمكانية للحصول على نسخة غير مختصرة و ذلك باستعمال الدالة ToLongDateString و قمت بطباعة المتغير ، فسيظهر التاريخ بشكل كامل و سيكتب اسم الشهر و اسم اليوم كذلك ، و يسمى هذا التاريخ الطويل ، لأنه لم يكتفِ بوضع اليوم ثم نقطة ثم الشهر ثم نقطة ثم السنة ، بل قام بوضعها بالصيغة الطويلة

و بالمثل هناك دالة يمكن استخدامها ، ألا و هي ToShortTimeString ، و هي تقوم بطباعة الساعة و الدقائق فقط بالشكل 19:13

و بالمثل إذا قمت بكتابة ToLongTimeString فسيطبع الساعة ، و الدقيقة ، و الثانية كذلك .

 

ليس هذا فحسب ، بل لديك إمكانيات كذلك بالتعامل مع إضافة ساعات أو أيام مع هذا التاريخ ، فإن قمت بإضافة Add  بعد النقطة فسيظهر لدينا AddDays و AddHours و AddMinutes و  AddSeconds  و AddYears ، فهناك عدة دوال لإضافة الشيء الذي تريده .

فمثلاً أريد إضافة 3 أيام للتاريخ الحالي ، ففي الأعلى قمنا بأخذ الوقت الحالي عند كتابة الكلمة Now . و مباشرة سأقوم بطباعة الوقت الحالي و لكن سأقوم بإضافة 3 أيام إليه ، و ذلك باستعمال الدالة AddDays(3)
و بتنفيذ التطبيق سيقوم بطباعة التاريخ بعد زيادة 3 أيام ، فتاريخ اليوم هو 8.8.2017  لكنه قام بطباعة 11.8.2017

و ذلك لأنني استخدمت الدالة ()AddDays  عندها قام بإضافة الرقم الموجود بين قوسي الدالة إلى التاريخ الحالي .

 

نلاحظ الآن أن المتغير من النوع DateTime ، و الـ Method التي استعملناها إذا قمنا بوضع الماوس عليها سنلاحظ أنها تقوم بأخذ Value و ترجع قيمة تاريخ و ليس string ، و بما أنه قام بإرجاع قيمة تاريخ ، فبإمكاني أن أطلب مرة أخرى تحويله إلى تاريخ قصير ، و ذلك بوضع النقطة مرة أخرى و استعمال الدالة ToShortDateString ، و بتشغيل التطبيق نلاحظ أنه قام بزيادة 3 أيام كما طلبنا سابقاً ، و قام بطباعة التاريخ بالصيغة المختصرة .

و هنا أود أن أوضع قضية مهمة ، و هي أنه طالما أن النوع DateTime و تقوم بعمل Method تقوم بتحويله أيضاً إلى DateTime ،فبإمكانك أن تقوم بعمل سلسلة لا نهائية من الـ Methods .

 

أي بعد أن تقوم بعمل زيادة 3 أيام ، قم بعمل زيادة 3 ساعات ، و قم أيضاً بعمل زيادة شهرين ، و هكذا … ، فهذه السلسل يمكن أن تكون لا نهائية ، و هذه الفكرة ليست حصرية في الـ DateTime ، فكل المتغيرات أو كل شيء يقوم بإعادة شيء من نفس النوع ، فبإمكانك أن تعيد استخدام الـ Method الموجودة في ذات النوع

اذاً بالمثل يمكنني أن أطلب هنا أيضاً طباعة الوقت الطويل .

و بالمثل أيضاً يمكنني إضافة قيم سالبة ، بمعنى أنه سيقوم بطرح القيم السالبة من التاريخ الحالي . حسناً .. سأقوم بطلب خصم 3 أيام ، و عندها سيقوم بطباعة 5.8.2017   . و عند طلب الخصم نختار الدالة AddDays و نضع بين قوسيها قيمة سالبة مثل (3-) .

 

أيضا يمكنك أن تتعامل مع جزء ، أو أن تقوم بطباعة جزء واحد من التاريخ فقط ، بمعنى أنه إن قمت بوضع Month بعد النقطة فنلاحظ أن القيمة الراجعة هي integer ،بمعنى أنه سيقوم بطباعة رقم الشهر ، و بتشغيل التطبيق يظهر الرقم 8 و هو رقم الشهر الحالي .

هذا إن قمنا بتعريف متغير و اسناد قيمة التاريخ الحالي إليه . لكن ماذا لو قمنا بوضع تاري نأخذه من المستخدم أو استخدام تاريخ خاص بنا ؟

استخدام تاريخ خاص ، أو استعمال تاريخ يدخله المستخدم :

لعمل ذلك نقوم بعمل التالي ،

نقوم بتعريف متغير و وضع إشارة الاسناد ، ثم نضع الكلمة new ثم DateTime و نفتح قوساً ، و بمجرد فتح القوس قام بإظهار عدد يمكنني وضع القيم فيه ، و بضغط الأسهم سأحصل على معلومات يمكنني استخدامها لأقوم بملء هذه الدالة .

هنا سأقوم بإضافة السنة في البداية ، ثم الشهر ، ثم اليوم . لاحظو أنني قمت بتعريف المتغير من النوع DateTime و قمت بإسناد قيمة قمت أنا بإدخالها و لم استخدم التاريخ الحالي .

فإن قمت بطباعة الناتج نلاحظ أنه قام بتحويل الأرقام التي كتبتها إلى صيغة كاملة ، فقام بكتابة اليوم و الشهر و السنة ، و بطبيعة الحال لأنني لم أقم بكتابة الوقت قام بطباعته 00:00:00 .

أيضاً بإمكانك أن تقوم بأخذ قيمة من المستخدم و محاولة تحويلها إلى قيمة تحاكي التاريخ و الوقت ، فكما في السابق قمنا بتعريف المتغير و وضع إشارة الاسناد ، ثم إضافة اسم الكلاس ، ثم وضع نقطة الـ Member Access ، و نستخدم الدالة Parse التي تقوم بأخذ قيمة نص و تحويلها إلى Date

الآن سأقوم بوضع قيم التاريخ بين قوسي الدالة ، نلاحظ أن القيم – الموجودة بين الأرقام يمكن أن تكون مختلفة ، هنا في هذه الـ Method ليقرب القيمة إلى أقرب صيغة تاريخ ممكن أن تقوم معرفة ، و إذا قمت بوضع قيم غير مناسبة قد تحدث مشكلة . نقوم الآن بتشغيل التطبيق ، نلاحظ أنه رغم أنني قمت بكتابة خطوط بين الأرقام ، لكنه قام بأخذ الرقم الأول و حوله إلى تاريخ ، و أخذ النص الثاني و الثالث كذلك ، و قام بتحويل الخطوط إلى نقاط . و لو قمنا بتغيير الخطوط – إلى / سيقوم بذات العمل ، و سيحولها إلى نقاط .

حساب الفترة الزمنية بين تاريخين :

ماذا لو أردنا حساب الفترة الزمنية بين تاريخين ، بمعنى أريد حساب الوقت الذي عشته من تاريخ ولادتي إلى الآن.

بمجرد أن نقول أننا  نريد التعامل مع فترة زمنية ، فهناك متغير جديد اسمه TimeSpan ، و هو يقوم بأخذ تاريخين و يحسب الفرق بينهما .

الآن سأطلب منع حساب الفرق بين الوقت الحالي عن طريق DateTime.Now و إضافة إشارة – لطرح قيمة المتغير myBirthday .

إذا قمت بطباعة المتغير myAge  ستظهر لدينا أرقام ، ما هي طبيعة هذه الأرقام ؟ و كيف نقوم بقراءتها ؟

الـ TimeSpan يقوم بإرجاع قيم تبدأ بالأيام ، ثم بالساعات ، ثم بالدقائق ثم بالثواني ، ثم أجزاء الثواني ، فالرقم الأول من الجهة اليسرى هو عدد الأيام ، و الرقم الثاني 19 هو عدد الساعات ، و الرقم الثالث 26 هو الدقائق ، و الرقم 32 هو الثواني ، و الرقم الأخير في الجهة اليمنى هو أجزاء الثانية . و نلاحظ أنه قام بحساب الساعات من 00:00:00 لأننا لم نحدد الساعة بدقة كما قمنا بالتحديد بالنسبة للتاريخ .

نلاحظ أن المتغير TimeSpan ليس من النوع DateTime ، لذلك إذا قمت بإضافة النقطة سأحصل على عدد من الدوال الخاصة به ، و من هذه الأمور هو الـ  TotalDays ، و باختياره و تنفيذ البرنامج سيظهر عدد الأيام الكلي .

تطبيق يقوم بحساب الوقت بين تاريخين :

الآن بما أننا تعلمنا كيف نقوم بأخذ فترة زمنية و نقوم بطباعة قيم معينة ، دعونا نقوم بتحويل ما تعلمناه إلى تطبيق يمكننا استخدامه ، لذلك سنقوم بعمل تطبيق يسأل المستخدم عن تاريخ ولادته ، و نحاول تجزئة التاريخ بحيث أن البرنامج سيخبر المستخدم كم عدد مجمل الأيام و الساعات و الدقائق التي مرت منذ ولادته .

 

في بداية التطبيق سأقوم بطباعة جملة تسأل المتسخدم عن إدخال تاريخ ولادته ، و يفضل أن نقوم بإعطائه Hint  لكيفية ادخال التاريخ ، لأنه إذا حاول إدخال قيمة غير مناسبة سيحصل خطأ في التطبيق ، فهنا سنحاول أخذ التاريخ و تحويله إلى النوع DateTime ، و ذلك باستخدام الدالة Parse . و سنناقش ان شاء الله في دروس قادمة كيف نحل هذه المشاكل . و هنا سنقوم باستخدام الدالة Write لأننا نريد أن يطبع التاريح على نفس السطر .

الآن سأقوم بتعريف متغير من النوع  DateTime ثم إشارة الاسناد ، ثم سأستدعي الكلاس الأصلية و أقوم باستخدام الدالة Parse  لتقوم بمعالجة النص و تحويله إلى تاريخ ، و النص هو Console.ReadLine من المستخدم .
إذاً هنا قمت بطلب نص من المتسخدم ، و هذه القيمة حتماً ستكون string ، و هو في منطقة الـ Parse ، و الذي بدوره سيحاول تحويل القيمة إلى DateTime و التاريخ الذي حاول تحويله  سيقوم بإسناده إلى المتغير .

الآن سنقوم بتعريف متغير من النوع TimeSpan و سأكتب هنا الوقت الحالي و أطرح منه الوقت الذي أدخله المستخدم ، و يمكنني هنا أن أستخدم إشارة الطرح ، لكنني سأستخدم دالة جديدة ، و هي Subtract ، و هي تخبره أن يقوم بعملية طرح للتاريخ الثاني الذي سنضعه بين قوسي الدالة الجديدة ، وهو التاريخ الذي أدخله المستخدم .

و أخيراً سأقوم بطلب طباعة الوقت الكلي للوحدات الأيام ، الساعات ، و الدقائق .

الآن سنقوم بتشغيل البرنامج ، و نلاحظ لو قام المتسخدم بإدخال شيء مغاير سيخرج من التطبيق و هذا الخطأ أثناء  التشغيل ، و هذا الخطأ يعتبر قاتلاً ، و سنتعلم في دروس قادمة كيف نقوم بحل هذه المشاكل .

الآن نقوم بتشغيل التطبيق و ادخال تاريخ الميلاد ، سيقوم البرنامج حينها بطباعة اجمالي الأيام و الساعات و الدقائق .

 

في هذا الدرس قمنا بالتعرف على كيفية أخذ التاريخ الحالي ، و كيف يمكننا تحويله إلى صيغ تتناسب مع المعطيات الموجودة لدينا ، و تعلمنا كيفية إضافة أجزاء إليه ، كإضافة ساعات أو دقائق إلى التاريخ الحالي ، و تعلمنا أيضاً كيف نقوم بالتحويل من نص و محاكاته إلى شيء يشبه التاريخ عن طريق الدالة Parse ، و تعرفنا أيضاً على قضية مهمة و هي الـ TimeSpan .

مصطلحات الدرس :

DateTime :

DateTime.Now :

Member Access :

Parse :

TimeSpan :

Hint :

Subtract :

تجد هنا الأسطر التي قمت بكتابتها خلال الدرس.

 

 

 

post

#16 التعامل مع النصوص Strings – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : KUT

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  التعامل مع النصوص Strings

كيفَ يُمْكِنُنا التَّعامُلُ مَع النُّصوصِ المُخْتَلِفة ، و كَيْفَ يُمْكِنُنا اقْتِباسُ جُزْءٍ مُعَيَّنٍ مِنْ نَصٍّ كامِلٍ ، و كيف يمكننا استبدال أحرف معينة في نص كامل ، و كيف يمكننا أيضاً معرفة عدد خانات الحروف في نص ما ؛ هذا ما سوف نعرفه في هذا الدرس بعد الفاصل إن شاء الله .

 

السلام عليكم و رحمة الله و بركاته ، و أهلاً بكم في درس جديد من دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة السي شارب .

بسم الله الرحمن الرحيم

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

و من خلالها يتم استخدامها في أمور معينة ، و عمل تعديلات عليها ، لذلك يجب أن يكون عندك معرفة بالأدوات و الـ Methods التي بإمكانك استخدامها للحصول على نص أو جزء من نص  ، و تعديل نص معين يمكنك استخدامه في البرنامد الخاص بك

 

نبدأ بإنشاء مشروع جديد بلغة #C من النوع Console App

في البداية سأكتب الأسطر التالية لأننا سنستخدمها بشكل أساسي

نلاحظ الآن أننا إذا قمنا بتشغيل البرنامج فلن يظهر شيء

حسناً ، إذا توجب علينا في حالة ما استخدام علامتي التنصيص في نص معين ، فإذا حاولت إضافة علامتي تنصيص فسيحدث مشكلة ، لماذا ؟

لأن الـ Compiler أخذ الجزء الأول و اعتبر العلامة الثانية في المنتصف هي نهاية النص الأول .

لذلك إذا أردت استخدامها فبإمكانك وضع Back Slash قبلها لكي تخبر الـ Compiler  أن هذه العلامة هي فعلاً رمز  سيستخدم داخل النص

نوضح الفرق بين الـ Slash و الـ Back Slash حتى لا يحصل التباس ، فالـ Slash  هي التي تكتب بالشكل (  /  )

أما الـ Back Slash فتكتب (  \  )

و نلاحظ أن الـ Slash /    لا تعمل عمل الـ Back Slash

الآن بعد إضافة الـ Back Slash و تشغيل التطبيق سنلاحظ أن البرنامج قام بطباعة علامتي التنصيص بشكل صحيح

و هذا هو أول استخدام للـ Back Slash

نقوم بتحويل الجملة السابقة إلى جملة ملاحظة .

 

الآن في هذه الجملة الجديدة أحتاج إلى النزول إلى سطر جديد … فإنني إن قمت بطباعتها فستظهر ف نفس السطر

لذلك إن أردنا النزول لسطر جديد فسنكتب   (Back Slash + n)      ، و عندها سيفهم الـ Compiler أنه عند هذه النقطة قم بالنزول إلى سطر جديد . و بتنفيذ البرنامج نرى أن المطلوب قد حدث فعلاً

 

نقوم بتحويل الجملة السابقة أيضاً إلى جملة ملاحظة .

 

الآن ماذا لو أردنا طباعة الـ Back Slash  في النص المراد طباعته ، فبوضعها مباشرة ضمن التطبيق ستظهر مشكلة في تطبيقنا ، و السبب أن الـ Compiler افترض أن هذا الـ Back Slash سيأتي بعده Character  معين لكي يقوم بعملية معينة ، لكن هنا في مثالنا الـCharacter التالي للـ Back Slash  هو مسافة فارغة

لذلك إن أردت استخدام الـ Back Slash قم بوضع Back Slash قبلها مباشرةً ، بالتالي فإن الـ Back Slash  الذي سيأتي ثانياً هو الذي سيتم طباعته ، أما المكتوب قبله مباشرة سيخبر الـ Compiler أن التالي هو عبارة عن نص وليس Back Slash escape Character

نلاحظ أننا إذا قمنا بتشغيل التطبيق سيقوم بطباعة المطلوب بشكل صحيح و دون مشاكل أو أخطاء

حسناً .. ماذا لو كان لدينا أكثر من Back Slash  في ذات النص ، فهل سأذهب إلى كل واحد منها و أضع قبله Back Slash إضافي ؟؟

بالطبع لا ، فبإمكانك الذهاب إلى ما قبل علامة التنصيص التي في بداية النص و إضافة الرمز @ ، و التي بدورها ستخبر الـ Compiler أن يعتبر كل رموز Back Slash الموجودة ضمن النص عبارة عن Character  عادي و ليس Back Slash Escape Character، و بالتالي تخبره أن يقوم بطباعة هذا الرمز

 

تكلمنا سابقاً عن :

;string myString = string.Format(“{0} = {1}” ,”First” , “Second” )

و كما تحدثنا ، إن أردت وضع قيمة معينة داخل نص فلا داعي لكتابة الجملة ثم أقوم بإنهائها ثم أضع القيمة ثم أعود لمتابعة الجملة ، بدلاً من ذلك سأقوم بوضع index  ، بحيث يقوم الصفر بأخذ أول خانة مباشرةً بعد الـ string

و الرقم 1 يقوم بأخذ الخانة رقم 2 ، و يتم فصل الخانات بفاصلة

بتشغيل التطبيق نلاحظ أنه أخذ أول قيمة بعد الـ string عند الرقم 0 ، ثم قام بأخذ القيم الثانية عند الرقم 1

و ليس من الضروري أن نقوم باستخدام 0 ثم 1 ثم 2 …. ، فبإمكاننا أخذ القيمة الأولى مرتين ، أو نقوم بطباعة القيمة الثانية ثم القيمة الأولى .

 

حسناً.. هذا المكان الموحود في الكود السابق {…}  له Format خاصة به ، من الممكن أن نقوم باستخدامها للتأثير على القيمة الموجودة هنا بطريقة معينة

نقوم بطباعة جملة جديدة و وضعنا بعد الرقم الحرف C فسيقوم بتحويل القيمة إلى الموجودة إلى قيمة عملة ، حيث سيضع قبلها علامة العملة الخاصة ببلد معين ، فإن قمت تستخدم الدولار فسيقوم بوضع العلامة $ ، و تتغير بحسب العملة المتبعة في بلدك ، لكن في جهازي أنا استخدم الليرة التركية ، فسيظهر علامة استفهام لأن رمز الليرة التركية غير معرف

 

الآن إذا كان لدينا رقم طويل بحيث يكون صعب القراءة ، كما تعلمنا في دراستنا فإن الرقم عادة يقسم بحيث يوجد فاصلة بين كل 3 خانات ، فإذا أردت أن يكون الرقم مفصولاً كذلك فيمكن أن نستخدم الحرف N ، عندها سيقوم بوضع الفواصل و النقط و عند التنفيذ نلاحظ أنه أضاف النقط بحيث يقسم كل 3 منازل ، و يضيف الفاصلة العشرية حتى لو لم تكن موجودة ، و يضيف الصفر إلى يمينها

 

ماذا لو أردنا استخدام النسبة المئوية percentage ، مثلا 20% , 30%

فيمكنك استخراجها باستخدام الحرف P و سنكتب في البداية كلمة percentage أو أي نص آخر

عندها سيقوم بتحويل الرقم  251. إلى 25.10%

 

ماذا لو أردت استخدام Format خاص بي

حيث سأقوم بإضافة الفواصل و النقاط و الشرطات بحسب رغبتي ، فيمكن عمل ذلك كما يلي،

ليكن لدي الرقم 1234567890 و اريد أن أحوله إلى رقم هاتف

لاحظو بعد النقطتين يمكننا طباعة الرقم كما نريد

فنضيف (###) ###-####)

كل إشارة من الإشارات السابقة هي عبارة عن خانة ، و بذلك قمنا بتنسيق الرقم كما أردنا ، و بتطبيق البرنامج سيطبع الرقم (123) 456-7890

و هذا يعد Format خاص

 

ماذا لو أردت التعامل مع نص حقيقي

لدي جملة و أريد أن آخذ أجزاء منها أو أقوم بعمليات عليها فماذا أفعل

سنعرف المتغير myString من النوع string  ثم أقول له

myString القديم سيصبح muString نفسه و اضع نقطة ، و بمجرد وضع النقطة ، و لأنه متغير نصي سيظهر لديك جميع الـ Methods الخاصة بـ string ، و بالطبع لكل نوع من أنواع البيانات Methods  خاصة به

يمكنني هنا أن أقوم بعملية قص عن طريق اختيار الدالة Substring التي اخترناها بعد النقطة

نفتح قوسي الدالة و نكتب 5 على سبيل المثال ، عندها سيقوم بقص أول 5 خانات و يطبع الباقي

يمكننا عن طريق إضافة فاصلة و رقم آخر إلى المثال السابق ، و عندها سيقوم بطباعة ما بين الخانة 5 و 11 ، و يقوم بحذف الباقي

 

ماذا لو أردت أن تحول كل أحرف الـ string إلى حروف كبيرة

عندها سنستخدم الدالة ToUpper بدلاً عن الدالة Substring ، و بعندها سيقوم بطباعة الخانات كلها مع تغيير حالة الحروف إلى حروف كبيرة

 

ماذا لو أردت استبدال خانة أو حرف بخانة أخرى ،

مثلا في النص السابق أريد استبدال خانة المسافة بخانة أخرى ، فعندها سنستخدم الدالة Replace ،

و هذه الدالة تحتاج إلى قيمتين ، فالأولى هي Old Character  و الثانية هي New Character

نكتب كل قيمة بين علامتي تنصيص ، و يفصل بين القيمتين بفاصلة

ندخل القيمة الأولى هي المسافة ، أما الثانية نجعلها الرمز –   ، عندها سنرى أن التطبيق استبدال المسافة بالرمز –

 

ماذا لو اردنا حذف جزء من الكلمة الموجودة ، فيمكن استخدام الدالة Remove  ، و لهذه الدالة أكثر من استخدام

فلو أدخلنا رقم واحد فقط ،  و ليكن الرقم 5 ، فسنلاحظ أنه أخذ أول 5 خانات و حذف الباقي

و لو قمنا بوضع قيمتين فسيقوم بحذف ما بين الخانة 5 و 11 و يطبع كل ما تبقى

 

استخدام الـ StringBuilder :

هناك قضية يجب أن ننوه لها ، فاستخدامك للـ string مكلف فعليا ، و نعني بذلك ، حاول قدر الإمكان التقليل من استخدامك للـ string

فاستخدامك له و تخزين Data  كبيرة داخله يحجز مساحات كبيرة في الذاكرة ، و هناك فرق شاسع بي تخزينك للـ integer  و تخزينك للـ string

لذلك حاول أن تكون حذراً و دقيقاً في استخدامه

 

لاحظ الآن سأقوم بمحاولة طباعة لـ string ضخم جداً ، و أقوم باستخدامه بطريقة غير مجدية

لاحظو هذه الطريقة في كتابة الحلقة for  ،

نكتب كلمة for و لا نكتب مسافة بعدها ، ثم نضغط Double Tab فسيقوم بوضع الهيكل الخاص بحلقة for

و هذه الميزة غير موجودة في كافة المحررات

بعد وضعه للهيكل الخاص يمكن التعديل عليه

 

سنشرح قضية هنا مهمة

لاحظو هنا القيم الموجودة قيمة integer  و في بعض الأحيان لا يقبل وضع قيمة int في متغير string

فمن الممكن تحويل أي متغير يمكن تحويله مهما كان نوعه  إلى string عن طريق الدالة ToString ،

الآن سيقوم البرنامج بعملية يأخذ القيمة الجديدة و وضعها في مكان معين ثم أخذ هذا المتغير مرة أخرى ،

و هذه العملية غير صحيحة كما تعلمنا ، فهي تقوم بعملية إضاعة

نحن هنانقوم بعملية 100 حلقة ، لكن تخيل لو كان لدينا 1000 حلقة أو مليون حلقة ، فسيكون مكلفاً جداً و سيقوم التطبيق باستهلاك مساحات كبيرة

لذلك لو كان لدينا string  كبير و يحتوي على أمور تجعلك بحاجة إلى القيام بعملية إضافة قيم له

فيفضل استخدام نوع جديد اسمه StringBuilder ، هذا النوع جداً مميز لاستخدام النصوص الكبيرة و عملية إضافة القيم إلى المتغير

لاحظو في المثال السابق كان يقوم بالإضافة بأسلوب غير مجدِ ، لذلك سنقوم بتحويل السابق إلى جمل ملاحظة

و مثلا هنا سنقوم بتعريف متغير من النوع StringBuilder باسم myString

 

لو قمنا بتطبيق البرنامج سيقوم تماما بعمل البرنامج السابق ، لكن قام بتقليل المساحة المستخدمة و لم يقم بوضعها في مكان و نقلها إلى مكان آخر ، بل قام بعمليات خاصة و مميزة للتقليل من حجم الذاكرة ،

 

إذا يفضل استخدام الـ StringBuilder إذا كان لدينا نص كبير يتم قراءته ، كملف تقوم بتخزين نصوص عليه ، و تحتاج لقراءته مرة أخرى ، يفضل وضعه بـ StringBuilder لأنه مخصص للنصوص الكبيرة

 

و إلى هنا نصل إلى نهاية درسنا :

تعلمنا طريقة استخدام الـ Back Slash Escabe Character

يمكنكم الاطلاع على  Standard Numeric Format String من شركة Microsoft

ستجدون بها جميع الخانات التي يمكن استخدامها

كان هذا درساً سريعة عن الـ string لتحصل على النتائج المطلوبة ، فقد استخدمنا الكثير من الـ Methods لنصل إلى النتيجة المطلوبة و لو حاولنا الوصول إلى النتيجة بدون هذه الدوال سيكون صعباً بل مستحيلاً

ملخص الدرس

مقدمة:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ السادس عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على كيفية التعامل بشكل أكبر مع النصوص، كونها شيء أساسي في كل المشاريع، سنتعلم كيف نقوم بقص جزء معين من جملة، وكيف نقوم بطباعة أرقام بهئية خاصة نقوم بتعريفها.

التعامل مع النصوص Strings :

لا يخلو تطبيق صغير أو كبير من إستخدام النصوص والتعامل معها، لذلك هناك عدد كبير من الدوال للنوع النصي String يمكنك معرفة المزيد عن الدوال التي تقوم بوظائف معينة، هنا شرح لبعضها :

رموز خاصة Escape Character : ويتم بإضافة \ وبعدها خانة مثل : n لسطر جديد ، ” لطباعة التنصيص داخل نص، \ لطباعته داخل نص، القائمة الكاملة للحروف هنا.
تهيئة النص string.Format : وذلك بإستخدام أرقام Index ويمكن إضافة تخصيص لها مثل : N لطباعة الأرقام بالفواصل ، P لطباعة قيمة مئوية، القائمة الكاملة هنا.
Substring : تقوم بعمل قص للنص.
ToUpper : تقوم بتحويل جميع الأحرف إلى أحرف كبيرة Capital letter .
Replace : إستبدال نص بنص آخر.

 

مصطلحات الدرس :

Compiler :

Back Slash :

Character :

Back Slash Escape Character :

index :

Format :

Percentage :

Substring :

ToUpper :

Replace :

StringBuilder :

Double Tab :

Standard Escape Format String :

 

تجد في الأسفل الأسطر البرمجية التي قمنا بكتابتها خلال شرح الدرس.

post

#14 الدوال Methods – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OXW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الدوال Methods

 

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

درس اليوم ” الدوال الـ Method “

و هي من أساسيات البرمجة و هي التي أعطت للمطورين إمكانية أن يقوم بتنفيذ مشروعه دون أن يقوم بتكرار الأسطر البرمجية أكثر من مرة

سابقاً لم يكن هناك دوال و كان المطور مجبراً على كتابة أسطر برمجية متتالية ، فتجد أن البرنامج عبارة عن 1000 سطر على سبيل المثال ، كلها متتالية حيث ينفذ السطر الأول ثم الثاني فالثالث و هكذا ….. مما كان يجعل الأمر صعباً

و خصوصاً في حال وجود أي خطأ في البرنامج فيجب أن يقوم بتتبع للبرنامج ليصل إلى مكان الخطأ

 

كما تعلمنا في كل الدروس السابقة نقوم بإنشاء مشروع جديد و نختار Visual C# ثم Console Application و سنكتب اسم البرنامج هذه المرة ” Methods ”
و تكلمنا أنه يجب أن نقوم بالبدء بالكتابة بين قوسي الدالة void Main

لكن في هذا الدرس سنتعرف إلى طريقة جديدة و مفهوم جديد يمكننا بواسطته إنشاء دوال .

و الدالة يمكن شرحها بأنها قطعة برمجية  Block of Code تبدأ بقوس و تنتهي بقوس آخر ، و تحمل اسم , حيث يتم استدعاء هذا الاسم لتقوم بالعمل الخاص بها .

لاحظو الدالة الرئيسية void Main و هي الدالة التي يبدأ بها الـبرنامج

سنقوم الآن بكتابة دالة رئيسية و سنقوم بشرحها و شرح التركيبة الخاصة بها

هذه الدالة يمكن استخدامها و استدعاؤها في الدوال الأخرى كالتالي :

أخذ اسم الدالة (PrintMessage) ثم فتح القوس الخاص بها و اغلاقه و كتابة الفاصلة المنقوطة .

و لا ننسى أن نقوم بكتابة الدالة ReadLine

عند تشغيل التطبيق سيقوم بطباعة Hello World !

الفكرة من الدوال أنه يمكنك إضافة العديد من الأسطر البرمجية في وِحدة خاصة بها ، بحيث في حال الحاجة إلى تكرار الأسطر ، فيمكنك استدعاؤها عن طريق اسمها دون الحاجة لكتابة كافة الأسطر .

شرح الدالة

في البداية يجب أن تقوم بكتابة الدالة خارج الـ void Main  لأنه لا يمكن كتابة دالة داخل دالة

لذلك إذا أردت كتابة دالة فيجب كتابتها خارج الدوال الأخرى

الترتيب غير مهم هنا و هذا يعني أنه بإمكانك كتابتها قبل أو بعد الـ void Main

و عند الحاجة إليها أقوم بكتابة اسمها دون كتابة الأسطر البرمجية الموجودة بداخلها

 

فوائد الدوال :

(1) : استدعاء أسطر برمجية يتم كتابتها أكثر من مرة ، بحيث تقوم بكتابتها مرة واحدة داخل الدالة ثم تقوم باستدعاء الدالة في كل مرة تحتاج إلها .

(2) : عدم تكرار الأسطر البرمجية نفسها

(3) : تقوم بتنظيم المشروع

(4) : في حال حصول أي مشكلة يمكن تعديلها بشكل بسيط في مكان واحد دون تتبع التطبيق بشكل كامل

 

هذه القضايا سنتكلم عنها في الدروس القادمة و سنتحدث الآن عن الدالة void

 

 

الـ void هي نوع من أنواع البيانات أو أنواع الـ Data مثل integer  و  string

لكنها لا تعود بقيمة و سنتعرف عليها بعد قليل

يمكننا نقل السطر ;()Console.ReadLine إلى الدالة التي قمنا بإنشائها

 

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

 

هذا البرنامج يسأل المستخدم عن اسمه و اسم عائلته ، ثم يسأل عن المدينة التي ولد فيها ، ثم يقوم بإظهار رسالة تحتوي على العناصر السابقة بشكل معكوس كما تعلمنا في الدرس السابق ، و ذلك عن طريق الدالة Array.Reverse

لدينا الآن أسطر برمجية مكررة في هذا التطبيق ، حيث يقوم بطباعة جملة ثم يقوم بمطالبة المستخدم بعملية إدخال و يكرر هذا الأمر

ثم يقوم بتعريف Array من النوع char  ثم يأمر بتحويلها إلى مصفوفة ثم يقوم بعملية عكس لهذه المصفوفة

إذا لدينا ثلاث أسئلة و لكل سؤال 4 عمليات

و بالتالي لدينا تقريباً 12 سطر

و في النهاية يقوم بتعريف متغير جديد باسم result

و يقوم باستخدام الحلقة foreach ليقوم بأخذ هذه الأحرف و يجمعها ليعطي هذه النتيجة

نلاحظ عند تشغيل التطبيق أنه أخذ كلمة كلمة و لم يعكس الجملة كاملة ، حيث قمت بإدخال Osama  ثم  Deep ثم amman

فأخذ الاسم الأول و قام بعكسه ، ثم أضاف مسافة قبل الاسم الثاني ثم تابع أخذ الاسم الثاني و المدينة ،

عندها قام بإعطاء النتيجة كالتالي

Result : amaso peed namma

لنرى كيف نكتب دالة توفر علينا هذا الكم من الكتابة ، فبدلاً من كتابة 16 سطر سنقوم بكتابة 4 اسطر فقط و استدعاء هذه الدالة

 

الآن نقوم بتعريف دالة جديدة

ثم نكتب التالي ضم قوسي الدالة {   }

كما في المثال التالي :

 

في البداية سنقوم بالتطبيق على الـ firstName فقط ، سنستدعي الدالة ليقوم بعرض الموجود داخلها .

المتغير الأول هو السؤال و المتغير الثاني هو ناتج المدخل

الآن سيقوم بطباعة السؤال و ثم يكون بعملية عكس للأحرف المدخلة في الجواب

حيث يقوم بتحويله لمجموعة من character  و اسنادها في متغير جديد ثم يقوم بعكسها باستخدام الدالة Array.Reverse

و في النهاية سيقوم بطباعة firstNameArray

الآن لدينا الجزء المتكرر في كل المراحل السابقة و قد أصبح ضمن الدالة التي قمنا بإنشائها

الآن نقوم بعملية استدعاء للدالة التي قمنا بإنشائها

عندها سيسأل عن الاسم الأول و يطلب إدخاله ، و سيأخذ القيمة من المستخدم و يدخلها في متغير نصي  و يتابع

عند تشغيل التطبيق سيسأل عن الاسم و عند ادخال osama  يقوم بطباعة osama لكن بالشكل المعكوس … أي  amaso

 

الآن لنلاحظ أن هذه الدالة هي من النوع void و تقوم بتنفيذ الاسطر الموجودة بدون ارجاع أي قيمة أخرى

لاحظوا أنه سيكون لدينا مشكلة إذا قمنا بكتابة هذه الدالة للاسم الثاني و اسم المدينة

المشكلة هي أنه إذا قمت باستدعاء اسم الدالة فعندها سيقوم بطباعة الاسم الأول لوحده ، و نحن لا نريد هذا

نحن نريد أن يقوم بإرجاع القيمة الناتجة و استخدامها لاحقا

 

فقد تكلمنا أن الـ void لا يرجع أي قيمة ، لكن بإمكاننا استبدال هذا النوع بـ string

أي أن هذه الدالة ستقوم بعمليات معينة ثم ستعيد نصاً إلى مكان استدعائها

 

بما أن هذه الدالة أصبحت من النوع string  و ليس void  فيجب أن ترجع قيمة و بالتالي ستحتوي على return لشيء ما في نهايتها

و القيمة التي نريد ارجاعها هي النص الموجود لدينا  فيصبح السطر الأخير :

;Return string.concat(firstNameArray)

عندها سيكون هذا السطر راجعاً من الدالة DisplayResult

أي أنني في الأعلى يمكنني أن أقوم بتعريف

;()string firstName = DisplayResult

و النوع الموجود قبل إشارة المساواة من النوع string وبالتالي DisplayResult ذات الأمر ، لأن الدالة الموجودة في الأسفل من النوع string و النتيجة الراجعة من النوع string

نقوم بتشغيل التطبيق لنتأكد من صحة المعلومات و نلاحظ أنني لا اريد أن أقوم بطباعة الناتج داخل الدالة الثانية بل سأقوم بطباعته في الدالة void

 

فعلا قام التطبيق بطباعة osama  بشكل معكوس

سنلاحظ بعد قليل أن هذه الدالة قامت باختصار كاف الاسطر السابقة

 

و نتذكر أن الدوال من الممكن أن تكون int , string أو أي نوع من أنواع البيانات و يمكن أن تكون دالة لا ترجع قيمة مثل void

الشرط الأساسي أنه إذا لم تكن من النوع void فيجب عليك أن تقوم بإرجاع قيمة و هذه الدالة قامت بعمليات معينة و قامت بإرجاع الناتج النهائي
يمكننا الحصول على القيمة المرجعة عن طريق وضعها على الجانب الأيمن لإشارة المساواة في السطر الذي قمنا به باستدعاء الدالة و سيتم تخزينها مباشرة في firstName

الآن أريد استخدام هذه الدالة ليس فقط لطباعة الاسم الأول
بل لطباعة الاسم الأول و الأخير و السؤال عن المدينة التي ولد فيها

إذا في الدالة يمكنك أن تقوم بإرسال قيمة
لذلك سنقوم بتعريف متغير جديد

عندما نقوم باستدعاء الدالة يجب أن نرسل قيمة يتم ارسالها إلى الدالة

 

لذلك سنقوم بحذف السؤال في الدالة و نجعله قادماً من مكان استدعائها

إذا سنأخذ المتغير question و نضعه بعد string  بين قوسي الدالة (  )

الناتج كالتالي

سنقوم باستدعاء الدالة و نرفق معها السؤال بين القوسين ، عندها سيأخذ السؤال و يقوم بطباعته مباشرة و يقوم بعمليات معينة و يقوم بإرجاع القيمة النهائية إلى هذا المكان

 

الآن قمنا بإرسال هذا النص إلى الدالة و قام بطباعته و استخدام القيمة المرسالة مع هذه الدالة

نقوم بتعريف متغير جديد اسمه lastName ، و سأسأله سؤال ” ما هو اسمك الأخير” و القيمة الراجعة من الدالة سيقوم بإسناده للمتغير lastName
ثم نسأله عن مكان الولادة

لاحظو أن هذه الثلاث أسطر هي فعليا 12 سطر
لنتأكد أن القيمة الراجعة صحيحة

ثم نقوم بطباعة الناتج النهائي

بتشغيل التطبيق سيسأل عن الاسم الأول و الأخير و المدينة ، و سيقوم بعرض ذات النتيجة التي عرضها في التجربة الأولى

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

 

نصل الآن لنهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله

 

ملخص الدرس :

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الرابع عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على  الدوال Methods أو ما يسمى Function في لغات أخرى، والتي تعتبر العصب الرئيسي الذي يقوم عليه أي تطبيق ولا يخلو منها.

الدوال Methods :

يمكن تعريف الدالة على أنها قطعة برمجية Code Block تبدأ بجملة تعريفية بإسمها ونوعها سواء كانت نصية string أو رقمية int أو لا ترجع أي قيمة void أو أي نوع آخر. والدوال لها العديد من الميزات أهمها:
– تقليل عدد التكرارات الموجودة في التطبيق، وبالتالي قلة عدد الأسطر الإجمالي.
– تنظم المشروع، بحيث تكون الأسطر البرمجية الخاصة بعملية معينة في مكان واحد.
– سهولة إيجاد المشاكل المنطقية في حال وجودها لاحقاً.
و طريقة كتابة الدالة هكذا :
Method_Type Method_Name ()
}
{

خصائص الدوال :

كما ذكرنا قبل قليل، إن كانت الدالة غير النوع void ( لا ترجع أي قيمة)، أي أنها من النوع int أو string أو float أو أي نوع آخر، فيجب أن تقوم بإضافة سطر return value في نهايتها ويمكن الحصول على العائد من الدالة بعملية الإسناد، أيضاً يمكن إرسال قيم عند مناداة الدالة لإستخدامها داخل الدالة وهي ما تدعى arguments أو parameters ، وهي متغيرات يتم إستخدامها داخل الدالة للقيام بالمهمة الموكلة لها.

مصطلحات الدرس :

Methods :

Block of Code :

return :

float :

arguments :

parameters :

الأسطر البرمجية التي تم إستخدامها في الدرس :

post

وثيقة تطوير اللعبة Game Design Document

أهمية وثيقة تطوير اللعبة وكيف تقلل الوقت والجهد على فريق تطوير الألعاب

نبذة عن وثيقة تطوير اللعبة GDD :

السلام عليكم ورحمة الله وبركاته، كثر في الآونة الأخيرة إزدياد أعداد المطورين العرب، ومن المؤسف رؤية الكثير يقفز عن أهم مرحلة من مراحل تطوير اللعبة، ألا وهي المرحلة النظرية أو مرحلة كتابة مستند تطوير اللعبة المسمى Game Design Document ذو الإختصار GDD، حيث تكون في مرحلة قبل التطوير Pre-Production، فلازلنا نرى التوجه المباشر نحو محركات الألعاب، ولغات البرمجة وأدوات التصميم بشكل عشوائي وغير منظم، مما يضيع الكثير من الجهد والوقت خلال عملية تطوير الألعاب بحد ذاتها، لذلك كان لا بد من التطرق إلى مثال عملي عن هذه المرحلة، لكشف أهميتها لدى المطورين أنفسهم، ولتضفي خبرة كافية لهم لكي يقوموا بالإنتباه لها في مشاريعهم الحالية والمستقبلية.

إن كنت المسؤول عن عملية تصميم اللعبة Game Design ، فأنصحك بالإضطلاع على مهارات مصمم الألعاب عبر المقالة التالية : كيف تصبح مصمم ألعاب ناجح ، حيث تعتبر المقالة السابقة مقالة نظرية، وفي هذه المقالة سندخل تجربة تطبيق للعبة يتم تطويرها حالياً.

محتويات وثيقة تطوير اللعبة :

يمكن أن تحتوي هذه الوثيقة على خليط بين النصوص والصور والأشكال التعريفية Diagrams، أو سكيتشات أولية Concept Arts بالإضافة إلى أنها يمكن أن تحمل خوارزميات أو أسطر برمجية قياسية، أو ما يمكن تسميته Pseudocode يعطي إنطباع عن المهام الوظيفية التي ستكون داخل اللعبة، ويمكن تلخيص الأقسام الرئيسية التي تحويها كالتالي :

القصة Story : حيث يتم كتابة الفكرة الأولية للسيناريو وقصة اللعبة، ويمكن تفصيلها وتعديلها لاحقاً.
الشخصيات الرئيسية Characters : فكرة عن طبيعة شخصية اللاعب و الشخصيات المشاركة باللعبة، أو ما يعرف ب Non-Player Characters ذو الإختصار الشهير NPC.
تصميم المراحل Level/environment design : يتم وضع تصور عام عن بعض المراحل، ويمكن أن تكون عبارة عن رسومات أولية على أوراق حقيقية.
طريقة اللعبة Gameplay : وهي جوهر اللعبة لأهميتها، ويمكنك مراجعة مقالة كيف تصبح مصمم ألعاب ناجح ، للمزيد من المعلومات حول تصميم اللعبة.
الرسومات Art : السمة العامة المستخدمة داخل اللعبة، هل هي ثلاثية البعد أم ثنائية البعد، هل تصاميمها حقيقية أم كرتونية وهكذا، وتصورات مرسومة عن تفاصيل اللعبة.
الأصوات Sound and Music : نوع النمط الخاص بالصوتيات Genre ، ويمكن إرفاق ملفات أصوات سابقة مع الوثيقة.
الواجهات الرسومية User Interface : أو ما يعرف بال UI حيث يتم رسم المعلومات التي ستبقى على الشاشة خلال اللعب وماهيتها.
أزرار التحكم Game Controls : يمكن أيضاً كتابة كيفية التحكم في اللعبة، وما هي المنصة المستخدمة هل ستكون أحرف لوحة المفاتيح أم النقر كما في أجهزة الموبايل.

لعبة حرب القواعد – تطبيق عملي :

كما تعرفنا في المعلومات السابقة، أنه يمكن ضم عدد لا بأس به من الأقسام الرئيسية التي يجب أن تكون واضحة منذ بداية التطوير لكي تختصر الكثير من الوقت والجهد، في لعبة حرب القواعد تم كتابة 3 وثائق تفصيلية يمكن دمجهم معاً لتحصل على وثيقة تطوير اللعبة Game Design Document ، وهنا تم تفصيل 3 أقسام رئيسية يمكن تلخيصلهم بالشكل التالي :

1 – الوثيقة الأولية Game Concept Document :

حيث تم بروز فكرة لعبة في ذهن الأستاذ أسامة ديب ( صاحب المشروع ) لمحاكاة لعبة تحتوي على قلعتين متباعدتين، حيث يتسابقان لهدم قلعة الآخر من خلال بناء وحدات معينة، الفكرة السابقة كان لا بد من كتابتها في وثيقة ضمت المحاور التالية : شرح الفكرة، ميزات اللعبة، نوع اللعبة Genre، المنصة المستخدمة، وتطبيقات اللعبة. الوثقة تحتوي على 5 صفحات يمكن تصفحها مباشرة  هنا.

2 – الوثيقة الوظفية Functional Specification Document:

بعد الإنتهاء من الوثيقة الأولية يتم البدء بالتعمق في جوانب اللعبة التقنية ، حيث يتم تفصيل ميكانيكية اللعبة من خلال الكتابة عن نواة اللعبة وتسلسل الأحداث داخل اللعبة ، والعناصر الأساسية للعبة Game Units ، ثم التفصيل أكثر حول واجهات اللعبة الأساسية User Interface ، ومن ثم كتابة تخطيط بياني وخوارزميات لها ، إنتقالاً إلى التصاميم والرسوميات المستخدمة والسكيتشات إن وجد ذلك ، والأفلام البينية داخل اللعبة ، إنتقالاً للأصوات التي سيتم إستخدامها والموسيقى ، مروراً بسرد قصة للعبة حيث يتم إدخال اللاعب في قصة متسلسلة للعبة ككل ، والإنتقال إلى المراحل التي ستتكون منها اللعبة ، كل السابق قد تم كتابته بشكل عملي داخل هذه الوثيقة، تحتوي هذه الوثيقة على 8 صفحات يمكن تصفحها مباشرة هنا.

 

3 – الوثيقة التقنية Technical Specification Document :

بنفس الأقسام التي كانت في الوثيقة الوظيفية يتم التعمق أكثر حيث أن هذه الوثيقة ستكون مفهومة بشكل أساسي للمطورين و الرسامين المتواجدين ضمن الفريق ، حيث ستلاحظوا أنه في هذه الوثيقة سنناقش المنصة ونظام التشغيل بشكل مباشر من خلال إنتقاء مواصفات معينة ، وسيتم الإكثار من الخوارزميات الأساسية للعبة وتفصيلها برمجياً على شكل Pseudo Code بحيث يمكن للمبرمجين البدء الفعلي في كتابة الأكواد الخاصة باللعبة ، أيضاً يتم البدء في تحديد الأجزاء الأساسية التي ستظهر على الوجهات الرسومية المختلفة ، مروراً بالتصاميم ثنائية أو ثلاثية البعد ، وتحديد البرامح والمحركات التي سيتم إستخدامها خلال مراحل تطوير اللعبة ، إلى الأصوات والموسيقى ، وتفصيلاً أخيراً للمراحل، تحتوي هذه الوثيقة على 8 صفحات يمكن تصفحها مباشرة هنا.

 

  • يجدر بالذكر أن حرب القواعد تم تغيير إسمها إلى Get That Sheep ويمكن رؤية النتيجة الحالية للمشروع كما في الفيديو التالي :

post

كيف تصبح مصمم ألعاب ناجح

تعرف على مصمم الألعاب وما هي المهارات التي يجب أن يمتلكها

دور مصمم الألعاب Game Designer

السلام عليكم ورحمة الله وبركاته، يبقى الدور العام لمصمم الألعاب Game Designer هو كيفية عمل اللعبة بشكل صحيح أثناء عملية تصميمها، فهو يقوم بوضع الأهداف Objectives و القواعد Rules و الإجراءات Procedures ، ويقوم بوضع القصة وإعطاءها الحياة وهو أيضاً المسؤول عن التخطيط لكل ما يجعل اللعبة مقبولة، وهو من يقوم ببناء المرحلة Level Design سواءً بناءها على أسس الهندسة المعمارية أو رسم سكيتشات على الورق Blueprint، وهو أيضاً يقوم بتنسيق القصة (السيناريو العام) للعبة. فكل من كان يحلم في عمل مميز في هوليوود أصبح الآن بإمكانه فعل ما يريده بواسطة كتابة سيناريو القصة وإخراجها بشكل كامل، التخصصات السابقة أصبحت الآن متجزءة بشكل تخصصات كاملة، كل شخص مسؤول عن إحداها، لكن مطور الألعاب الناجح يجب أن يكون ملم بتفاصيل كل تخصص من باب تعلم شيء عن كل شيء، ولكن ما هي الأمور المطلوبة لتصبح مصمم ألعاب؟ وما هي المواهب والقدرات المطلوبة؟ وما هي أفضل طريقة لتصميم لعبة؟ هذا كله سنكتشفه من خلال هذه المقالة.

مصمم الألعاب يضع نفسه بدل اللاعب

يتمركز دور مصمم الألعاب وقبل كل شيء أن يتصرف وكأنه اللاعب، فالمصمم يجب أن يشاهد لعبته من زاوية أخرى وهي الزاوية التي يرى بها اللاعب Player هذه اللعبة، وعلى الرغم من أن هذا شيء سهل ولكنه للأسف يتم تجاهله، مما قد ينتج فجوة كبيرة في اللعبة بسبب هذا الخطأ البسيط، من البسيط أن نقوم بالتأكد أن تصميم الجرافيكس والقصة والبرمجة تسير بشكل صحيح، ولكننا نغفل عن أهم ميزة في اللعبة، وهي وجود الإثارة التي تدمج جميع ما سبق لنخرج بشيء متميز. وكمصمم ألعاب Game Designer فإن الجزء الأكبر من دورك يتمثل بالتركيز والحفاظ على تجربة اللاعب User Experience وملاحظة الأمور التي سيكتسبها من عملية اللعب، وأيضاً يجب أن لا تجعل الأمور التقنية (جرافيكس، وتأثيرات، وبرمجة) تطغى على هذا الجانب. دع كل شخص يهتم بتخصصه، فدع مسؤول الرسوميات Art Director يبدع بالتخيلات، ودع المنتج Producer يهتم بالميزانية، ودع المدير التقني Technical Director يهتم بمحرك الألعاب ومشاكله فمهمتك الأساسية هي أنه عندما يتم تسليم اللعبة للاعب يجب أن يندهش من طريقة اللعب Game play وببساطة أن يقول: !!Wow ولا يدع اللعبة في وقت قصير. وعندما نذكر مصطلح Game play يجب مباشرة أن يتبادر لذهنك الأمور التي سيكتسبها اللاعب من خلال لعبة وما هي الخبرات والأسس التي سيجدها في اللعبة.

 

مختبري اللعبة Game Testers

أي لعبة يجب أن تحتوي على من يختبرها Game Testers، وهم الأشخاص الذين يقومون بلعب اللعبة كاملة واستخراج الخلاصة إن كانت عن طريق زيادة أمور.. أو تصحيح أمور أخرى، وأيضاً هناك منظور مختلف عندما تقوم بمشاهدة شخص غيرك يقوم بعملية اللعب، فستولد أمور لم تكن تحسبها والتي من هدفها إثراء لعبتك. فستقوم بملاحظة اللاعب في تصرفاته، وعلى ماذا يركز، وما الأمور التي قد تسبب له حالة ملل، فكل ما يقوله يجب أن تدونه وتأخذه بالحسبان، فهو سيكون دليلك لتسليط الضوء على هذه الجوانب. وإن كنت تريد أن تكون في موقع مختبري اللعبة فيجب عليك وضع الأهداف الرئيسية التي ستقوم بها، وبالنهاية يمكنك أخذ جميع ميزات المختبر لتصبح مصمم ومختبر في نفس الوقت.

وهناك الكثير من المصممين الذي لا يدرجون الـ Game Tester بعملية تصميم اللعبة، لربما بسبب ضيق وقت العمل، أو أنه لا يريد أن يقوم المختبر بإزالة أشياء يظنها المصمم تضفي إيجابية على اللعبة، أو لربما أنهم يعتقدون أن ذلك سيكلفهم الكثير من النقود، أو أن اعتقادهم بأن عملية الاختبار تأتي ما بعد التسويق ومن خلال اللاعبين عبر العالم ولكنهم فعلياً يقومون بتضييع المزيد من الوقت والمزيد من التكلفة وأيضاً الكثير من الإبداع المتوقع من مختبري اللعبة، وذلك بسبب أن اللعبة ليست بطريق واحد للاتصال One-way بمعنى أنه ليس عليك طرح اللعبة ومن ثم إنتظار قدوم النقود!!، وليس الأمر أن يقوم المصمم بالتأكد من أن كل جزء من الأجزاء الوظيفية باللعبة تعمل بنجاح، الأمر يكمن في إيجاد الميزات التي يحب اللاعب أن تكون موجودة في لعبته المثالية Game Play وبالتأكد هذا لن تقوم بإكتشافه إلا من خلال الـ Game Tester.

فمصمم الألعاب يمكن تشبيهه بأنه المسؤول التنفيذي لحفلة معينة، فمهمته الأساسية التأكد من أن كل شيء جاهز: الطعام، والعصير، والزينة، وتهيئ الجو العام، وفي النهاية يفتح الأبواب لإستقبال المدعوين للحفل ليروا ما في الداخل، والنتائج على الأغلب لا يمكن التنبؤ بها أو تصورها، واللعبة مثلها مثل الحفلة، ولكن أي نوع من أنواع الحفلات؟ وهل فعلا سيستمتع المدعوون بهذه الحفلة أم أنهم  سيحاولون الهرب من الحفلة بعجالة من أمرهم؟ هل سيسهرون ويتبادلون الأحاديث بين بعضهم ويتمنون أن لا تنتهي هذه الليلة؟

دعوة أصدقائك لتجربة لعبتك، و معرفة ردود الفعل ولحظات الصمت ومطابقتها على أرض الواقع هي فعلا أفضل طريقة لتدرك كيف تسير لعبتك ولكي تصبح مصمم محترف. وبمجرد إستعدادك لسماع الآخرين والتعلم من نقدهم لها سيساعد ذلك لعبتك على النمو السريع والإيجابي. وعملية تصميم الألعاب تشبه دورة الحياة بشكل كبير، فهي تمر في مرحلة تطوير، ولا يوجد قواعد معينة وتكنيكات مطلقة، وكمصمم فإن الخيار مفتوح على مذراعيه لتبتكر طرقك الخاصة. هذا لا يعني أن تأخذ كل نصائح أصدقاءك على محمل الجد، فلديهم أذواق مختلقة، ويجب أن تأخذ غالباً ما يتوافق مع قواعدك وتطلعاتك المستقبلية للعبتك.

 

المهارات

ما هي الأمور المطلوبة لتصبح مصمم ألعاب؟ بالطبع لا يوجد إجابة واحدة، وأيضاً لا يوجد طريق واحد للنجاح، فهناك بعض المزايا والمهارات المشتركة في مصمم الألعاب المتميز، أولها يكمن في حب الألعاب نفسها، فإذا كنت لا تُحب ذلك، فلن تستطيع أبداً النجاح في هذا الأمر لأنك لن تقوم بالجلوس الساعات الطويلة لتقوم بالإبداع واختراع اللعبة وإعطاءها حقها.

كشخص عادي ليس له علاقة بهذا الأمر، يبدوا الأمر قليل الشأن، فمن يقوم بالنظر إلى مختبري الألعاب، يظنهم أنهم يلعبون ويضيعون الوقت الطويل ولا يدركون أن هذه العملية ضرورية وهي جزء لا يتجزأ من مرحلة تصميم الألعاب، فكونك مصمم ألعاب يجب أن تبقى بالك مشغولاً دائماً حول مشروعك، ويجب أن يكون قلبك للمشروع، ولا ننسى أنه ستمر عليك ساعات ضغط خصوصاً في نهاية المشروع تتطلب منك الصبر وانتظار النتائج المتوقعة، فبناءً على السابق، فإنه يجب عليك تطوير مهارات معينة، فحبك للألعاب لا يعتبر المهارة الوحيدة المطلوبة منك فهناك عوامل أخرى منها:

1 – مهارة التواصل مع مختلف الأشخاص

من أهم مزايا مصمم الألعاب أنه يمتلك القدرة على التواصل مع كل شخص تعتقد أنه سيضفي نجاح على لعبتك، بالتالي يجب أن يكون إيجابي التعامل لدرجة المرونة معهم ككل، لأنك ستقوم بعرض فكرة اللعبة على أنواع مختلفة من طرق التفكير، لأنك ستعرض لعبتك على: قريق عملك، والإدارة، والمستثمرين، وربما أصدقائك وعائلتك. ولمواجهة ذلك، يجب أن تتميز بالإقناع ووضوح لغة التفسير، أي أن يكون تفسيرك للعبة منطقي وواضح ومبسط حسب طبيعة تفكير الشخص المقابل، وأن تكون مقدم وعارض ناجح للمشروع. فهي الأمر الوحيد الذي من هدفه أن يؤمن لك تغطية كافية للموضوع مع دعم مادي من الأطراف المعنية، ويجب أن تدرك أن كل شخص ينظر للعبتك من منظور مختلف، فالممول يختلف عن صديقك!

ومهارة الإتصال لا تقتصر على الكتابة وفن الخطابة، بل هي تعني أيضاً فن الإستماع والإستعداد للتناقش بوسطية ومنطقية، فإستعدادك لسماعك رأي مختبري اللعبة Game Tester ولزملائك في الفريق Teammate سينتج أفكار جديدة وباتجاهات جديدة، فما هي ردة فعلك عندما تسمع شيئاً لا تحب سماعه؟ نحن نعلم أنه من الصعب أن نقدم بعض التنازلات، ولكن هنا الأمر مختلف ويجب عليك التنازل في هذا الموضوع لأنه من هدفه زيادة الإنتاجية، وفي الحقيقة أن معظم مصممي الألعاب يعتقدون أنه لا يجب التنازل أبداً عن الرأي والأفكار التي جمعها، ولكن التنازل مطلوب في بعض الأمور فإن كان الرأي الجديد جيداً فسيقوم بإضافة أفكار من هدفها أن تعطي الإبداع للعبة. فعلى سبيل المثال، قد ترى أن بعض التأثيرات من هدفها أن تقوم بإضافة أشياء مفيدة للعبة تجعلها أجمل، ولكن من الناحية التقنية Technical، لا يمكنك فعل ذلك لأنها مكلفة على نوع الجهاز الذي ستنزل عليه اللعبة، ولربما أن الوقت غير كافي لعمل، ولكن ماذا لو قدّم المبرمج طريقة ثانوية للتأثيرات التي تريد بحيث تكون قابلة لبرمجتها وبوقت قصير وبكلفة أقل؟ هل ستحتفظ برأيك الأول في ظل هذه المعطيات؟ في النهاية يكمن هدفك في إيجاد الفكرة المناسبة التي يمكن تكييفها من كل متطلبات العمل، فيجب أن تصغي لأي رأي جديد من هدفه إنجاح المشروع.

2 – مهارة العمل ضمن فريق

صناعة الألعاب هي مجال من أهم المجالات التي يمكن من خلالها أن تفهم معنى وفائدة العمل داخل فريق متكامل، حيث كل شخص مسؤول عن مجال هو مختص به، فمن العلوم المتخصصة بمجال الحاسوب هناك من سيقوم ببرمجة الجرافيكس، وهناك من سيقوم بالتصميم، ومن سيقوم بالبرمجة، ووضع أسس الذكاء الإصطناعي ومن سيقوم بصناعة الشخصيات وتحريكها، وهناك من سيقوم بدعم اللعبة وتأمين الجانب المادي لها، وهناك من سيقوم بتسويقها، وهناك من سيقوم بتسليمها ليد اللا عب !! فهناك مجموعة متسلسلة من التخصصات، تعتبر كلها كالجسد الواحد يكمل بعضه بعضاً.

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

3 – قادر على معالجة الأمور عند الضرورة

في أغلب الأحيان وعندما يكون عندك حط زمني معين للمشروع Deadline ، ستضطر لأخذ قرار أحياناً يؤثر سلباً على جودة اللعبة ككل أو على سير عملية التطوير، ومن شأنه أن يولد مشاكل مستقبلية تستمر بالظهور واحدة تلو الأخرى حتى تصبح اللعبة ككل مجموعة من المشاكل لا يمكن حلها!!، فالألعاب نظامها ضعيف، وكل العناصر ترتبط إرتباطاً وثيقاً ببعضها، فعند ظهور خلل في عنصر معين، سيؤثر هذا العنصر سلبياً على كل العناصر وبالتالي على كل المشروع، وهذه القضية خطيرة خصوصاً في المراحل النهائية لتصميم اللعبة، فحين ينفذ الوقت ستظهر بعض المشاكل التي لم تتمكن من حلها، وستضطر لحذف بعض المراحل وبعض العناصر للحفاظ على العناصر التي تم تصميمها بشكل سليم، إنها كارثة حقيقية، ولكنها بالنهاية تساعدنا على فهم سبب إحتواء الكثير من الألعاب على تناقضات والتي غالباً ما تميت اللعبة قبل وصولها للسوق (Dead On Arrival (D.O.A بفترة وجيزة.

4 – قادر على الإستنباط من حوله

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

إن أردت أن تصبح مصمم ألعاب مميز حاول أن تقوم بالنظر للعالم من حولك على أنه لعبة كبيرة جداً تحتوي مهمات ومستويات ومراحل مختلفة. حاول تفسير الوظائف الأساسية والمهمة في حياتك، وحاول إكتشاف القواعد التي تقوم عليها، حاول معرفة كيفية عمل الآليات والإلكترونيات، بإستنتاجك لها ستحصل على إمكانية بناء أنماط  وأفكار جديدة لم يتم التفكير بها سابقاً، كل ما عليك فعله هو كتابة ملاحظاتك وتحليلاتك ومعرفة أساساتها وستصبح بإذن لله من أنجح المصممين.
لكن لماذا لا نقوم بالنظر إلى الألعاب الموجودة في السوق على أنها مصدر للإلهام؟ فعلياً إن قمت بذلك فستقوم بعمل فكرة تم إيجادها سابقاً وبالتالي لن تحصل على ميزات الأفكار الجديدة، حاول أن تقوم بالنظر حولك وإكتشاف شيء جديد، ودائماً إجعل الحياة المحيطة بك هي مصدر لإلهامك لا ألعاب سابقة تم عملها. ومن أهم القضايا التي تلهم مصمم الألعاب بأفكار جديدة هي: العلاقات الإجتماعية، طريقة جمع النقود، البيع والشراء، المنافسة في العمل، وغير ذلك. مع ملاحظة أن كل ثقافة وبلد وطبيعة في العالم يمكن أن تغرس فيك فكرة لعبة جديدة، فيمكنك بالتالي إختيار أي فكرة تراها جيدة وتقوم بتطبيقها.
فمثلاُ في طبيعة الأرض أفكار مشعبة ومعقدة وكثيرة مثل: مستعمرات النمل، فهم منظمون إلى مجموعة من القواعد، وهم يتنافسون ويسعون لإثبات أنهم الأ فضل من خلال جمعهم الكثيف للغذاء، ويتنافسون مع مستعمرات أخرى لإثبات قدرتهم على العيش، والأمر نفسه مع كل أنظمة الحياة، من طرق إثبات القدرة على الحياة لدى الأسود الإفريقية إلى فعل ذلك لدى القطة الموجودة في أزقة الطرق.
قم بدراسة الأنظمة السابقة وقم بتقسيمهم: لعناصر objects و علاقات relationships، وسلوكيات behaviors، وإلى غير ذلك. وحاول إكتشاف كيفية التفاعل مع العناصر الأخرى، فلربما تخلق أساس لفكرة جديدة، وهذا الشيء نفسه عندما تنظر كيف يتم التعامل مع الأشخاص في مجال السياسة، وفي مجال الفن، وفي العلاقات الإجتماعية مثل الزواج، فهناك قصة لعبة في كل علاقة. من خلال إستنتاجك لجميع ما سبق، فإنك لا تكتسب زيادة المهارة في كونك مصمم ألعاب فحسب، ولكنك تفتح أفاقاً جديدة وتخيلات في ماهية لعبتك و قواعدها وطرق تصميمها.

5 – قادر على الإبداع

عامل الإبداع هو أصعب العوامل قياساً، ولكن بالنهاية أنت بحاجة لهذا العامل في لعبتك لتحصل على فكرة جميلة، وكل شخص يبدع بطريقة تختلف عن الآخر، فلا يمكننا القول أن هذا شخص مبدع وهذا لا، فبعض الناس يأتون بالعديد من الأفكار وهو في الحقيقة لم يقم بالبحث والإستكشاف، وآخر يأخذ فكرة واحدة ويقوم بإكتشاف جميع الحقائق التي تتعلق بها، بعضهم يقوم بحبس نفسه في غرفة ويقوم بالتفكير، وبعضهم يقوم بالتحاور في نفس الفكرة مع مجموعة للوصول لأمور موحدة بين الجميع.بعضهم يبحث عن خبرات جديدة لينمي خياله، وبعضهم لا يفعل ذلك، ومصمم الألعاب المميز هو من يقوم بالإستفادة من أحلامه السعيدة و السيئة ومن أوهامه ومن مخاوفه وتقديمها على أنها خبرة تفاعلية للغير.

من أكبر وأشهر مصممي الألعاب Nintendo’s Shigeru Miyamoto يقول:
“دائماً ما أنظر لطفولتي ولأحلامي وهواياتي التي تتميز بالإلهام عندما كنت طفلاً، ذهبت لحديقة ووجدت بحيرة كانت لطيفة ومذهل بالنسبة لي أن أعثر عليها وعندما تجولت في البلدان بدون خريطة، حاولت شق طريقي الخاص، ووجدت أشياء مذهلة، وأدركت مدى سعادتي بمغامرة مثل هذه.”
“When I was a child, I went hiking and found a lake. It was quite a surprise for me to stumble upon it. When I traveled around the country without a map, trying to find my way, stumbling on amazing things as I went, I realized how it felt to go on an adventure like this”
وفي كثير من ألعابه قام بالإستفادة مما حلم به ورآه في طفولته.

فكر الآن في طفولتك والخبرات التي إكتسبتها فهل ستجد فكرة من ذكرياتك تصلح للعبة؟ أحد أفضل الإلهامات لأفكار جديدة لمصممي الألعاب هي تذكر التجارب المميزة التي قد مروا بها في حياتهم، ولا سيما أن طفولتهم شهدت أطول فترة لعملية اللعب. فطريقة التفاعل عند الأطفال تتم من خلال اللعب، هذا يجعل الألعاب أهم عامل من الناحية الإجتماعية عند الأطفال، فإن حاولت تذكر طفولتك والنظر ما هي الأشياء التي استمتعت بها، فستقوم بإكتشاف فكرة جديدة لم يقم أحد من قبلك بإكتشافها. ومن طرق الإبداع أيضاً أن تقوم بوضع شيئين متناقضين ولا علاقة لهما ببعض مثل شكسبير وعمر المختار وتجد ما هي العوامل المشتركة بينهم !!

 

post

#13 المصفوفات Arrays – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : YIL

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  المصفوفات Arrays

السلام عليكم و رحمة الله و بركاته , و أهلا بكم في درس جديد من دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

في درس اليوم سنتكلم إن شاء الله عن المصفوفات أو الـ Arrays

تعريف المصفوفات :

يمكن تعريفها على أنها وعاء يحتوي على قيم بداخلها , أو هي عبارة عن صندوق فواكه يحتوي على عدداً من التفاح على سبيل المثال , و كل تفاحة لها قيمة الخاصة  ، و الصندوق الحامل لها يسمى المصفوفة .

 

نذهب إلى File  ثم New ثم project و نتأكد من اختيار #Visual Cو نختار Console App
تكلمنا سابقاً أن المكان المخصص لكتابة الأكواد البرمجية هو بين قوسي الدالة void Main

كي لا نضيع الوقت قمت بكتابة هذه الاسطر سابقاً و سأقوم بلصقها هنا

لاحظو أنني قمت بتعريف خمسة متغيرات هنا ، و كل متغير يحتوي على قيمة معينة

نريد الآن أن نقوم بالبحث عن الرقم 16 ، عندها سأكون مجبراً على كتابة جمل شرطية if statement  لكل متغير لكي أحصل على القيمة و أقارنها بالقيمة المطلوبة

في البداية نسأل هل قيمة المتغير number1 تساوي 16

ثم ننتقل إلى الثاني … الثالث ……. الخامس و هكذا

في هذه الحالة سأكون مضطراً لكتابة كل المتغيرات و كتابة عدد كبير من جمل if statement

هنا يأتي دور المصفوفة Array

سأقوم مبدئيا بتحويل الجمل السابقة إلى جمل ملاحظات

يمكن تعريف الـ array كالتالي

;int[ ] myNumber = new int [5]

لاحظو في هذا السطر قمت بتعريف مصفوفة اسمها myNumber  من النوع integer و تحتوي على خمس قيم

قمنا بكتابة الأقواس المربعة بعد النوع مباشرةً

الآن أصبح عندي 5 عناصر أو خمس خانات استطيع التعامل معهم

كيف يمكنني أن أقوم بإدخال قيم إلى هذه العناصر ؟

يمكننا فعل ذلك كالتالي :

;myNumber[0] = 10
;myNumber[1] = 22
;myNumber[2] = 14
;myNumber[3] = 66
;myNumber[4] = 22

الخانة الموجودة بين القوسين [ ] تسمى index

لذلك عندما تريد استدعاء عنصر ضمن المصفوفة تضع اسم المصفوفة و رقمه بين الأقواس [  ] مع ملاحظة أن الخانة الأولى يجب أن تحمل الرقم 0

إذاً من خلال الأسطر السابقة قمت بإدخال قيم إلى العناصر الموجودة ضمن الـ Array

الآن ماذا لو أردت أن أقوم بعملية استدعاء للقيم ؟

سأقوم من خلال التالي بطباعة قيمة أحد العناصر في المصفوفة

;Console.WriteLine(myNumber[2] )

 و لا ننسى كتابة الدالة ReadLine لنتمكن من مشاهدة النتائج.

نقوم بتشغيل التطبيق و نلاحظ أن التطبيق قام بطباعة القيمة 14

طريقة ثانية

الآن هناك طريقة ثانية لتعريف المصفوفة و إدخال القيم بها مباشرةً .

;int [ ] myNumbes = new int [ ] {1, 5 , 3 , 4 , 66 , 55 }

و كما تكلمنا لو اردنا طباعة القيمة رقم 3 فسنكتب :

; Console.WriteLine(myNumber[2] )

 

هناك إمكانية لطباعة ” عدد العناصر الموجودة داخل المصفوفة “

عن طريق التالي :

;Console.WriteLine(myNumber.Length)

هنا قمنا بطلب أخذ الـ Length ، و هو كم عدد العناصر الموجودة ضمن المصفوفة

و لو قمنا بعمل تشغيل للتطبيق ، سنحصل على القيمة 6 ، و هو فعلاً عدد عناصر المصفوفة السابقة .

في الاسطر السابقة استعملنا النوع integer ، و بالمثل يمكننا استعمال أي نوع آخر

مثلا هنا أقوم بكتابة

;  string[] myStrings = new string[] { “Ahmad”, “Mohammad”, “Shady”, “Safaa” }

و بالمثل سنقوم بطباعة قيمة العنصر رقم 3

 

;Console.WriteLine(myStrings[2] )

و لاحظ أنه قام بطباعة شادي

 

تحدثنا في المحاضرة السابقة عن For Loop Statement  التي تقوم بعملية تكرار لأوامر معينة ، لاحظة الآن سأقوم باستخدامها لطباعة كل عناصر المصفوفة

و ذلك كالتالي :

 

لاحظو أنه قام بطباعة كل عنصر من عناصر المصفوفة و ذلك بناءً على الـى Length

لاحظو أن عدد العناصر في المصفوفة هو 4 و هذا يعني أن myStrings.Length يساوي 4

و لذلك عندما وصل إلى الرقم 3 لقيمة i  فهو فعلياً وصل إلى آخر عنصر في المصفوفة ، و عندما أصبحت i = 4 يقوم بالخروج من الحلقة و ذلك لأن 4 تساوي 4 و ليست أصغر منها طبقاً لشرط الحلقة و بالتالي بعد أن أصبح شرط الحلقة غير محقق قام بالخروج منها

حلقة foreach

هناك أيضاً حلقة يتم استخدامها بشكل كبير مع المصفوفات ، ألا و هي  foreach

شرح هذه الحلقة :

بعد إضافة foreach  نقوم بتعريف متغير من النوع الذي تم تعريف المصفوفة به
و هنا قمنا بتعربفه من النوع string  تبعاً لنوع المصفوفة myStrings و بالنسبة لاسم المتغير الجديد فهو اختياري لأننا سنقوم باستخدامه حصراً ضمن الاقواس {  }

ثم نقوم بإضافة الكلمة المحجوزة in ثثم اسم المصفوفة و ذلك بدون أقواس [  ]

عمل الحلقة :

في كل مرة سيقوم بأخذ أحد العناصر (على الترتيب) ثم يقوم بإسناده الى المتغير name و يقوم بطباعته

و لاحظ أننا لم نقم بإعطائه الـ index  الخاص بالعنصر و إنما طلبنا منه أن يقوم بجلب جميع العناصر الموجودة داخل المصفوفة

 

 

هناك أيضاً إمكانية للتعامل بشكل أكبر مع المصفوفات :

 

إذا كان لدي نص معين و أردت أن أقوم بطباعة هذا النص بالعكس ( عمليةReverse )

هناك نوع جديد من أنواع البيانات هو النوع char و تكلمنا سابقاً أنه يقبل حرفاً واحداً فقط

;’char x = ‘a

الآن لدينا التالي :

;!! string myWords = “i need to go to the hospital now

يمكنني  أن أحصل على مصفوفة من myWords عن طريق الجملة :

;()Char[ ] x = myWords.ToCharArray

من خلال هذا الجملة نقوم بفصل جميع الحروف الموجودة في النص و تحويلها إلى عناصر في المصفوفة

myWords.ToCharArray تقوم بالعودة بمصفوفة يتم اسنادها للمصفوفة x  من النوع char

و نلاحظ هنا أننا قمنا بكتابة char و ليس فقط Array في myWords.ToCharArray لأنني أريد تحويل جميع الخانات خانة خانة إلى النوع char

الآن لو قمت بوضع بكتابة الحلقة foreach كما في التالي :

لو قمت بتنفيذ التطبيق سيقوم بطباعة الجملة حرف حرف في كل سطر

و لعكس المصفوفة نقوم بكتابة التالي :

سنشاهد عند تنفيذ التطبيق أنه قام بطباعة الجملة بشكل معكوس على نفس السطر .

 

طبعاً المصفوفات لها استخدامات أكثر مما تم ذكره ، و الدروس القادمة ستكون كفيلة بصقل مهارتك باستخدام الـ Array

نصل الآن إلى نهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله .

ملخص الدرس :

تعريف المصفوفات:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثالث عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على المصفوفة وكيف يمكننا تعريف عدد كبير من المتغيرات تحت سقف واحد، وكيف أنه يمكننا إستدعاء العناصر بواسطة حلقات تكرارية.

المصفوفة Array :

يمكن تشبيه المصفوفة أنا عبارة عن صندوق فاكهة يحتوي تفاح، حيث أن هناك عدد كبير من التفاح غير أنه غير متساوي في المواصفات، فهناك الكبير وهناك ذو الحلاوة أكثر وهناك ذو الحمرة أكثر، غير أنهم يتشاركون بصفه أنهم جميعاً من النوع الواحد ألا وهو التفاح، والمصفوفة يمكن أن تكون أي نوع من أنواع البيانات الموجودة بداخل لغة السي شارب، سواءاً كانت نصية أو رقمية أو حتى متجهات ثلاثية البعد.
ويتم حجز المصفوفة بكنابة نوعها ثم أقواس مربعة ثم إسم المصفوفة ثم إعطاءها رقم للعناصر التي ستكون بداخلها هكذا :
int[] myNumbers = new int[5];

أو كما في المثال التالي :

مصطلحات الدرس :

Arrays :

Length :

foreach :

 index  :

Zero Base :

Reverse :

char :

ToCharAray :

 

post

#12 الحلقة التكرارية For – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : PQW

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  الحلقة التكرارية

السلام عليكم و رحمة الله و بركاته , و أهلاً و سهلا بكم في دروس سلسلة تعلم البرمجة للمبتدئين كلياً بواسطة الـ #C

الحلقة التكرارية التي لا يخلو application  من استخدامها لما فيها من تسهيل و اختصار للوقت

و كما نبدأ عادةً

ندخل الى File ==> New ==> Project  ,
و نختار #Visual C  ثم نختار Consloe application

سنسمي هذا الـ application  باسم  ForIteration

كما تكلمنا في الدروس السابقة المكان المناسب للبدء بكتابة الأسطر البرمجية هو بين قوسي الدالة  void Main

 

يطلب مني أحد الزبائن أن أقوم بطباع جملة معينة خمس مرات , فمن خلال معلوماتنا السابقة يمكننا كتابة التالي

;Console.WriteLine(“Statement 1”)
;Console.WriteLine(“Statement 2”)
;Console.WriteLine(“Statement 3”)
;Console.WriteLine(“Statement 4”)
;Console.WriteLine(“Statement 5”)

;()Console.ReadLine

ثم نقوم بعمل تشغيل للبرنامج لنرى أن البرنامج قد قام بطباعة الجمل المطلوبة بشكل صحيح

لنفرض أن الزبون قد غير رأيه و أراد طباعة 100 جملة

بإمكاننا أن نقوم بنسخ الجمل السابقة و تكرارها لمئة مرة مع التعديل على كل جملة , لكن هذه الطريقة مهدرة للوقت و غير احترافية .

فكيف يمكننا عمل ” حلقة تكرارية ” لنصل إلى النتيجة ؟؟

هنا يأتي دور الحلقة التكرارية For Loop

For (    int  i   =  0;          i   <   20 ;      i++    )

و لتفصيل الـ  Expression الخاص بالحلقة :

;Int i = 0 : قمنا بتعريف متغير من النوع integer  و قمنا بإعطائه قيمة ابتدائية تساوي الصفر , حيث قمنا بعمليتي Declaration  و Assignment  في نفس الجملة .

;i < 20 : الشرط Condition  , و يجب أن يكون محققاً ليقوم بتنفيذ الحلقة

;i++ : معدل النقصان أو الزيادة للمتغير i  . و هو مشابه لـ i = i + 1 ;

 

تقوم بالحلقة بالتأكد من تحقق الشرط , و كما هو واضح فإن 0 و هي القيمة الأولية أصغر من 20 فالشرط محقق
تبدأ الزيادة بعد تنفيذ السطر الأخير من الحلقة , أي أنها تقوم بالتنفيذ حتى السطر الأخير ثم تبدأ بعملية الزيادة, و في تطبيقنا ستقوم بتنفيذ السطر

;Console.WriteLine(“statement” +i)

ثم تبدأ بعده بالزيادة

و نلاحظ عند التشغيل أن أول قيمة هي 0 مع أننا قمنا بكتابة  ++i , و يمكننا جعله يبدأ من القيمة 1 و ذلك بتعديل القيمة الأولية إلى 1 . كما يمكننا جعله ينفذ الجملة رقم 20 و ذلك من خلال تبديل الشرط إلى  (i  أصغر أو تساوي الـ 20 )


الآن سوف ننتقل لمرحلة جديدة , ألا و هي أن نستعمل الجملة الشرطية if statement  داخل حلقة For

سيقوم هنا بالتحقق من الشرط ” هل 1 أصغر أو يساوي الـ 20 ؟ ” نعم الشرط محقق ! سينتقل لتنفيذ الحلقة

سيقوم بالتحقق من محتوى الحلقة :

If (i == 8)
;Console.WriteLine(“Found  ” + i)

هل 1 = 8 ؟؟ الجواب لا … يعود للبداية مع زيادة 1
تصبح قيمة  i تساوي 2 و يسأل هل 2 أصغر أو تساوي 20 ؟ الجواب نعم ، يذهب لتنفيذ الحلقة فيسأل هل 2 تساوي 8 ؟ الجواب لا فيعود للبداية مع زيادة 1 في كل مرة

عندما يصل إلى الرقم 8 : يسأل هل i = 8 أصغر أو تساوي الـ 20 ؟ الجواب نعم
يذهب لتنفيذ الحلقة فيسأل هل 8 = 8 ؟ الجواب نعم فيقوم بتنفيذ الشرط و طباعة ” Found  8″. إلا أنه قام بتنفيذ الحلقة 20 مرة و لكن لم تتم كتابة سوى الحالة الثامنة و ذلك بسبب الشرط المذكور سابقاً .

إذاً : الـ Expression  الخاص بالحلقة يحتوي على :

◘ القسم الأول و هو القسم الذي يتم فيه تعريف المتغير الذي ستتم عليه عملية الزيادة و النقصان , و يتم في هذا القسم إعطاؤه قيمةً أوليةً .

◘ القسم الثاني و هو القسم الذي يحتوي على الشرط الواجب تحققه ليتم تنفيذ الحلقة و بمجرد أن يصبح شرط الحلقة غير محقق ( أي بعد الانتهاء من الرقم 20 ) يقوم بالخروج من الحلقة تلقائياً و تنفيذ الاسطر التالية ضمن التطبيق

◘ القسم الثالث و هو الذي يتم فيه تحديد مقدار الزيادة أو النقصان .و لا يشترط أن يكون i++  فيمكن التحكم به و جعله i +2  على سبيل المثال و عندها ستكون نتيجة التطبيق

Statement 1
statement 3
statement 5
.
.
statement 19

و بإمكانك جعل الـ Expression  كالتالي :

For    (   int i  =  20   ;        i  >=  1   ;    i – –   )

بالتالي قمنا بعكس العملية  , حيث سيبدأ من القيمة 20 و يقوم بالتحقق منها ثم البدء بعملية النقصان 1 ثم 1 ثم 1 ….

 

طباعة جدول الضرب

نستخدم لهذا الغرض حلقة For داخل حلقة For  ثانية .

و عند كتابة حلقة For    داخل حلقة ثانية فلا يجوز تعريف  نفس المتغير ، لأنه كما تعلمنا لا يجوز تعريف نفس المتغير مرتين
و نلاحظ أن + في هذا الـ Exprssion  ليست عملية حسابية ، بل هي لوصل نص مع نص آخر.

و لو اردنا طباعة جدول الضرب كاملا (مئة جملة ) بدون حلقة For  قد تقع في الأخطاء ، فضلاً عن الوقت المهدور

 

يمكننا أيضاً عمل بعض الرسومات باستخدام For Loop
عندما يبدأ التطبيق يبدأ بحالة i = 1
يدخل إلى الحلقة الثانية ، و يسأل هل j = 1   ، نعم صحيح ، فيقوم بطباعة نجمة  ثم الانتقال إلى حالة j = 2
و هي لا تحقق الشرط ( 2 اصغر او تساويi (1)  ) فيخرج من الحلقة و يقوم بتنفيذ تتمة الحلقة الأولى و هي كتابة سطر جديد ،
ثم  يذهب للحلقة الأولى ، و يقوم بعملية الزيادة على i   لتصبح 2
و هي تحقق الشرط ، فيذهب لتنفيذ الحلقة الثانية ويسأل هل  j   أصغر أو تساوي i  (2) ؟ نعم صحيح فيقوم بطباعة ” * ”
ثم يقوم بعملية الزيادة على  j  لتصبح 2 ثم يسأل هل j أصغر او تساوي i(2) ؟ هي تحقق الشرط فيقوم بكتابة نجمة أخرى على نفس السطر ، لأننا استخدمنا الدالة Write  و ليس WriteLine
ثم يذهب للحالة الثالثة و هي لا تحقق الشرط … فيخرج من الحرق الثانية و ينتقل من طباعة النجمات على نفس السطر إلى طباعة سطر جديد ،
و هكذا حتى يصل إلى i  تساوي 10 ليقوم بكتابة 10 نجمات ،
و عندما يصل إلى i = 11 يصبح شرط الحلقة غير محققاً فيقوم بالخروج منها


و هكذا نكون قد تعلمنا استخدام الجملة الشرطية داخل حلقة For  كما تعلمنا استعمال حلقة For  داخل حلقة For  أُخرى

 

نصل إلى نهاية درسنا ، ألقاك في الدرس التالي إن شاء الله

 ملخص الدرس :

مفهوم الحلقة التكرارية:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الثاني عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، في هذا الدرس سنتعرف على معنى الحلقة التكرارية for Iteration Statement وكيف يمكننا أن ننفذ أسطر برمجية معينة عدد من المرات بناءاً على تحقق شرط معين

الحلقة التكرارية for Iteration Statement :

لا يخلو أي تطبيق برمجي من تواجد الحلقات التكرارية لما فيها من أهمية وإختصار للوقت والجهد والحصول على نتائج عالية، ومن أشهر الحلقات التكرارية جملة For التي يمكن بواسطتها تنفيذ عدد من الأسطر البرمجية عند تحقق شرط معين، وتتكون هذه الحلقة من 3 أقسام رئيسية هي :
– تعريف متغير الحلقة : حيث يتم هنا تعريف المتغير الذي ستستخدمه الحلقة التكرارية ويتم إعطاءه قيمة أولية أي أننا نقوم بعمل Variable Declaration و Variable Initialization في نفس المقطع
– شرط الحلقة : وسحتوي على تعبير Expression حيث أن الناتج لهذا التعبير سيكون إما قيمة صحيحة True أو خاطئة False وبناءاً عليه ستستمر الحلقة التكرارية بالعمل طالما هذا الشرط محقق
– معدل التغيير : وهو مقدار الزيادة أو النقصان بعد إنتهاء تنفيذ دورة واحدة، ويكون التغيير على المتغير الذي تم تعديله في القسم الأول.

مصطلحات الدرس :

FOR Loop :

Efficient :

Syntax :

Iteration :

increment :

initial :

Two FOR Loop :

post

#11 التعبيرات Expressions – البرمجة بواسطة #C

رمز فتح مرحلة هذا الدرس في تطبيق طورني : OSO

تَعلُمُ البرمجةِ للمبتدئينَ كلياً بواسطةِ #C –  العوامل والجمل والتعبيرات

العوامل والجمل والتعبيرات:

السلامُ عليكم ورحمةُ اللهِ وبركاته، وأهلاً بكمْ في الدرسِ الحادي عشر من دروسِ سلسلةِ، تَعلُمِ البرمجةِ للمبتدئينَ كلياً بواسطةِ السي شارب، سنتعرفُ على كافة أنواع الجمل البرمجية في لغة السي شارب، بالإضافة إلى كافة عوامل Operators اللغة و مفهوم التعبير Expression داخل تراكيب هذه اللغة. كما تعلمنا لبداية مشروع جديد نذهب إلى File ==> New ==> Project ، و سأقوم باختيار #Visual c  و من ثم Console Application ، وتكلمنا سابقاً أن المكان المخصص لكتابة الكود هو بين قوسي الدالة void Main ، سأقوم بتعريف المتغيرات التالية :

int x,   y,   z;

في السطر السابق، تسمى العملية عملية تعريف المتغيرات و تكون طبيعة هذه الجملة هي Variable Declaration  ، و هي جملة برمجية لحجز المتغيرات في الذاكرة، كما تعلمنا في الدروس السابقة، سأتابع وأكتب التالي :

;x  =  6
;y  =  44
;z  =  66

تسمى الأسطر السابقة: أسطر إسناد للمتغير Variables Assignment ، ولكن نتذكر وظيفة هذه الأسطر، دعنا نكتب جملة ملاحظة عنها، و تكلمنا عن كيفية كتابة جمل الملاحظة ، و تكلمنا عن أهمية جمل الملاحظة لتذكيرك بوظيفة الأسطر التي قمت بكتابتها، نكمل كتابة :

x  =  5 + 7;

في السطر السابق، استخدمنا عامل Operator الجمع المسمى Addition operator ، و إذا قمنا باستعمال الإشارات الباقية لعمليات الحساب فستكون كالتالي :

x  =  5 + 7;
y  =  4 – 2;
z  =  10 * 50;
x  =  10 / 2;

وهذه العوامل هي العوامل الأساسية للعمليات الحسابية Mathematical Operators ، أما في حال كانت القيمة المراد اسنادها لمتغير عبارة عن شيء مركب، فيمكن استخدام الأقواس لتحديد ترتيب أولويات العمليات المطلوبة كما في المثال التالي :

x  =  x + y * x – z;

قد تجد أن هذا التركيب للوهلة الأولى غير مفهوم لديك، و قد لا تكون على دراية بكيفية ترتيب العمليات الحسابية، فستسأل نفسك ما هي العملية التي تجري أولاً ، هل y * x ، ثم يتم جمع ناتجهما مع x  ثم يتم لاحقاً طرح z أم ماذا ؟ والحقيقة أن ترتيب الأولويات Order of Operations  هنا يتم باستخدام الأقواس ، حيث يتم إضافة الأقواس لإعطاء أولويات العمليات الحسابية و لتسهيل القراءة . فتصبح هذه الجملة بالشكل التالي :

x  =  ( x + y ) * ( x – z );

و يصبح المعنى ؛ قم بجمع (  x و y ) ثم قم بطرح ( z من x ) ثم قم بضرب الناتجين ببعضهما ، و حدث ذلك لأن الأولوية للأقواس دوماً

 

نكتب الآن :

If ( x == y)
}

{

تعلمنا أنه إذا اردنا أن نقوم بمقارنة ؛ هل قيمة هذا الجانب (x) تساوي قيمة الجانب الثاني (y)

هذا الـ Expression الموجود بين القوسين يسمى Equality operator و هو يقوم بعمل مقارنة بين طرفين و يقوم بإعطاء قيمة منطقية (True or False) و هذا عبارة عن Expression  و ليس عبارة حسابية أو إسناد قيم ، فعندما نرى x = 5 فهذا يعدّ عملية إسناد ، أما اذا رأينا إشارة مساواة مزدوجة فيكون عبارة عن Expression  و تكون القيمة True or False

 

لدينا هنا Expression  جديد يمكن أن نستخدمه ؛ ألا و هو :

If ( x < y )
}

{

هذا الـ Expression يسأل هل x  أكبر من y   ؟

ملاحظة: يخطئ البعض في تمييز الاشارتين أكبر و أصغر (  < & >)

لذلك بإمكانك اعتبار أن فتحة الإشارة مشابهة لفم السمكة فهي تأكل الصغير و لا تأكل الصغير ، و يبقى الكبير مواجهاً لفم السمكة

و يسمى هذا الـ Expression  بـ ” Greater than operator “

و بالمقابل لدينا الـ Expression  المسمى “Less than operator”

و تكون جهة فم السمكة بالجهة المعاكسة للـ Expression السابق

 

لدينا الآن Expression  جديد ، و هو يسأل هل الطرف الأول x أكبر أو يساوي y

و  نلاحظ أن إشارة المساواة تمت اضافتها بعد العامل Greater than و

يسمى هذا الـ Expression بالاسم ” Graeter or equal operator ” و يكون بالشكل التالي :

if ( x >= y)
}

{

و بالطبع لدينا بالمثل الـ Expression  المعاكس للسابق و يكون بالشكل التالي :

if ( x <= y)
}

{

 و هو يسأل هل الطرف الأول أصغر أويساوي الطرف الثاني ؟ و يسمى Less than or equal operator

 

الآن سوف نتعلم إمكانية عمل أكثر من Condition  داخل الـ Expression  الواحد

تكلمنا سابقاً أن جملة الشرط تحتاج إلى شرط موجود بين القوسين (….)  لتقوم بتحديد هل هو [True or False]

الآن سوف نكتب التالي :

if ( x > y && z > y )
}

{

في هذا الـ Expression يلزم تحقق الشرطين (x > y) و (z > y) حتى تكون نتيجة الشرط ككل True  و يمكن توضيح ذلك من خلال التالي :

True && True = True

True && false = false

False && True = False

False && False = False

 

و في حال كانت النتيجة True  يتم تنفيذ جملة الشرط
و لتسهيل القراءة نستخدم الأقواس كما يلي :

if  (  (x  > y) && (z > y)  )

و يسمى العامل الشرطي ”  و  ” /  Conditional AND operator

 

نذهب الان لدراسة العامل الشرطي ”  أو  ” / Conitional OR operator  

و يكون بالشكل التالي :

if  (  (x  > y) || (z > y)  )

و هو يعني هل التعبير (x > y) أو (z > y) صحيح ؟؟

و يكتفي بتحقق أحد الشرطين لاعتبار النتيجة النهائية True و يمكن تلخيص ذلك كما يلي :

True || True = True

True || false = True

False || True = True

False || False = False

و كما نعلم إذا كانت القيمة النهائية True يتم تحقيق الشرط و البدء بتنفيذه

و الفرق بين ” العامل الشرطي (و) و العامل الشرطي (أو) هو أن العامل الشرطي (و) يتطلب تحقق كلا الشرطين ليعطي النتيجة True  … أما العامل الشرطي (أو) فيكتفي بتحقق أحدهما أو كليهما ليعتبر النتيجة النهائية True.

 

لاختبار ما سبق نكتب

;y = 6
;z = 7

if ( x == y)
}
;Console.WriteLine(“True”)
{

else
;Console.WriteLine(“False”)

;()Console.ReadLine

و يجب أن نضع الدالة Console.ReadLine  لنتمكن من مشاهدة نتيجة التطبيق

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

ملاحظة : كما تكلمنا سابقاً اذا كان لدينا تحت if  جملة واحدة فيمكننا إزالة الأقواس

عند تشغيل البرنامج نلاحظ أنه لا يعطينا أي شيء ، فقد وصل إلى نهايته حيث ينتظر ادخال جملة من المستخدم تنتهي بالزر Enter

نقوم بإضافة الجملة else

else
;Console.WriteLine(“False”)

نعود و نشغل التطبيق
و نلاحظ أن التطبيق أعطانا القيمة False ، و ذلك لأنه بالفعل الشرط لم يتحقق ، حيث أن x لا تساوي y

 

كذلك لدينا بالمثل الـ Condition  الذي يقول هل x لا تساوي  y

و تكون كتابته بالشكل

if ( x != y)
}

{

و لو قمنا بتطبيق هذا الكلام على تطبيقنا السابق لوجدنا النتيجة True  لأنه فعلا x لا تساوي y .

 

لنقم بتطبيق التالي على تطبيقنا السابق

نقوم بتغيير التعبير إلى (x > y) فنجد أن التطبيق سيعطينا False  و ذلك لأن x في الحقيقة أصغر من y

و لو قمنا بعكسه من “أكبر من” إلى “أصغر من” أي (x < y) فسنجد النتيجة True  لأن المقارنة صحيحة

 

الآن سنقوم بتجربة العامل الشرطي && كما سوف نرى :

if (  (z > y)  &&  (y > x)  )
}
;Console.WriteLine(“True”)
{
;()Console.ReadLine

فإذا كان True && True  تكون النتيجة النهائية True و يظهر التطبيق الكلمة True

لنقم بجعل النتيجة False  ، لذلك سنغير (y > x)  إلى (y == x)
عندها تصبح النتيجة النهائية False على رغم تحقق الشرط الأول ، إلا أن العامل && يتطلب تحقق الشرطين سوياً ليصبح True

 

نصل الآن إلى نهاية هذا الدرس ، ألقاك في الدرس التالي إن شاء الله .

 

ملخص الدرس :

 

الجملة البرمجية Statement :

كما تعرفنا في الدروس السابقة أنه يجل وضع فاصلة منقوطة في آخر كل سطر، بالتالي يطلق على هذا السطر إسم جملة برمجية،

التعبير البرمجي Expression :

خليط بين واحد أو أكثر من : القيم ، المتغيرات ، المعاملات ، الثوابت أو الدوال Methods تقوم لغة البرمجة بتنفيذه أو بتعمل مجموعة عمليات سواء كانت حسابية أو تنفيذية، وهذه بعض الأمثلة عليها :

التعبير الحسابي : x = 5 + 7
إستدعاء الدوال : Console.WrieLine(x)

العوامل البرمجية Operators :

هناك العديد من العوامل البرمجية أكثرها إستعمالاً هي :
– العوامل الحسابية ( الرياضية ) : لإجراء عمليات حسابية والتعامل مع الناتج، وهناك 4 عمليات أساسية هي الجمع + والطرح – والضرب * والقسمة / .
– العوامل المنطقية : هي عوامل غالباً تستخدم في مقارنة قيمتين وأشهرها معامل و ذو الإختصار && And Operator ومعامل أو ذو الإختصار || Or Operator .

مصطلحات الدرس :

Variable Declaration :

Assignment Operator :

Addition Operator :

Mathematical  Operator :

Order of Operations :

Expression :

Greater than Operator :

Less than Operator :

Greater or Equal Operator :

Less than or Equal Operator :

Conditional AND Operator :

Conditional OR Operator :

Condition :

 

post

إستخدام مصادر جاهزة لتطوير لعبتك

إستخدام مصادر جاهزة لتطوير الألعاب، تزيد من كفاءة لعبتك وتقلل وقت التطوير

السلام عليكم ورحمة الله وبركاته

يتناقش معي العديد من المطورين الذين يدخلون عالم تطوير الألعاب عن حلمهم في تطوير فكرة لعبة يعتبرونها مميزة، ويتابعون أن العناصر التي يودون إستخدامها في مرحلة التطوير يجب أن تكون من صنعهم، بالتالي فهم من سيقومون بتصميم النماذج ثلاثية الأبعاد 3D Models على برنامج 3Ds Max أو Maya وهم من سيقومون بعمل هيكلية وتحريك لها Rigging and Animation ، وهم من سيقومون ببناء واجهات اللعبة 2D UI وهم من سيقومون برسم كافة الرسومات التي تحتاجها اللعبة على برنامج Photoshop ، ليس هذا فحسب بل سيقومون بتسجيل و تحرير الأصوات والموسيقى التي ستحتاجها اللعبةـ وفوق هذا كله هم من سيقومون ببرمجة اللعبة نفسها.

السيناريو السابق ليس مستحيلاً، ولكن كوقت تقديري أنت تحتاج لما يقارب الـ 10 سنوات لإنهاء لعبتك، وإن صبرت كل هذه المدة ولم يصبك الإحباط في منتصف الطريق، فلن تكون لعبتك ذات جودة عالية، والسبب هو أنك لست مختص في أي مجال من المجالات السابقة، مما يترك فرصة لتدني جودة اللعبة ككل.

إبحث عن المصادر الجاهزة

من الأفضل أن تقوم بالبحث أولاً عن شيء قريب لفكرة لعبتك بحيث يتماشى مع الثيم الخاص بها سواءاً كانت لعبة ثلاثية الأبعاد أو لعبة ثنائية الأبعاد، حيث أن هناك العديد من المواقع التي تتيح لك كافة المستلزمات التي تحتاجها في رحلة تطوير لعبتك، سواءاً كانت مدفوعة الأجر أو مجانية، ولعل من أشهر المواقع التي تحتاجها كمطور ألعاب تستخدم محرك Unity هو Unity Asset Store ، الموقع الغني بكل ما تحتاجه سواءاً مجسمات ثلاثية الأبعاد 3D Models أو ملفات حركة Animation أو صوتيات Audio أو برمجيات جاهزة Scripting أو حتى مشاريع كاملة Complete Projects .

 

لم تجد ضالتك في المصادر الجاهزة؟

في بعض الأحيان لن تجد مبتغاك خصوصاً إن كنت تبحث عن شيء محدد بمواصفات معينة، بالتالي أنت بحاجة للبحث عن شخص مختص ليقوم بعملها ألا وهو الـ Freelancer ، حيث يمكنك توظيفه بمقابل مالي أو بعرض نسبة من الأرباح بعد إنهاء اللعبة، بل إن هناك أنواعاً من الموهوبين الذين لم يدخلوا إلى سوق العمل بعد مستعدين أن يعملوا معك مجاناً مقابل الحصول على خبرة العمل الجماعي أو مقابل وضع إسمه في قائمة العاملين على اللعبة Credits .

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

الخلاصة 

إعطاء كل وظيفة للشخص المناسب والمتخصص تزيد من كفاءة الناتج، وتنمي مهارات العمل الجماعي والتي إن إمتلكتها ستزيد فرصك في الدخول إلى سوق تطوير الألعاب، ليس عيباً أن تقوم بإستخدام مصادر جاهزة للعبتك، ولا بأس في إستخدامها في مرحلة البداية، لاحقاً إن إمتلكت الميزانية الكافية يمكنك إستبدالها بشيء تريده أنت من خلال توظيف فريق يعمل لأجل مشروعك. ولكن هناك قضية يجب التنويه لها، فليس كل المصادر المجانية صالحة للإستخدام، فهناك بعض المصادر مجانية ولكن مشروطة بإضافة إسم صانعها إلى قائمة ال Credits لذلك توخى الحذر في إنتقاء المصادر وخصوصاً المجانية منها.

post

الألعاب الإلكترونية ايجابياتها وسلبياتها

السلام عليكم ورحمة الله وبركاته

هناك العديد من الأسئلة العامة التي قد تجول في خاطر المتابع لها، وخصوصاً تلك التي تتعلق بالسبب الرئيسي الذي يدفع اللاعب ممارسة اللعبة لمرحلة قد تدفعه للإدمان عليها، في هذه المقابلة سنقوم سريعاً بالتعرف على إجابات بعض هذه الأسئلة، حيث هناك مقابلة أجراها الأستاذ أسامة مع قناة تلفزيونية حول هذا الموضوع، يلي المقابلة بضع أسئلة ويجيب عليها أيضاً.

* الألعاب الإلكترونية ، إيجابياتها وسلبياتها؟

نجحت الألعاب الإلكترونية في الحلول مكان الألعاب التقليدية أو الألعاب التي تتطلب بذل مجهود جسمي ( لعب الكرة مع أولاد الحارة، أو لعب الحجلة على الشارع) لأكثر من سبب، لعل أهمها هو كمية التحدي الكبيرة الموجودة وسهولة الوصول إليها، ولعل أيضاً من ضمنها إيجاد وسيلة مباشرة لتفريغ الطاقة المختزلة من الحياة اليومية.

* هل من أنواع تندرج تحتها ألعاب الفيديو؟

بالتأكيد ، فهناك تصنيفات عديدة لطبيعة ونوع اللعبة أو ما يطلق عليه Game Genres، ولعل أشهرها هو ألعاب المنظور الأول First Person Shooter ذو الإختصار FPS و ألعاب اللعب الجماعية الكبيرة Massively multiplayer online ذو الإختصار المعروف MMO وهناك العديد من الأنواع الأخرى مثل الألعاب الرياضية Sports والألعاب الإستراتيجية RTS وغيرها. للمزيد من الأنواع الأخرى يمكنك زيارة هذه الصفحة.

* أغلب العاب الفيديو أجنبية الصنع.. إلى ما نعزو التقصير العربي بذلك؟

ذلك بسبب قلة الخبرات العربية في هذا المجال وإن وجد تجدهم فرادى تحت مسمى مطور مستقل ( indie Developer ) ، بالإضافة قلة الوعي والإهتمام من أصحاب الأموال والمستثمرين العرب حول هذا المجال، لذلك إنطلقت منصة طورني التي تهدف بشكل أساسي إلى تكوين كادر عربي قادر على منافسة الشركات الكبيرة في هذا المجال.

* الألعاب العنيفة ما هي أخطارها؟

الحقيقة أن أخطار الألعاب بدأت بالظهور بشكل كبير في السنتين الماضيتين، وينتج ذلك عندما يقوم اللاعب بتخطي العدد الأقصى لساعات اللعب يومياً (أكثر من 4 ساعات يومياً = مدمن ألعاب)، ولمعاينة الأخطار يمكن تقسيم السلبيات إلى أقسام كالتالي:
جسمية : وتتركز بشكل أساسي حول سلامة العينين ( النظر لساعات طويلة إلى الشاشة ) ، وإلى زيادة معدل السمنة والبدانة، حيث أن اللاعب بفقده للوعي أحياناً يقوم بتناول الوجبات السريعة Fast Food والمكسرات بشكل مفرط.
نفسية : اللعب المفرط يبني هواجس نفسية عند اللاعب تستمر معه حتى بعد إقفال الألعاب والذهاب للعمل أو الخلود للنوم، مما يؤثر عليه سلباً من الناحية النفسية.
إقتصادية : بسبب إدمانه على الألعاب يدفعه للشراء المتكرر من متجر اللعبة أو شراء أي تحديث لها غير مجاني، حيث أني أعرف شخص صرف ما يقارب 17 ألف دولار على لعبة خلال السنة الماضية لوحدها.
إجتماعية : مدمن الألعاب يتميز بالعزلة الإجتماعية ( وبالإجتماعية الإلكترونية ) قام بإستبدال الأصدقاء الحقيقين الذين حوله بأصدقاء حقيقيين يجتمع معهم داخل اللعبة وتفصل بينهم المسافات البعيدة.
تربوية وسلوكية : يتعرف اللاعب على ثقافات مختلفة مما يدعه يكتسب الحسن ( وهذه إيجابية ) والسيء منها، كالألفاظ السيئة والمعاملات المتردية.

* هل تصميم وإطلاق تطبيقات خاصة بالألعاب أمر صعب؟

لو كان هذا السؤال موجهاً لي قبل 10 سنوات لقلت نعم، لكن الآن أصبح من السهل جداً إنتاج التطبيقات والبدء بتطوير الألعاب، وخصوصاً المواد التعليمية الكثيرة المتوفرة بشكل مجاني ومدفوع. أيضاً سهولة حل المشاكل خصوصاً أن هناك العديد من المطورين متوفرين ومتفرغين فقط ليساعدوك في مشاكلك.

* عادة الأهل لا يهتمون ولا يطلعون على الألعاب التي يلعبها أطفالهم فكيف يمكن تمييز السيء من الجيد؟

هذا صحيح وخصوصاً في مجتمعنا العربي، هناك نظام تقييم لكل لعبة يتم إصدارها بما يتناسب مع محتواها وأشهر نظام للتقييم هو The Entertainment Software Rating Board المختصر بـ ESRB ، يمكن الحصول على معلومات أكثر عنه من هذه الصفحة، وننوه وندعوا الأهالي إلى ضرورة البحث عن اللعبة المطلوبة قبل شراءها، وهناك العديد من المواقع الأجنبية والعربية التي تقوم بعمل مراجعات للألعاب، حيث أن ذلك لن يستغرق من الأهل سوى أقل من نصف ساعة لمعرفة ما هذه اللعبة وما هي محتوياتها وإلى أي مدى ممكن تسبب أضرار على اللاعب.

* كيف يمكننا حماية أجهزة الأطفال من الألعاب السيئة؟

أصبح بالإمكان الآن لأي جهاز حديث أن يقوم الأهل بعمل رقابة على الأجهزة بما يسمى Parent Control ، حيث أنها خيار أو تطبيق يتيح للأهل أن يخصصوا تطبيقات حصرية لكي يقوم طفلهم بلعبها، ليس هذا فحسب، بل يقوم بإعطاء تقارير عن ماذا قام بفتحه وأي موقع قام بدخوله.

* ما هي طبيعة الألعاب المناسبة للأطفال؟

ألعاب تعليم اللغات والكلمات والحروف والحيوانات، حيث أنها تنمي ذكاء الطفل وتشجعه على التعليم بتفاعلية أكثر.

* متى ننتج ألعاب أطفالنا برأيك؟

عندما يصبح لدينا العديد من المطورين العرب، ويجدوا الدعم والمحفز للبدء بتطوير ألعاب ، والحقيقة أن هناك بالفعل ألعاب عربية من مطورين مستقلين نفتخر بها.