01
من 05
مقدمة في دروس برمجة الألعاب

هذا هو الأول من عدة ألعاب برمجة دروس في C للمبتدئين كاملة. بدلاً من التركيز على تدريس C ، ثم عرض أمثلة للبرامج ، يقومون بتدريس C من خلال تزويدك ببرامج كاملة (أي ألعاب) في C
الحفاظ عليها بسيطة
اللعبة الأولى في السلسلة هي وحدة تحكم (أي لعبة نصية تسمى Star Empires). Star Empires هي لعبة بسيطة حيث يجب عليك التقاط جميع الأنظمة العشرة في Galaxy أثناء إيقاف خصمك في الذكاء الاصطناعي.
يمكنك البدء في امتلاك نظام 0 ، بينما نظام عدوك الخاص 9. الأنظمة الثمانية الباقية (1-8) كلها تبدأ حيادية. تبدأ جميع الأنظمة في مربع 5 parsec x 5 parsec لذا لا يوجد نظام أكثر من 6 parsecs. أبعد نقطتين هما (0،0) و (4،4). بواسطة نظرية فيثاغورس ، أبعد مسافة عن أي نظامين هي الجذر التربيعي ((4)2 + (4)2) والذي هو الجذر التربيعي 32 وهو حوالي 5.657.
يرجى ملاحظة أن هذه ليست النسخة النهائية وسيتم تعديلها. التغيير الأخير: 21 أغسطس 2011.
بدوره وبناء في الوقت الحقيقي
تعتمد اللعبة على أساس كل دورة تقوم بإصدار أوامر بها لنقل أي عدد من الأساطيل من أي نظام تملكه إلى أي نظام آخر. إذا كنت تمتلك أكثر من نظام واحد ، يمكنك طلب الأساطيل للانتقال من جميع الأنظمة إلى النظام المستهدف. يتم ذلك بالتناوب التقريبي لذلك إذا كنت تملك ثلاثة أنظمة (1،2،3) مع 20 و 10 و 5 أساطيل موجودة وتطلب 10 أساطيل للذهاب إلى النظام 4 ثم 6 ينتقل من النظام 1 و 3 من النظام 2 و 1 من النظام 3. يتحرك كل أسطول بارسك واحد في كل دور.
يدوم كل منعطف 5 ثوانٍ على الرغم من أنه يمكنك تغيير السرعة لتسريعها أو إبطاءها عن طريق تغيير الـ 5 في هذا السطر من الكود إلى 3 أو 7 أو أي شيء تختاره. ابحث عن سطر التعليمات البرمجية هذا:
onesec = clock () + (5 * CLOCKS_PER_SEC) ؛
جيم برمجة تعليمي
تمت برمجة هذه اللعبة وتفترض أنك لا تعرف أي برمجة من لغة C. سأقدم ميزات البرمجة C في هذا البرنامج التعليمي التاليين أو الثلاثة مع تقدمهم. أولاً ، ستحتاج إلى مترجم لنظام Windows. إليك نوعان مجانيان:
- محاولة CC386
- أو مرئي C ++ 2010 Express
ترشدك المقالة CC386 إلى إنشاء مشروع. إذا قمت بتثبيت هذا المحول البرمجي ، فكل ما عليك فعله هو تحميل برنامج Hello World كما هو موصوف ، وانسخ الشفرة المصدرية والصقها في المثال ، واحفظه ، ثم اضغط على F7 لتجميعه وتشغيله. وبالمثل ، تنشئ مقالة Visual C ++ 2010 برنامجًا مرحباً بالعالم. الكتابة فوقه واضغط F7 لإنشاء Star Empires. ، F5 لتشغيله.
في الصفحة التالية - جعل نجمة إمبراطوريات العمل
02
من 05
جعل إمبراطوريات نجمة العمل
جعل إمبراطوريات نجمة العمل
نحن بحاجة إلى تخزين المعلومات على الأساطيل والأنظمة في اللعبة. الأسطول هو سفينة واحدة أو أكثر من أجل الانتقال من نظام إلى آخر. نظام النجوم هو عدد من الكواكب ولكنه أكثر من كيان مجردة في هذه اللعبة. نحتاج إلى الاحتفاظ بالمعلومات التالية للأسطول.
- نظام المنشأ (1-10).
- نظام الوجهة (1-10)
- كم عدد السفن (1-كثير)
- يتحول إلى الوصول
- من هو الأسطول؟ 0 = لاعب ، 9 = عدو
سوف نستخدم بنية في C للاحتفاظ بهذا:
أسطول هيكلي
int fromsystem؛
int إلى النظام ؛
يتحول int.
كثافة العمليات الصغيرة
مالك int؛
};
البنية عبارة عن مجموعة من البيانات ، في هذه الحالة 5 أرقام نتعامل معها كأرقام. كل رقم له اسم ، على سبيل المثال fromsystem ، tosystem. هذه الأسماء هي أسماء متغيرة في C ويمكن أن تحتوي على الشرطة السفلية like_this ولكنها ليست مسافات. في C ، الأرقام إما عدد صحيح. تسمى الأرقام الكاملة مثل 2 أو 7 بالأرقام ، أو الأرقام ذات الأجزاء العشرية مثل 2.5 أو 7.3333 وتسمى هذه الأعداد الطافية. في كل إمبراطوريات Star ، نستخدم العوامات مرة واحدة فقط. في جزء من التعليمات البرمجية حساب المسافة بين مكانين. كل رقم آخر هو كثافة العمليات.
الأسطول هو اسم بنية البيانات التي تحتوي على خمسة متغيرات int. الآن هذا لأسطول واحد. لا نعرف عدد الأساطيل التي سنحتاج إلى الاحتفاظ بها حتى نخصص مساحة كبيرة لـ 100 باستخدام صفيف. فكر في هيكل مثل طاولة العشاء مع مساحة لخمسة أشخاص (ints). مجموعة مثل صف طويل من طاولات العشاء. 100 طاولة تعني أنه يمكنها استيعاب 100 × 5 أشخاص.
إذا كنا نخدم فعلاً طاولات العشاء المائة هذه ، فسنحتاج إلى معرفة أي طاولة كانت وأيها نقوم بذلك عن طريق الترقيم. في C ، نقوم دائمًا بترقيم عناصر الصفائف بدءًا من 0. مائدة العشاء الأولى (الأسطول) هي الرقم 0 ، والطاولة التالية هي 1 والأخيرة 99. أتذكرها دائمًا كم عدد طاولات العشاء في هذه الطاولة منذ البداية؟ أول واحد هو في البداية لذلك هو 0 على طول.
هذه هي الطريقة التي نعلن بها الأساطيل (أي طاولات العشاء لدينا).
أساطيل البنية [100] ؛
اقرأ هذا من اليسار إلى اليمين. يشير أسطول الهيكل إلى هيكلنا لاستيعاب أسطول واحد. أساطيل الاسم هي الاسم الذي نطلقه على جميع الأساطيل ويخبرنا [100] بوجود أسطول هيكلي 100 × في متغير الأساطيل. يشغل كل int 4 مواقع في الذاكرة (تسمى البايتات) بحيث يشغل أسطول واحد 20 بايت و 100 أسطول هو 2000 بايت. من الجيد دائمًا معرفة مقدار الذاكرة التي يحتاجها برنامجنا للاحتفاظ ببياناته.
في أسطول البنية ، يحمل كل من الأعداد رقمًا صحيحًا. يتم تخزين هذا الرقم في 4 بايت ونطاق هذا هو من -2147483.647 إلى 2،147483.648. معظم الوقت سنستخدم قيمًا أصغر. هناك عشرة أنظمة لذلك سوف يحتفظ كل من fromsystem و tosystem بالقيم من 0 إلى 9.
في الصفحة التالية: الأنظمة والأرقام العشوائية
03
من 05
حول الأنظمة والأرقام العشوائية
يبدأ كل نظام محايد (1-8) بـ 15 سفينة (رقم اخترته من الهواء!) للبدء به بينما يحتوي النظامان الآخران (نظامك 0 ونظام خصم الكمبيوتر الخاص بك في نظام 9) على 50 سفينة لكل منهما. كل منعطف يتم زيادة عدد السفن في النظام بنسبة 10 ٪ تقريب إلى أسفل. لذا ، بعد منعطف واحد إذا لم تقم بنقلها ، سيصبح الـ 50 لديك 55 ويكون لكل نظام محايد 16 (تقريب 15 + 1.5 لأسفل). لاحظ أن الأساطيل التي تنتقل إلى نظام آخر لا تزيد في الأرقام.
قد تبدو زيادة عدد السفن بهذه الطريقة غريبة بعض الشيء ، لكنني فعلت ذلك للحفاظ على تقدم اللعبة. بدلاً من التبعثر في هذا البرنامج التعليمي مع الكثير من القرارات المتعلقة بالتصميم ، كتبت مقالًا منفصلاً حول قرارات تصميم Star Empires.
نظم التنفيذ
في البداية ، نحتاج إلى إنشاء جميع الأنظمة ووضعها على الخريطة ، مع وجود نظام واحد بحد أقصى كل موقع ، نظرًا لوجود 25 موقعًا على شبكتنا 5 × 5 ، سيكون لدينا عشرة أنظمة و 15 فارغة المواقع. نقوم بتوليدها باستخدام وظيفة GenMapSystems () التي سننظر إليها في الصفحة التالية.
يتم تخزين النظام في بنية ، مع الحقول الأربعة التالية التي جميعها int.
نظام هيكلي
int x، y؛
numfleets ؛
مالك int؛
};
يتم تخزين المجرة (جميع الأنظمة العشرة) في صفيف آخر تمامًا مثل الأساطيل باستثناء أن لدينا 10 أنظمة.
هيكل نظام المجرة [10] ؛
أرقام عشوائية
جميع الألعاب تحتاج إلى أرقام عشوائية. يحتوي C على دالة rand () مضمنة تقوم بإرجاع int عشوائي. يمكننا فرض هذا في نطاق من خلال تمرير العدد الأقصى في واستخدام عامل التشغيل ٪. (معام). هذا يشبه رياضيات الساعة باستثناء بدلاً من 12 أو 24 نمرر في عدد int يسمى الحد الأقصى.
/ * بإرجاع رقم بين 1 و كحد أقصى * /
int Random (int max) {
return (rand ()٪ max) +1؛
}
هذا مثال على وظيفة عبارة عن قطعة من الشفرة ملفوفة داخل حاوية. السطر الأول هنا الذي يبدأ / * و end * / هو تعليق. تقول ما يفعله الكود ولكن يتم تجاهله من قبل المترجم الذي يقرأ تعليمات C ويحولها إلى إرشادات يفهمها الكمبيوتر ويمكن تنفيذها بسرعة كبيرة.
- أتساءل ما هو مترجم؟ اقرأ ما هو المترجم؟ (مقالة - سلعة)
الوظيفة تشبه الوظيفة الرياضية مثل Sin (x). هناك ثلاثة أجزاء لهذه الوظيفة:
الباحث العشوائي (الباحث بحد أقصى)
يوضح int نوع العدد الذي يتم إرجاعه (عادةً int أو تعويم). عشوائي هو اسم الوظيفة ويقول (int max) إننا نمرر عدد int. قد نستخدمها مثل هذا:
النرد كثافة العمليات ؛
النرد = عشوائي (6) ؛ / * بإرجاع رقم عشوائي بين 1 و 6 * /
الخط:
return (rand ()٪ max) +1؛
في الصفحة التالية: توليد خريطة بداية عشوائية
04
من 05
توليد خريطة بداية عشوائية

هذا الكود أدناه يولد خريطة البداية. هذا كل ما هو مبين أعلاه.
باطل GenMapSystems () {
int i، x، y؛
لـ (x = 0 ؛ x لـ (y = 0 ؛ تخطيط y [x] [y] = ''؛
}
InitSystem (0،0،0،50،0) ؛
نظام البداية (9،4،4،50،1) ؛
/ * العثور على مساحة فارغة للأنظمة 8 المتبقية * /
ل (أنا = 1 ؛ أفعل {
س = عشوائي (5) -1 ؛
ص = عشوائي (5) -1 ؛
}
بينما (تخطيط [س] [ص]! = '') ؛
InitSystem (i، x، y، 15، -1)؛
}
}
توليد الأنظمة هو مسألة إضافة اللاعب وأنظمة الخصم (عند 0،0) و (4،4) ثم إضافة 8 أنظمة بشكل عشوائي في 23 موقعًا فارغًا.
يستخدم الكود ثلاثة متغيرات int محددة بواسطة السطر
int i، x، y؛
المتغير هو موقع في الذاكرة يحمل قيمة int. تحمل المتغيرات x و y إحداثيات الأنظمة وستحتفظ بقيمة في المدى من 0 إلى 4. يتم استخدام المتغير i لحساب في حلقات.
لوضع 8 أنظمة عشوائية في شبكة 5 × 5 ، نحتاج إلى معرفة ما إذا كان الموقع يحتوي على نظام بالفعل ومنع وضع نظام آخر في نفس الموقع. لهذا نستخدم مجموعة بسيطة ثنائية الأبعاد من الشخصيات. النوع char هو نوع آخر من المتغيرات في C ويحمل حرفًا واحدًا مثل "B" أو "x".
التمهيدي على أنواع البيانات في C
النوع الأساسي من المتغيرات في C هي int (أعداد صحيحة مثل 46) ، char (حرف واحد مثل "A") ، وتطفو (لعقد الأرقام بنقطة عائمة مثل 3.567). المصفوفات [] مخصصة لعقد قوائم من نفس العنصر. لذا شار [5] [5] تحدد قائمة بالقوائم ؛ مجموعة ثنائية الأبعاد من الأحرف. فكر في الأمر مثل 25 قطعة خربشة مرتبة في شبكة 5 × 5.
الآن نحن حلقة!
يتم تعيين كل حرف مبدئيًا على مساحة في حلقة مزدوجة باستخدام اثنين للبيانات. للبيان ثلاثة أجزاء. التهيئة وجزء المقارنة وجزء التغيير.
لـ (x = 0 ؛ x لـ (y = 0 ؛ تخطيط y [x] [y] = ''؛
}
- س = 0 ؛ هذا هو الجزء التهيئة.
- س
- س ++. هذا هو الجزء التغيير. ويضيف 1 إلى س.
لذلك (لـ (س = 0 ؛ س
داخل for (حلقة x هي حلقة لـ y تفعل نفس الشيء بالنسبة لـ y. تحدث حلقة y لكل قيمة X. عندما X هي 0 ، سوف Y حلقة من 0 إلى 4 ، عندما X هي 1 ، Y سوف حلقة وهلم جرا. هذا يعني أنه تتم تهيئة كل موقع من المواقع الـ 25 في صفيف التخطيط إلى مساحة.
بعد حلقة for يتم استدعاء الدالة InitSystem بخمس معلمات int. يجب تعريف الوظيفة قبل أن يتم استدعاؤها أو لن يعرف المترجم عدد المعلمات التي يجب أن يحتوي عليها. لدى InitSystem هذه المعلمات الخمسة.
في الصفحة التالية: جارٍ إنشاء خريطة بدء عشوائية ...
05
من 05
توليد خريطة بداية عشوائية يستمر
هذه هي المعلمات إلى InitSystem.
- systemindex - قيمة من 0 إلى 9.
- x و y - إحداثيات النظام (0-4).
- numships - كم عدد السفن الموجودة في هذا النظام.
- صاحب. من يملك النظام. 0 تعني اللاعب ، 9 تعني العدو.
لذلك يقوم خط InitSystem (0،0،0،50،0) بتهيئة النظام 0 في المواقع x = -0 ، y = 0 مع 50 سفينة إلى المالك 0.
يحتوي C على ثلاثة أنواع من الحلقات أثناء الحلقات للحلقات والقيام بحلقات ونستخدمها في GenMapSystems ونفعلها في الوظيفة. هنا يجب أن نضع الأنظمة الثمانية المتبقية في مكان ما في المجرة.
ل (أنا = 1 ؛ أفعل {
س = عشوائي (5) -1 ؛
ص = عشوائي (5) -1 ؛
}
بينما (تخطيط [س] [ص]! = '') ؛
InitSystem (i، x، y، 15،0)؛
}
هناك حلقتان متداخلتان في هذا الرمز. الحلقة الخارجية عبارة عن عبارة تقوم بحساب المتغير i من قيمة أولية قدرها 1 إلى قيمة نهائية قدرها 8. سنستخدم i للإشارة إلى النظام. تذكر أننا قمنا بالفعل بتهيئة النظامين 0 و 9 ، لذلك نحن الآن بصدد تهيئة الأنظمة 1-8.
كل شيء من القيام {إلى الوقت (التخطيط [س] [ص] هو الحلقة الثانية. بناء الجملة هو {شيء} بينما (الشرط صحيح) ؛ لذلك نقوم بتعيين قيم عشوائية إلى x و y ، كل قيمة في النطاق 0-4. تقوم دالة Random (5) بإرجاع قيمة في النطاق من 1 إلى 5 ، أما طرح 1 فيحصل على المدى من 0 إلى 4.
لا نريد وضع نظامين في نفس الإحداثيات ، لذلك تبحث هذه الحلقة عن موقع عشوائي به مساحة فيه. إذا كان هناك نظام هناك ، فلن يكون التخطيط [س] [ص] مسافة. عندما نسمي InitSystem فإنه يضع قيمة مختلفة هناك. راجع للشغل! = يعني لا يساوي و == يعني مساو لـ.
عندما تصل الشفرة إلى نظام InitSystem بعد حين (التخطيط [x] [y]! = '') ، تشير x و y بالتأكيد إلى مكان في التخطيط يحتوي على مساحة فيه. لذلك يمكننا الاتصال بـ InitSystem ومن ثم الانتقال إلى حلقة لإيجاد موقع عشوائي للنظام التالي حتى يتم وضع جميع الأنظمة الثمانية.
تقوم المكالمة الأولى لنظام InitSystem بإعداد النظام 0 في الموقع 0 (أعلى يسار الشبكة) بـ 50 أسطول وفزت به. تبدأ المكالمة الثانية النظام 9 في الموقع 4،4 (أسفل اليمين) مع 50 أسطولًا ويملكها اللاعب 1. سننظر عن كثب في ما يفعله نظام InitSystem فعليًا في البرنامج التعليمي التالي.
#حدد
هذه الخطوط تعلن القيم الحرفية. من المعتاد أن نضعها في الحالة العليا. في كل مكان يرى المحول البرمجي MAXFLEETS ، فإنه يستخدم القيمة 100. تغييرها هنا وينطبق في كل مكان:
- # تعريف العرض 80
- # تحديد الارتفاع 50
- #define MAXLEN 4
- #define MAXFLEETS 100
- #define MAXSYSTEMS 10
- #define FIGHTMARKER 999
استنتاج
في هذا البرنامج التعليمي ، قمنا بتغطية المتغيرات واستخدام int و char و struct لتجميعها بالإضافة إلى صفيف لإنشاء قائمة. ثم حلقات بسيطة باستخدام والقيام به. إذا قمت بفحص الكود المصدري ، فسيتم عرض نفس الهياكل مرة تلو الأخرى.
- ل (أنا = 0 ؛ أنا
- ل (أنا = 0 ؛ أنا
البرنامج التعليمي Twowill ننظر إلى جوانب C المذكورة في هذا البرنامج التعليمي.