post

تضمين إعلانات Admob داخل Unity

سنأخذكم في هذا الدرس في جولة سريعة لنتعرف معاً كيف نقوم بوضع الإعلانات في ألعابنا ، سواء كانت للـ Android أو لـ IOS ، فنحن كما نعلم أن الإعلانات حالياً هي اكثر مصدر للدخل في الألعاب، و هناك العديد من المزودين الذين بإمكانك بواسطتهم عرض الإعلانات داخل لعبتك ، و سنقوم في هذا الدرس ان شاء الله بالتعامل مع google AdMob

تهئية وعمل حساب على Admob

في البداية هناك أمور يجب أن تكون موجودة مسبقاً ، ألا و هي حساب AdMob ، و إذا لم تكن تمتلك حساب AdMob ، يمكنك بسهولة التوجه إلى admob.google.com و عمل حساب جديد ، بعد عمل حساب جديد ستحصل على واجهة جديدة ، بإمكانك من هذه الواجهة من خلال قائمة الـ Ads إضافة اعلان جديد ، و يجب أن نعلم أنه في كل الإعلانات يجب فصل الـ Android و الـ IOS ، فمثلاً إذا أردت عمل إعلانات لنسخة IOS يجب أن تمتلك ID مختلف عن الـ ID الخاص بنسخة الـ Android ، بعد الضغط على new Ad سيسأل هل اللعبة موجودة على متجر Google Play أو IOS ، سوف نختار لا . في الصفحة التالية سيطلب كتابة معلومات عن اللعبة ، سنقوم بكتابة اسم اللعبة ،و نختار نسخة اللعبة ، (IOS / Android) و سنختار في هذا الفيديو Android و نضغط Add

أهم شيء هنا هو الـ App ID ، بإمكاننا الذهاب إلى App settings و سنجد الـ App ID ، الخطوات موجودة في الرابط https://developers.google.com/admob/unity/start بشكل مرتب ، لاحظ أنه يتطلب منك خطوات متعددة مثل انشاء حساب AdMob

إضافة دوال Admob إلى Unity

يجب أن نقوم بتحميل Mobile Ads Unity plugin ، الذي يحتوي على المكتبة الخاصة بعملية Show Ads و هو موجود في الرابط السابق ، نضغط تحميل و سنجد أن الباقة موجودة و قابلة للتحميل هنا :
https://github.com/googleads/googleads-mobile-plugins/releases/latest

و من Unity سأقوم بالذهاب إلى Assets > Import Package > Custom Package ، و نختار الباقة التي قمنا بتحميلها و نقوم بعمل import لكل شيء ، ثم نقوم بعمل resolve ، نذهب إلى Assets > Play Services Resolver > Android Resolver > Resolve ، عندها ستظهر رسالة تخبرنا باكتمال دمج الباقة ، الآن أصبحت الـ APIs و المكتبة التي تدعم Google جاهزة و متاحة للتحكم ، يتبقى علينا أن نقوم بتغيير الـ Application ID الخاص بنا في منطقة معينة ، Assets/Plugins/Android/GoogleMobileAdsPlugin ، سنجد الملف AndroidManifest.xml ، نضغط الزر الأيمن للماوس و نختار show in explorer ، ثم نقوم بعمل تحرير للملف لتعديله ، نقوم بنسخ الـ App ID السابق و لصقه في مكانه كما هو مذكور في البند android:value ، ثم نقوم بحفظ الملف ، الآن بعد أن قمنا بعمل هذا ، يتقبقى أن نقوم بتفعيل عملية الضغط أو اخراج و عرض الفيديو

<manifest>
    <application>
        <!-- Your AdMob app ID will look similar to this
        sample ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR_ADMOB_APP_ID"/>
    </application>
</manifest>

تفعيل مكتبة Admob وتهيئتها داخل Unity

نعود إلى الـ Documentation السابق ، نلاحظ أنه يتبقى علينا عمل Initialize للـ Mobile Ad ، نلاحظ أن لدينا 3 أنواع و الإعلانات و هي Banner / Interstitial / Rewarded
– الـ Banner يكون موجوداً طيلة وقت اللعب ، في أسفل أو أعلى الشاشة
– الـ Interstitial يقوم بعرض إعلانات عندما يتنقل اللاعب من واجهة إلى واجهة أخرى (تحميل المستوى أو العودة إلى الصفحة الرئيسية …. الخ)
– الـ Rewarded ، و يقوم بعرض فيديو ، و يتوجب على اللاعب مشاهدته كاملاً ليحصل على الجائزة ،و لا يحتوي على زر اغلاق للفيديو .
في البداية سنتعامل مع النوع Rewarded ، سأذهب إلى حسابي على AdMob ثم إلى Ad units سنقوم بـ create ad unit ، سيطلب اختيار نوع الإعلان ، سنختار Rewarded . في الشاشة التالية يطلب الاسم ، سنكتب أي شيء ، ثم نضغط Create ad unit. نلاخحظ أنه قام بعرض الـ Ad Unit ID ، نعود إلى الـ Documentation ثم إلى Implement rewarded ads لمعرفة كيفية استخدامه
في البداية يجب إن نقوم بعمل Initialize للـMobile Ads فنأخذ الكود ، من اليونيتي سنذهب إلى مجلد الـ Scripts و نقوم بعمل سكريبت جديد ثم نقوم بوضع الكود الذي قمنا بأخذه ، و لاننسى استبدال الـ App ID بالـ ID الخاص بنا ، الان سنقوم بسحب هذا السكريبت و وضعه على أي شيء ليتم تنفيذه مباشرة عند البدء ، الإن بمجرد الضغط على زر play لن يظهر شيء لأننا لم نقم ببرمجة شيء بعد ، و لكن إذا اذا ذهبنا إلى الـ Console سنجد أنه قام بعملية Initialize و هنا لا يوجد أي مشكلة ـ و هذا يطمئننا أن امورنا صحيحة ولا يوجد مشاكل ، بقي علينا أن نقوم بجعل الزر يجعلنا نشاهد الإعلان ، سنعود إلى ال Documentation مرة أخرى ، ثم إلى قسم الـ Rewarded ، لنشاهد كيف يمكننا إظهار الإعلان ، و نلاحظ هنا أننا سنقوم بتعريف متغير من النوع rewarded بحيث أن نقوم بعمل Initialize للـ adUnitId الذي سنستخدمه بعد قليل ، سنأخذ هذا المتغير و هذا السطر ، نلاحظ بعد الـ Initialize الـ Unit ID التي نحصل عليها من صفحة الـ Ad units

ضرورة التجربة بإعلانات Google وليس بإعلاناتك

هنا يوجد قضية علينا الانتباه إليها ، نلاحظ هنا في Google يقول “always test with test ads” ، هذا الكود الموجود هنا سيعرض فيديو من شركة Google ، فعندما تقوم بتجربة الإعلانات لا تضع الكود الخاص بك لأن هناك سياسة في الشركة تمنع المطور من استخدام الإعلانات ، و كأنه يقوم بعرض إعلانات لنفسه ليكسب المال ، و اذا قمت باستخدام كود على جهازك كمطور و قمت بعرض الإعلانات على جهازك ، فهناك إمكانية لعمل lock لحسابك ، و نحن لا نريد هذا الشيء ، إذا سوف نأخذ هذا الكود و نقم بلصقه ، بعد أن نقوم بعملية الاسناد للـ ID نقوم بعمل Request ليقم بعرض الإعلان ، إذاً بعد إضافة الكود الأخير يجب أن نقوم بعمل دوال تفيد في عمل ال Callback للـ Events ، فعندما ينجح أو يفشل الإعلان أو عندما يحصل شيء معين ، يقوم بتفعيل أو استدعاء هذا الـ event ، سنذهب إلى الـ Documentation ، سنجد أنه يوجد العديد من الدوال الموجودة مسبقاً ، سنقوم بأخذها و وضعها في السكريبت الخاص ، بعد أن قمنا بتصحيح الأخطاء ، إذا قمنا بتعريف الـ Rewarded Ads بهذا الـ ID الخاص بـ Google ، و الذي سيعرض لنا شيء خاص بـ Google و ليس اعلاناتنا ، طبعا عند الانتهاء ستقوم باستبداله بشيء خاص بك ، لاحظوا أنه عندما يتم استدعاء الكود بشكل صحيح سيقوم بإظهار الفيديو ، هنا لدينا عندما يتم تحميل الفيديو من الانترنت ، يجب أن نقوم بعمل عرض للفيديو ، فهو يقوم بالتحميل فقط ، فيجب أن نضع جملة شرطية ، عند نهاية التحميل قم بعرض الفيديو ، سنقوم بالحفظ و نعود إلى يونيتي ، بالضغط على زر شاهد سيظهر معلومات أنه لا يوجد أي مشكلة
لزيادة عدد الـ coins التي يكسبها المستخدم نذهب للدالة HandleUserEarnedReward ، في هذه الدالة اللاعب قام بمشاهدة الفيديو كاملاً فيجب أن نقوم بإعطائه coins ، هنا قمنا بتعرف المتغير coins
نذهب إلى build and run لنقوم بتشغيل اللعبة ، نلاحظ أن الـCoins عددها 0 ، بالضغط على الزر شاهد سيقوم بعرض الفيديو، و عند الانتهاء سيقوم بإضافة الـ Coins ، نقوم بالضغط مرة أخرى على الزر شاهد و نقوم بإغلاق الفيديو و نلاحظ أنه لن يقوم بمنحنا الـ Coins ، فيجب على اللاعب انهاء الفيديو ليحصل على الجائزة ، هذا كان بشكل سريع عن كيفية إضافة الـ AdMob داخل اللعبة على محرك الألعاب Unity

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

using GoogleMobileAds.Api;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GoogleAds : MonoBehaviour
{
    private RewardedAd rewardedAd;


    // Start is called before the first frame update
    void Start()
    {
#if UNITY_ANDROID
        string appId = "ca-app-pub-3062555098484328~2649488225";
#elif UNITY_IPHONE
            string appId = "ca-app-pub-3940256099942544~1458002511";
#else
            string appId = "unexpected_platform";
#endif

        // Initialize the Google Mobile Ads SDK.
        MobileAds.Initialize(appId);
        
        

    }

    public void ShowAds()
    {
        this.rewardedAd = new RewardedAd("ca-app-pub-3940256099942544/5224354917");

        // Called when an ad request has successfully loaded.
        this.rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
        // Called when an ad request failed to load.
        this.rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
        // Called when an ad is shown.
        this.rewardedAd.OnAdOpening += HandleRewardedAdOpening;
        // Called when an ad request failed to show.
        this.rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
        // Called when the user should be rewarded for interacting with the ad.
        this.rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
        // Called when the ad is closed.
        this.rewardedAd.OnAdClosed += HandleRewardedAdClosed;


        // Create an empty ad request.
        AdRequest request = new AdRequest.Builder().Build();
        // Load the rewarded ad with the request.
        this.rewardedAd.LoadAd(request);
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void HandleRewardedAdLoaded(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdLoaded event received");
        if (this.rewardedAd.IsLoaded())
        {
            this.rewardedAd.Show();
        }
    }

    public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToLoad event received with message: "
                             + args.Message);
    }

    public void HandleRewardedAdOpening(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdOpening event received");
    }

    public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
    {
        MonoBehaviour.print(
            "HandleRewardedAdFailedToShow event received with message: "
                             + args.Message);
    }

    public void HandleRewardedAdClosed(object sender, EventArgs args)
    {
        MonoBehaviour.print("HandleRewardedAdClosed event received");
    }

    public void HandleUserEarnedReward(object sender, Reward args)
    {
        GameLogic.coins += 150;

        string type = args.Type;
        double amount = args.Amount;
        MonoBehaviour.print(
            "HandleRewardedAdRewarded event received for "
                        + amount.ToString() + " " + type);
    }


}

post

#21 التغليف Encapsulation – البرمجة بواسطة #C

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

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

ما معنى Encapsulation ؟ و كيف يمكننا حماية اسطر برمجية معينة من التحكم بها و من القراءة بها ؟ ما هي درجات كلمات private و public ؟

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

Public void DoSomething()
{

}
Private void HelperMethod()
{

}

في الدالة الـ private سنقوم بطلب طباعة Hello world! ، و في الدالة الـ public سوف نقوم باستدعاء الدالة الـ private
الآن لدي في التطبيق الخاص بي عندما أقوم بتعريف متغير أو object من النوع something
Something s1 = new Something();
لاحظوا إذا كتبت s1 و قمت بالضغط على dot سيعطيني الدالة التي اسمها DoSomething و ليس لدي إمكانية التعامل مع الدالة HelperMethod لأن هذ شيء خاص و داخلي لا يمكنني الوصول إليه، الآن لو تابعنا
S1.DoSomething();
Condole.ReadLine();
و حاولنا تشغيل التطبيق سنلاحظ أنه سيقوم بطباعة الجملة الموجودة في HelperMethod

إستخدام التغليف لتطوير التطبيق

من الممكن أن نرغب بمعرفة عدد ضغطات المستخدم أو معرفة ما قام الزبون باستدعائه ، هنا سنقوم بتعريف متغير من النوع int باسم clickCount ، و نقوم بجعلها في الدالة private
clickCount ++;
لتعتبر الزيادة ، مثلاً عندما يقوم بعمل شيء معين أو يستدعي أداة معينة يزداد هذا العداد بدون معرفة الزبون ، فهو أمر غير مهم بالنسبة له ، كل ما يهتم به هو النتيجة النهائية ، أما أنا كمطور قد يهمني معرفة هذه الأمور و ربما أرغب بعمل تحليل للبرنامج الخاص بي
هناك أنواع أخرى غير public و private و هي protected و internal ، و هما متقدمين على هذه الدورة ، و بإمكانك البحث عنهما بشكل موسع
هذا كان بشكل سريع شرح لدرس اليوم encapsulation و نلقاكم في درس قادم إن شاء الله

الأسطر البرمجية التي قمنا بتنفيذها في هذا الدرس

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrivatePublic
{
    class Program
    {
        private static string k = "";
        static void Main(string[] args)
        {
            Something s1 = new Something();
            s1.DoSomething();
            Console.ReadLine();
        }
    }

    class Something
    {
        static int clickCount;
        public void DoSomething()
        {
             HelperMethod();
        }
        private void HelperMethod()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

post

#20 النطاق Scope – البرمجة بواسطة #C

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

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

لماذا عندما نقوم بتتعريف متغير جديد ، لان نستطيع استخدامه في كل التطبيق ؟ ما هو الـ scope ؟ و ما هو النطاق الخاص بالمتغير ؟ و متى ينتهي المتغير و يتم حذفه من الذاكرة ؟

في درس اليوم سوف نتكلم عن النطاقات Scopes و أهميتها ، و ذكرنا سابقاً أننا سنقوم بشرحها مستقبلاً بشكل مكثف ، لدينا الآن برنامج Visual Studio 2019 Community و هو مجاني كما ذكرنا سابقاً، بإمكاننا عمل مشروع جديد من خلال Create new project و نقوم باختيار الـ Console app ثم الضغط على next و في الصفحة التالية نقوم بكتابة اسم مشروع ، و ليكن UnderstandingSscope ، سيفتح لنا النافذة الرئيسية للكود

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

 for (int i=0 ; i<10 ; i++)
 {
      Console.WriteLine(i.ToString());
 }
 Console.ReadLine(); 

فهم النطاق

اذا قمنا بتنفيذ المشروع ، فسنرى أنه قام بطباعة الأعداد من 0 إلى 9 كما هو المعتاد ، لكن لنلاحظ التالي ، لو قمنا بأخذ الجملة Console.WriteLine(i.ToString()); و كتابتها خارج القطعة البرمجية الموجودة فيها ( أي خارج القطعة الخاصة بالحلقة for loop ) ، يصبح الكود بالشكل :

 for (int i=0 ; i<10 ; i++)
 {
      Console.WriteLine(i.ToString());
 }
 Console.WriteLine(i.ToString());
 Console.ReadLine(); 

فنلاحظ أنه مباشرة سيظهر لدينا خطأ في قائمة الأخطاء ، و يقول الخطأ ، “the name does not exist in current context” ، بما معناه أن المتغير لا يمكن التعرف عليه في هذه المنطقة لأن الـ i حصراً لتلك القطعة البرمجية لأنها داخل نطاق الحلقة التكرارية ، بالتالي فإنه فعلياً غير موجود في القطعة البرمجية الأخرى ، و لن يتم التعامل معه .
سنقوم بجعل الجملة الخاطئة جملة تعليق . و سنقوم بعمل متغير جديد باسم j في القطعة الأولى ، و التي تحتوي على الحلقة for loop و نقوم بإسناده داخل القطعة البرمجية التابعة للحلقة for loop ، ثم نقوم بكتابة الجملة لتقوم بطباعة المتغير j خارج الحلقة for loop ليصبح الكود كالتالي :

{
     string j =” “ ;
     for (int i=0 ; i<10 ; i++)
     {
          Console.WriteLine(i.ToString());
          j = i.ToString();
     }
     // Console.WriteLine(i.ToString());
     Console.WriteLine(“j = “ + j.ToString());
     Console.ReadLine();
}

ثم نقوم بتنفيذ البرنامج … نلاحظ أنه يخبرنا في النهاية أن j تحصل على القيمة 9 ، نلاحظ أنه قمنا بتعريف المتغير j في القطعة الخارجية .. إذا لن يحدث أي خلل سواء استعملته في القطعة الداخلية أو في نفس القطعة التي قمت بتعريفه داخلها .

النطاق على مستوى ال Class

سنقوم بتعريف property جديدة من النوع String
Private static string k =” “ ;
و في الداخل ستكون قيمة k الجديدة ستكون هي قيمة i ، و سنقوم في الخارج بطباعة قيمة k الجديدة كما قمنا بطباعة قيمة j سابقاً ، بتنفيذ البرنامج نلاحظ أنه يعطيني نفس النتيجة النهائية . الشيء الذي نريد توضيحه أنه بحال قمت بتعريف method على مستوى الكلاس ، مثلا :

static void HelperMethod()
{
    K = “10” ;
}

و قمنا باستدعاء الـ HelperMethod في الأعلى ، ثم قمت بتنفيذ المشروع ، نلاحظ أن القيمة النهائية هي 10 ، لأن المتغير k على مستوى الكلاس ، فيمكنني استخدامه في أي منطقة داخل الكلاس ، و أنا قمت باستخدامه داخل method لأقوم بالتعديل عليه ، أيضا في جملة التكرار for سأقوم بوضع جملة شرطية ، في حال كان قيمة i هي 9 قم بتعريف متغير ، string l =” “ ; ، ثم نقوم مباشرة بطباعة هذا المتغير خارج اقواس الحلقة for loop ، مباشرة سيعطيني أن هناك خطأ … فهذا المتغير تم تعريفه في قطعة برمجية داخلية ، فهذا المتغير عندما يصل إلى نهاية القوس سينتهي و يختفي من الذاكرة ويكون خارج النطاق فلا يمكن استخدامه خارج هذه الاقواس . اذاً هناك نطاق لكل متغير ، ولا يمكن استخدامه خارج هذا النطاق ، و هذا الكلام ليس محصوراً فقط للمتغيرات ، فعندما نقوم باستنساخ مجسم من كلاس ، ينطبق عليه كل ما قمنا بتطبيقه في هذا الدرس ، هذا كان بشكل سريع ملخص لمفهوم النطاقات scopes .
نراكم ان شاء الله في درس قادم قريباً . السلام عليكم .

الأسطر البرمجية التي قمنا بتنفيذها في هذا الدرس

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UnderstandingScope
{
    class Program
    {
        private static string k = "";
        static void Main(string[] args)
        {
            string j = "";
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i.ToString());
                j = i.ToString();
                k = i.ToString();

                if (i == 9)
                {
                    string l = "";
                }
                //Console.WriteLine(l);
            }
            //Console.WriteLine(i.ToString());
            Console.WriteLine("j = " + j.ToString());
            HelperMethod();
            Console.WriteLine("k = " + k.ToString());
            Console.ReadLine();
        }

        static void HelperMethod()
        {
            k = "10";
        }
    }
}

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

النسخة 2017.2 من محرك Unity متاحة الآن!

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

عن النسخة :

النسخة التي وُعدنا بها من شركة Unity لمحركها الشهير Unity Engine أصبحت متاحة الآن! نعم النسخة 2017.2 أصبحت قابلة للتحميل، وبإمكانك الحصول عليها من هنا. التي تحتوي على العديد من الميزات الجديدة والتحديثات وحلول لمشاكل كانت تؤرق المطورين.

العناوين الرئيسية :

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

  • محرر المراحل Tilemap : 

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

مدير الإنتاج cinemachine الثنائي الأبعاد:

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

الدروس التفاعلية Interactive Tutorials :

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

ميزة إستيرا المجسمات Asset Management :

أو ما يعرف بالـ DCC المختصر من Digital Content Creation ، فالآن أصبح من السهل التعامل مع التطبيقات المختلفة مثل Autodesk وغيرها، ليس فقط إضافة ميزات لما تحويه هذه الملفات مثل الملف الشهير FBX الذي يحوي المجسمات والصور والحركة فحسب، بل إمتد الموضوع لإضافة مجسم جديد يمكنك إنشاءه وربطه لاحقاً بملف من تلك البرامج مما يتيح لك التعديل الآني ومن غير معاناة من إنتظار الوقت الكثير لإنعكاس التعديلات بين البرامج، فلقد تم إضافة Linked Prefabs  إلى قائمة الإنشاء كما هو موضح في هذا الفيديو :

إضافات للواقع الإفتراضي/المعزز XR :

يتضح جلياً تركيز المحرك على إعطاء القدرة القصوى لمطوريه للتماشي مع أكثر التطبيقات طلباً في الوقت الحالي، فقد إعتبرت كبرى الشركات مثل Microsoft و Sony و Google سنة 2016 على أنها سنة الواقع الإفتراضي VR المختصر من Virtual Reality والواقع المعزز AR المختصر من Argumented Reality بجدارة، أو ما يعرف كليهما بالإختصار XR ، فهناك العديد من الميزات التي تم إضافتها لتسهل العمل مع هذه التطبيقات، فها هي تضيف Vuforia  إلى محركها ضمنياً، وتدعم OpenVR و Google ARCore كما في الفيديو التالي :

ليس هذا فحسب، فهناك بعض الإضافات والتحسينات كالتالي :

+ ميزة Timeline للأصوات : بإمكانك الآن التعامل مع الأصوات أيضاً
+ تحديثات بالـ Profiler لتحليل اللعبة بشكل أكثر تفصيلاً
+ ميزة Lightmap background لإضافة لايت ماب للأماكن الفارغ سابقاً
+ أصبحت الأشجار يتم حساب ال Lightmap الخاص بها أيضاً
+ تحسينات على نظام ال Particle System

 

الخلاصة

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

post

محاكاة حركة أمواج البحار في محرك Unity

 

مقدمة :

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

إعرف ميزانيتك قبل البدء :

عندما أتكلم هنا عن الميزانية، لا أقصد إطلاقًا النقود، وإن كانت جزء من الميزانية إلا أنها ليست كل شيء، فعندما تريد إنجاز أي شيء ( نتكلم هنا عن مجال الألعاب )، تحتاج إلى معرفة تفاصيل معينة مثل، كم من الوقت تجتاجه لإنجاز هذا الأمر، أيضاً هل يتوافق مع متطلبات مشرعك، فمثلاً يمكننا الإستعانة بمحاكاة متوفرة على المتجر ومناسبة، إلا أنها تفتقر للعمل بشكل سلس على متصفح الويب مثلاً, بمعنى آخر أنك لن تستطيع الإستفادة من تلك المحاكاة إن كان مشروعك على متصفح الويب، لذلك لا تضع الوقت بالحصول عليها وتجربتها إن كانت لا تتناسب مع منصتك أصلاً!
مسك، المشروع الحالي الذي أعمل عليه وأديره، تطلب مني محاكاة لبحر يحيط جزيرة، ليس هذا فحسب، بل تطلب أيضاً محاكاة حركة السفن التي يحملها هذا البحر، فللوهلة الأولى قمت إختصاراً للوقت بالذهاب إلى متجر Asset Store للبحث عن شيء يتناسب مع ما أريد، ووجدت العديد منها هذه الأداة :

للوهلة الأولى بدى لي أن هذا ما أريده،  لكن بعد البحث والقراءة عن هذه الأداة وجدت أنها لا تتناسب مع ميزانيتي ( الوقت + المنصة ) فمشروعي سيصدر على منصة Web GL وهذا ال Shader لا يدعها بشكل كلي، فضاع جزء من وقتي بلا فائدة!

الحل أبسط مما تتخيل أحياناً :

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

  • – قمت بوضع وجه Quad واحد وقمت بجعله بحجم كبير لكي يبدوا وكأنه البحر، أي قمت بجعل الـ Scale له 2000 كل كل محور.
  • – ثم قمت بوضع صورة لموج قابلة للتكرار Seamless .
  • – ثم قمت بكتابة أسطر برمجية تقوم بعمل تحريك لإكساء المجسم Texture Scrolling ، كما في الصورة التالية :

عند هذه النقطة، حصلت على البحر كما في الصورة التالية :

لكن هذا وحده لم يكفي بالغرض، فضفاف الجزيرة وإمتداد الرمل يجب أن يبدوا واضحاً لإعطاء مصداقية بتدرج العمق، وكان الحل بتحويل Shader المادة التي أستخدمها من Standard إلى Particle –> Multiply كما في الصورة التالية :

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

حركة السفينة :

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

بهذه الطريقة حصلت على المطلوب تماماً، وكنت راضياً جداً عن النتيجة!

الخلاصة المستفادة :

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

 

أسامة ديب
مطور ألعاب

 

 

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”
وفي كثير من ألعابه قام بالإستفادة مما حلم به ورآه في طفولته.

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