:¦- (8) تعلّم لغة الـ:C من الصفر -¦: لعبتك الأولى ¦: تم التجديد 26/06/2015
ط¢ط®ط±
ط§ظ„طµظپط­ط©
EdyBel

  • ط§ظ„ظ…ط´ط§ط±ظƒط§طھ: 46565
    ظ†ظ‚ط§ط· ط§ظ„طھظ…ظٹط²: 15853
ط¹ط¶ظˆط© ط£ط³ط§ط³ظٹط©
EdyBel

ط¹ط¶ظˆط© ط£ط³ط§ط³ظٹط©
ط§ظ„ظ…ط´ط§ط±ظƒط§طھ: 46565
ظ†ظ‚ط§ط· ط§ظ„طھظ…ظٹط²: 15853
ظ…ط¹ط¯ظ„ ط§ظ„ظ…ط´ط§ط±ظƒط§طھ ظٹظˆظ…ظٹط§: 7.4
ط§ظ„ط£ظٹط§ظ… ظ…ظ†ط° ط§ظ„ط¥ظ†ط¶ظ…ط§ظ…: 6275
  • 18:03 - 2011/05/15

عمل تطبيقي : " أكثر أو أقل " ، لعبتك الأولى

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

 - تجهيزات و نصائح
- مبدأ عمل اللعبة  : قبل أن نبدأ يجب أن أشرح لك مبدئ عمل البرنامج، إنه لعبة أحب تسميتها بـ "أكثر أو أقل" .

المبدأ هو التالي :
1- الجهاز يختار عشوائيا رقما من 1 إلى 100 .
2- يطلب منك أن تخمن رقما و بالتالي ستختار بدورك من 1 إلى 100.
3- يقوم الجهاز بمقارنة الرقم الذي كتبته بالرقم الغامض، ثم يقول لك ما إن كان الرقم الغامض أصغر أو أكبر من الرقم الذي اخترته أنت.
4- ثم يقوم الجهاز بإعادة طلب الرقم منك
5- يقول لك ما إن اقتربت منه يعني الرقم الغامض أصغر أو أكبر من الرقم الذي اخترته أنت.
6- و هكذا تستمر العملية حتى تجد أنت ذلك الرقم .

و الهدف من اللعبة هي أن تجد الرقم الغامض في أقل عدد ممكن من المحاولات بالطبع.

و هذا ما يجب أن تكون عليه اللعبة في طور التنفيذ :

 

What's the number ? 50
Greater !

What's the number ? 75
Greater  !

What's the number ? 85
Lesser !

What's the number ? 80
Lesser !

What's the number ? 78
Greater !

What's the number ? 79
Bravo, you have find the mysterious number
 !!!

- إختيار رقم عشوائي :

* لكن كيف يختار الجهاز رقماً عشوائياً؟ أنا لا أجيد فعل هذا!

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

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

طبعا سنقوم بالاختيار الثاني و لكن إن أردت تجريب الحل الأول فلا شيء يمنعك.

لاختيار رقم عشوائي نستعمل الدالة rand(). و هي تسمح باختيار رقم عشوائي لكن نحن هنا نريد رقماً بين 1 و 100، لأننا إن لم نعرف حدودنا سيكون من الصعب التحكم في اللعبة!

للقيام بذلك نكتب التالي: ( لن أطلب منك تخمينها هي أيضاً )

srand(time(NULL));
mysteriousNumber= (rand() % (MAX - MIN + 1)) + MIN;

 
في السطر الأول الذي بـه srand يسمح بتهيئة مولد الأرقام العشوائية، نعم الأمر صعب قليلاً كما أخبرتك. mysteriousNumber هي متغيرة ستحمل الرقم العشوائي المختار .
التعليمة srand لا يجب أن تشغّل إلا مرة واحدة ( في بداية البرنامج ) ، فوجب وضع srand مرة واحدة في البداية أكرر، مرة واحدة فقط . بعدها يمكنك استعمال القدر الذي تريده من الدالة rand() لاختيار الرقم العشوائي. و لكن لا يجب أن يقرأ جهازكم التعليمة srand مرتين ( أكرر مجددا ) .
MAX و MIN هما ثابتان، الأول هو الرقم الأقصى (100) و الثاني هو الرقم الأدنى (1)، و أنصحك بتعريف الثابتين في بداية البرنامج هكذا :
 

const int MAX = 100, MIN = 1;

 
- تضمين المكتبات اللازمة :
كي يشتغل برنامجك بشكل صحيح، يجب أن تقوم بتضمين المكتبات stblib و stdio و time ( الأخيرة تستعمل من أجل الأرقام العشوائية )، يجب إذن أن يبدأ برنامجك بالتالي :
 
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

- التصحيح :

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

- تصحيح " أكثر أو أقل " :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main ( int argc, char** argv )
{
    int mysteriousNumber= 0, inputNumber = 0;
    const int MAX = 100, MIN = 1;

    // Generation of random number

    srand(time(NULL));
    mysteriousNumber= (rand() % (MAX - MIN + 1)) + MIN;

   

    do
    {
        // We request for the number

        printf("What's the number? ");
        scanf("%d", &inputNumber );

        // We compare between inputNumber and mysteriousNumber

        if (mysteriousNumber> inputNumber )
            printf("Greater !\n\n");
        else if (mysteriousNumber< inputNumber )
            printf("Lesser !\n\n");
        else
            printf ("Bravo, you have found the mysterious number!!!\n\n");
    } while (inputNumber != mysteriousNumber);

    return 0;
}

 

- الملف التنفيذي مع الشفرة المصدرية :
 لمن يهمه أمر تحميل اللعبة مع الشفرة المصدرية فليقم بالتحميل من هنا  :
 
 
الملف التنفيذي (.exe) مترجم للويندوز، لذا إن كنت تستخدم نظام تشغيل آخر عليك بإعادة ترجمة البرنامج ليشتغل.
يوجد مجلّدان، واحد فيه الملف التنفيذي ( مترجم للويندوز أكرر ) و آخر فيه ملفات الشفرة المصدرية. 
لتشغيل البرنامج من البيئة التطويرية، قم بفتحها ثم انشئ مشروع جديد من نوع console و قم باستيراد الملف main.c. يمكنك ترجمة البرنامج من جديد كما يمكنك التعديل عليه.

- الشرح :

سأشرح الآن الشفرة المصدرية الخاصة بي بدءاً من الأعلى :

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

المتغيرات :

لم نحتج الكثير منها سوى العدد الذي يدخله المستعمل (inputNumber) و الثانية التي تسمح للجهاز باختيار رقم عشوائي (mysteriousNumber).
و قد قمت كذلك بتعريف الثوابت كما ذكرت في بداية العمل التطبيقي. الشيء الجيد من تعريف الحد الأقصى على شكل ثابت هو إمكانية تحديد صعوبة اللعبة ( بوضع أعلى قيمة هي 100 مثلا ) يكفي أن نعدّل على هذا السطر و نعيد ترجمة البرنامج .

الحلقة :

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

في كلّ دورة من الحلقة نطلب من المستعمل إدخال الرقم، نقوم بتخزين القيمة في المتغيرة inputNumber. بعدها نقارن المتغيرة السابقة بالمتغيرة mysteriousNumber و هنا نجد ثلاث احتمالات :
1- يكون الرقم الغامض أكبر من الرقم الذي أدخله المستعمل و بالتالي تظهر على الشاشة العبارة "Greater !" .
2- يكون الرقم الغامض أصغر من الرقم الذي أدخله المستعمل و بالتالي تظهر على الشاشة العبارة "Lesser !"  .
3- يكون الرقم الغامض مساويا لما أدخله المستعمل و بالتالي تظهر على الشاشة العبارة "Bravo you have found it !"

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

أفكار للتطوير

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

  • ضع عدادا للمحاولات، و هي متغيرة نقوم بزيادة قيمتها incrementation في كلّ مرة عندما لا يجد المستعمل الرقم الغامض بمعنى آخر في كل مرة يعود فيها البرنامج لتشغيل الحلقة، و عند انتهاء اللعبة تقوم بإظهار عدد المحاولات للاعب هكذا مثلا : " Bravo! you have find it with 3 tries only ! ".
  • في البرنامج الذي برمجته، عندما يجد اللاعب الرقم الغامض يتوقف البرنامج، لماذا لا نجعل البرنامج يسأله ما إن أراد المحاولة مرة ثانية ؟ إذا أدرت تطبيق الفكرة فيجب عليك وضع حلقة تشمل تقريبا كل برنامجك، و هذه الحلقة تتكرر مادام اللاعب لم يطلب توقيف البرنامج، و أنصحك بزيادة متغيرة منطقية اسمها مثلا "continuePlaying" ذات القيمة الإبتدائية 1 ، إذا طلب اللاعب توقيف البرنامج، ترجع القيمة للصفر و يتوقف البرنامج .
  • ضع  نمط تعدد اللاعبين يعني بدل لاعب واحد ضع إمكانية اشتراك لاعبين !  لهذا عليك بصنع قائمة Menu في البداية لتطلب من المستخدم اختيار لاعب واحد أو لاعبين إثنين. الفرق بين النمطين يعني لاعب و لاعبين هو توليد الرقم الغامض، ففي الحالة الأولى نستعمل الدالة rand() و في الحالة الثانية نستعمل الدالة scanf !
  • ابتكا  وضعوا مستويات مختلفة لصعوبة اللعبة، و يمكنكم وضع Menu في البداية ليختار المستخدم فيه المستوى و هذا مثال :
    1 = بين 1 و 100
    2 = بين 1 و 1000
    3 = بين 1 و 10000

لفعل هذا يجب التعديل على الثابت MAX . بطبيعة الحال لا يمكننا أن نسميه ثابت إن كانت قيمته تتغير أثناء البرنامج! قم بتغيير اسم هذه المتغيرة إلى maximumNumber و لا تنس نزع الكلمة المفتاحية const لأنها سر الثابت و ببقاءها تبقى قيمة الثابت محفوظة ! تتغير قيمة هذه المتغير على حسب المستوى .

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

هذا الدرس مترجم بواسطة " عدن بلواضح " عن الموقع الفرنسي " openclassrooms.com " للكاتب "Mathieu Nebra"

 :¦- (8) تعلّم لغة الـ:C من الصفر -¦: لعبتك الأولى ¦: تم التجديد 26/06/2015
ط¨ط¯ط§ظٹط©
ط§ظ„طµظپط­ط©