مبدأ عمل اللعبة : قبل أن نبدأ يجب أن أعطيكم ما الشيء الذي سنبني عليه برنامجنا، و هذا ما أسميه "Plus ou moins" . المبدأ هو :
1- الجهاز يختار عشوائيا رقما من 1 إلى 100 .
2- يطلب منك أن تخمن رقما و بالتالي ستختار بدورك من 1 إلى 100.
3- يقوم الجهاز بمقارنة الرقم الذي كتبته بالرقم الغامض، ثم يقول لك ما إن كان الرقم الغامض أصغر أو أكبر من الرقم الذي اخترته أنت.
4- ثم يقوم الجهاز بإعادة طلب الرقم منك
5- يقول لك ما إن اقتربت منه يعني الرقم الغامض أصغر أو أكبر من الرقم الذي اخترته أنت المرة الثانية
6- و هكذا تستمر العملية حتى تجد أنت ذلك الرقم .
و الهدف من اللعبة هي أن تجد الرقم الغامض في أقل عدد ممكن من المحاولات ;)
و هذا ما يجب أن تكون عليه اللعبة في النهاية بطبيعة الحال :
- إختيار رقم عشوائي :
Quel est le nombre ? 50
C'est plus !Quel est le nombre ? 75
C'est plus !Quel est le nombre ? 85
C'est moins !Quel est le nombre ? 80
C'est moins !Quel est le nombre ? 78
C'est plus !Quel est le nombre ? 79
Bravo, vous avez trouve le nombre mystere !!!
لكن كيف نقوم بوضع الجهاز ليختار رقم عشوائي ؟ لم نتعلم هذا !
هذا صعب قليلا بالنسبة للجهاز، صحيح هو يستطيع القيام بعمليات حسابية لكنه لا يتمكن من اختيار رقم عشوائيا ! و لهذا كي نقوم بهذا يجب أن نبرمج الجهاز على عمليات متعددة، و هنا نميز حلين :
1- إما أن تكون مع صديقك و أنت تكتب بالاستعانة بالدالة scanf رقم معين من اختيارك ( بدل الجهاز ) دون أن يراك صديقك و لدى تشغيل البرنامج تعطيه الدور ليجد الحل .
2- أعطيكم طريقة ثانية لجعل الجهاز يختار وحده الرقم و بهذا توفر عليك مشقة احضار صديقك و تلعب أن فقط دون زميل ثانٍ.
طبعا سنقوم بالاختيار الثاني و لكن إن أردتم تجريب الحل الأول فلن يمنعكم أحد ( لكن لاحقا ليس في درسي خخخ ) .
لاختيار رقم عشوائي نستعمل الدالة rand(). و هي تسمح باختيار رقم عشوائيا لكن نحن هنا نريد تحديدا واضحا بين 1 و 100، يعني إن لم نكن نعرف نهاية و حدود الأرقام يصبح الأمر معقدا كثيرا !
للقيام بذلك نكتب:
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
في السطر الأول الذي بـ:srand ، يطلب رقما عشوائياً، و nombreMystere هي متغيرة تحمل قيمة الرقم العشوائي .
التعليمة srand لا يجب أن تشغّل إلا مرة واحدة ( في بداية البرنامج ) ، فوجب وضع srand مرة واحدة في البداية أكرر مرة واحدة . بعدها يمكنكم بواسطة الدالة rand() اختيار الرقم العشوائي، و لا يجب أن يقرأ جهازكم التعليمة srand مرتين ( أكرر مجددا ) .
MAX و MIN هما ثابتان، الأول هو الرقم الأقصى (100) و الثاني هو الرقم الأدنى (1)، و أنصحكم بتعريف الثابتين في بداية البرنامج هكذا :
const int MAX = 100, MIN = 1;
( من أجل رقم عشوائي محصور بين 1 و 100 ) .
- المكتبات بالـ:include
كي يشتغل برنامجكم بشكل صحيح، يجب أن تشملوا ثلاث مكتبات stblib و stdio و time ( الأخيرة تستعمل من أجل الأرقام العشوائية )، يجب إذن أن يبدأ برنامجكم بالتالي :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
- يكفي شرحا !!
طبعا يجب أن أتوقف هنا لأنه لو أكمل سأعطيكم اللعبة كاملة ههه ، أعتقد بأنني شرحت لكم مبدأ عمل اللعبة، و أعطيت لكم معلومات عما كان ينقصكم أقصد اختيار الارقام العشوائية، و بإعطائكم صورة عن الواجهة للعبة أعتقد بأن كل شيء واضح، و كل شيء أوردته في ماسبق من دروس فهيا انطلقوا في برمجة أول لعبة لكم !!!
- التصحيح :توقفوا ! سأجمع الأوراق =) ، إن برمجة هذه اللعبة سهل للغاية، و هناك عدة طرق للتوصل لنفس النتيجة فلكل واحد أسلوبه البرمجي و هذا ما سأطلعكم عليه هو أسلوبي .- تصحيح كود اللعبة "Plus ou Moins" أي " أكثر أو أقل "#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ( int argc, char** argv )
{
int nombreMystere = 0, nombreEntre = 0;
const int MAX = 100, MIN = 1;// Génération du nombre aléatoiresrand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;do
{
// On demande le nombre
printf("Quel est le nombre ? ");
scanf("%d", &nombreEntre);// On compare le nombre entré avec le nombre mystèreif (nombreMystere > nombreEntre)
printf("C'est plus !\n\n");
else if (nombreMystere < nombreEntre)
printf("C'est moins !\n\n");
else
printf ("Bravo, vous avez trouve le nombre mystere !!!\n\n");
} while (nombreEntre != nombreMystere);return 0;
}
- اللعبة مع كودات السورس : لمن يهمه أمر تحميل اللعبة مع الكودات فقد رفعتها على الميغا أبلود :ستجدون ملف edy program بداخله ملفان واحد اسمه Executable به اللعبة باسم plusoumoins و الثاني اسمه Sources فيه ملف وحيد اسمه main.c .لا تدخل مباشرة في الملف main.c بل أدخل أولا للبرنامج Code::Blocks و ابني مشروعا جديدا فارغا ( طبعا كونسول ) و ما إن يتم أطلب من البرنامج إدخال الملف main.c- تفسيرات :
سأفسر لكم الآن الكود الخاص بي من الأعلى إلى الأسفل :
Les directives de préprocesseur => توجيهات المعالج القبلي :
هما الأسطر في الأعلى التي تبدأ بالدياز # و هي تقوم بشمل المكتبات التي نحتاج إليها . و قد أعطيتها لكم في أثناء طرح التمرين فآمل أن لا تكونوا قد نسيتموها و بدأتم في اللخبطة !
Les variables => المتغيرات :
لم نحتج الكثير منها سوى (nombreEntre) و الثانية التي تسمح للجهاز باختيار رقم عشوائي (nombreMystere).
و قد قمت كذلك بتعريف الثوابت كما ذكرت في بداية الـ:TP، و هي تسمح بتغيير صعوبة اللعبة فبدل 100 مثلا نضع 1000 للـ:MAX. يعني يكفي التعديل على هذا السطر و إعادة التشغيل .
La boucle => الحلقة :
لقد اخترت الحلقة do... while . طبعا إن الحلقة while يمكنها أن تشغل لعبتنا لكن وجدت بأن الـ:do ... while تساعدني أكثر و لكن شخص أسلوبه !
في كلّ دورة إذا من الحلقة نطلب من الجهاز إدخال الرقم، ثم يتم تخزين الرقم الذي اختاره في المتغيرة nombreEntre . بعدها نقارن المتغيرة السابقة بالمتغيرة nombreMystere و هنا نجد ثلاث احتمالات :
1- يكون الرقم الغامض أكبر من الرقم الذي كتبته و بالتالي تظهر على الشاشة العبارة "C'est plus !" يعني " إنه أكبر ! " .
2- يكون الرقم الغامض أصغر من الرقم الذي كتبته و بالتالي تظهر على الشاشة العبارة "C'est moins !" يعني " إنه أصغر ! " .
3- يكون الرقم الغامض مساويا لما كتبت و بالتالي تظهر على الشاشة العبارة "Bravo vous avez trouvé !"
وجب أن تضع شرطا للحلقة، و هذا سهل : تواصل الحلقة مادام الرقم الذي تم ادخاله لا يساوي الرقم الغامض . و ما إن يتم إدخال الرقم المطلوب تتوقف الحلقة و بالتالي ينتهى البرنامج هنا :) .
أفكار للتطوير
لن أوقف الدرس هنا بالطبع، فمعي كلما تقتنعون بشيء أزيدكم قناعة فيه، احم احم أقول لكم مجددا بأنني أطلب منكم أحيانا التعديل على الكودسورس على سبيل التغيير و هذا كي تتدربوا فقط و اعلموا أن التدرب هذا يعطيكم العقلية البرمجية، فالخطأ الكبير الذي سترتكبونه هو إذا كنتم تفهمون الدروس و لكن في التطبيق تعجز أياديكم على كتابة سطر واحد، قلت ذلك و أكرره.
- لنتخيل أن لي فكرة جميلة تشبه فكرتنا السابقة .. لكن قبل ان أواصل لن أعطيكم الحل لو تقطعوا راسي خخخ لا ع الخاص و لا هنا، يجب أن تتدبروا أموركم بنفسكم و لو اظطررتم لدخول مواقع أجنبية هع.
ضعوا عدادا للـ:"coups" يعني عدد المحاولات، و هي متغيرة تقوم بالإضافة incr في كلّ مرة عندما لا تجدون الرقم الغامض بمعنى آخر في كل مرة ترجعون للحلقة، و عند انتهاء اللعبة يعني يجد اللاعب الرقم المطلوب يكتب له إضافة للـ:bravo العبارة vous avez trouvé le nombre mystère en 8 coups مثلا.- دائما تعودنا أنه عندما يجد اللاعب الرقم الغامض يتوقف البرنامج، لماذا لا نجعل البرنامج يسأله ما إن أراد المحاولة مرة ثانية ؟ إن فعلتم ذلك وجب وضع حلقة boucle تشمل تقريبا كل برنامجك، و هذه الحلقة تتكرر مادام اللاعب لم يطلب توقيف البرنامج، و أنصحكم بزيادة متغيرة منطقية اسمها مثلا "continuerPartie" مثبتة في القيمة 1 بالبداية، إذا طلب اللاعب توقيف البرنامج، ترجع القيمة للصفر و يتوقف .
- ضع مود تعدد اللاعبين يعني بدل لاعب واحد ضع لاعبين ! لهذا ضعوا Menu في البداية لتطلبوا من المستخدم اختيار 1 player أو 2 players و لتعلموا أن الفرق بين النمطين يعني لاعب و لاعبين هو توليد الرقم الغامض، ففي حالة يكون لدينا rand() كما رأينا يكون لدينا في الحالة الثانية scanf !
- ابتكروا وضعوا مستويات مختلفة لصعوبة اللعبة، و يمكنكم وضع Menu في البداية ليختار المستخدم فيه المستوى و هذا مثال :
- 1 = بين 1 و 100
- 2 = بين 1 و 1000
- 3 = بين 1 و 10000
و طبعا إذا قمتم بهذا وجب التعديل على الثابت MAX ، طبعا فلا يمكن أن نطلق على القيمة ثابت و هي تتغير بمجرى البرنامج! و لهذا فلتغيروا المتغيرة إلى اسم nombreMaximum و لا تنسوا نزع الكلمة "const" لأنها سر الثابت و ببقاءها يبقى الثابت ! و القيمة الخاصة بالمتغيرة تتغير على حسب المستوى .
و بهذا أجعلكم لا تضيعون الوقت في الفراغ بل تستغلونه في البرمجة البناءة، يمكنكم وضع الكثير من الافكار الأخرى لتطوير هذه اللعبة و أنا متأكدة بأنه هناك المزيد من الأفكار..
و هنا ينتهي أول TP لنا في الدورة، اعلموا أن الحصص القادمة منه ستكون أكثر أهمية، و بخصوص التعديل على الكودسورس من أجل التطوير فهذا أمر لازم ان تقوموا به لتطوير قدراتكم البرمجية . و كما قلت لا أريد أسئلة بخصوص التطويرات فقد هيئت لكم الطريق ووجب أنتم أن تفكروا أكثر و تحتكوا بالأجانب ربما هع هع ! و هذا فقط في مصلحتكم كي لا تحصلوا على الخبزة جاهزة إنما تتعبون من أجل تذوق طعمها !!