لماذا أكتب ألعابًا بلغة C (نعم ، في C). مصادر اللعبة (240) كيف تكتب الألعاب بلغة سي

سؤال: ما الذي تنصح به لإنشاء ألعاب من الصفر؟


وقت جيد. مستوحاة مؤخرًا من ألعاب مثل Papers و Please و Hotline Miami. لدي فكرتي الخاصة للعبة. لكن الأمر هو أنني لا أعرف كيف أكتب. تم تصميم اللعبة بمنظر علوي ، وليس ثلاثي الأبعاد ، للكمبيوتر الشخصي. في العمل ، أكتب في 1C ، ولكن ليس للألعاب ، على الرغم من أنك إذا حاولت بجد ، يمكنك ذلك ، لقد درست أيضًا أساسيات Java. أفهم أنه من الأفضل تجربة شيء بسيط أولاً ، مثل tic-tac-toe أو snake ، للحصول على الأساسيات.
على الإنترنت ، يقترحون استخدام C ++ ، لكنهم يقترحون أيضًا استخدام C # + XNA. من لديه خبرة في إنشاء الألعاب أو تقديم المشورة الأدبية أو إعطاء بعض النصائح حول برمجة الألعاب من البداية.

إجابة:

رسالة من مونتيكريستو

نصح الأدب

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

يمكنك البحث عن كتب حول إنشاء الألعاب بلغات وتقنيات مختلفة هنا:

ولكن لا تبدأ بأي حال من الأحوال بالكتب من الفئات: التقدم والإتقان

ما القسم يعني أنه يمكنك معرفة ما إذا قمت بالنقر فوق "i". يمكنك أيضًا تنزيل أمثلة مجانًا بعد التسجيل. عرضته في الصورة:

سؤال: ابتكار لعبة بلغة سي؟

إجابة: يضاف بعد 30 دقيقة

رسالة من هاي بريداتور

بشكل عام ، يمكن كتابة كل شيء بلغة C. ستكون هناك رغبة وعقول ووقت.

هناك رغبة ، لا عقل ، سأبحث عن الوقت>< Благодарю!

رسالة من ماكفير

يمكنك أيضًا البدء في تعلم Opengl بنفسك بدون محرك ، وإنشاء زوج من Tetris ، وستفهم ما هو.

أشعر أنني سأضطر إلى كتابة المحرك بنفسي

رسالة من ماكفير

7. ليس واضحا تماما ، من المفترض قطع جزء من الصورة ووضعه على مكعب؟

نعم ، ارسم الكائن وزخرفته بتراكب الصورة.

رسالة من سايبر ساتير

GTK ، على سبيل المثال ، متقاطع. وهكذا ، بالنسبة لنظام التشغيل Windows ، استخدم Winapi ، فهناك واجهة زرقاء خالصة.

شكرًا لك! هذا ما قصدته

رسالة من ماكفير

8. يعتمد المزيد على اللعبة والأهداف وأسلوب البرمجة ، يجب أخذ كل شيء في الاعتبار ، إذا كنت تأخذ نفس المشروع في C و Sharp ، فبالطبع C ستستفيد كثيرًا ، ولكن في Sharp ، ستزداد سرعة التطوير بنسبة 2/3 في رأيي.

سيكون الاختيار الجيد هو الجمع بينهما. اكتب الأساس في Sharpe ، وقم بتحريف الميزات في C؟)

السؤال: إنشاء لعبة MMORPG


مرحبًا. لقد قمت مؤخرًا بإنشاء موضوع هنا ، حيث تعلمت عن إنشاء لعبة ثنائية الأبعاد.
ومع ذلك ، قررت معرفة الاتجاه الذي يجب أن أدرس فيه.
هنا 2 لقطة شاشة:
http://kape.cc/uploads/posts/2011-05...a630f08343.jpg
http://mmohuts.com/wp-content/galler..._07.jpg؟bb7a3b
والفيديو:

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

إجابة: 8Observer8، لم أحب الفيزياء أبدًا ، حتى أدركت أنها ضرورية جدًا ... ولكن الآن ، أدركت أن Box2D ليس ضروريًا بالتأكيد للعبتي المقصودة ... نظرت إلى توثيق SFML ، بعد ، اليوم ، قمت بنكز التطوير السابق وتمكنت من التفاعل مع الجدران ، وكم كانت السعادة موجودة)) استغرق الأمر حوالي ساعة إلى ساعتين لمعرفة كيفية القيام بذلك ، لكن الأمر يستحق ذلك.
بالمناسبة ، أريد أن أحاول أن أجعل المستوى الأول على الأقل من بومبرمان)

يضاف بعد 10 دقائق
ملاحظة. أنا أتعلم c ++ في نفس الوقت

سؤال: أوصي بالأدب حول تطوير اللعبة من البداية إلى النهاية


أوصي بالأدب حول تطوير اللعبة من البداية إلى النهاية. مع كل العناصر ، يمكنك في C ++. فقط كتاب جديد لدار النشر 2010-2015

إجابة:ما الذي ستستخدمه للرسم: DirectX أو OpenGL؟ بحثت هناك كتب عامة عن نظرية اللعبة ->. ما نوع خطة اللعبة التي ستكتبها: 2D ، 3D ، RPG ، الرماة ، السباق ، الشطرنج ، انطلق؟ كل هذه الألعاب لها مواصفات مختلفة.

الموضوع: صنع لعبة


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

إجابة:

السيد ديمتري,
لعبة ثابتة؟ هذا شيء جديد في برنامج البناء.
إذا كان الأمر كذلك بالفعل ، فإن TImage كافٍ لك.
وإذا كانت لا تزال لعبة ديناميكية ، فأنت بحاجة إلى TPaintBox.

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

في Windows 7 ، انقر فوق ابدأ | كل البرامج | Embarcadero RAD Studio XE5 | عينات.

لدي هذا المجلد
C: \ Users \ Public \ Documents \ RAD Studio \ 12.0 \ Samples \

بالنسبة للمكونات والمحركات.
نسيان المكونات. لا يوجد عنصر يجعل اللعبة مناسبة لك. اللعبة مكتوبة باليد والرأس.

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

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

لم تقل لعبة ثنائية أو ثلاثية الأبعاد.
عدم وجود دعم للعفاريت واللوحات الإعلانية. إخراج النص.

تمت الإضافة بعد 14 دقيقة و 34 ثانية
أعتقد أنك ستكون مهتمًا. هناك موقع يزوره إنشاء الألعاب.

هنا يمكنك إلقاء نظرة سريعة واستعارة أفكار اللعبة والأفكار للتنفيذ.

سؤال: إنشاء لغتك الخاصة في Visual Studio


أنا أبحث عن أمثلة / برامج تعليمية واضحة خطوة بخطوة حول إنشاء لغتي الخاصة في Visual Studio.

لقد وجدت مثالًا للغة ، لكني بحاجة إلى فهم ماذا وكيف ولماذا. اسمي يبدو قليلا مثل طيب.

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

متطلبات:
محرر - VS نفسها (2013) ؛
رمز المجمع Z80 على الشاشة ، بدون وحدات إضافية ؛
اختيار اللغة عند إنشاء مشروع (حيث تكون قائمة اللغات هي C # و F # و VB.NET وغيرها).

إجابة:ولكن كيف "تخبر" الاستوديو 2013 أنه يسلط الضوء ويطالب؟

سؤال: إنشاء لعبة على محرك C ++


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

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


كطالب جديد ، قررت ، كجزء من دراسة قدرات وحدة التحكم الأساسية في C / C ++ ، أنه من الممكن برمجة لعبة ASCII "كلاسيكية" تتطلب من اللاعب التفكير بسرعة ، والتفاعل المستمر مع اللعبة ، ويحتوي أيضًا على جزء رسومي بسيط يمكن للاعب تفسيره إلى نوع من الصور ثلاثية الأبعاد.


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

إلهام

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


كانت Space Impact أساس لعبتي الأولى نظرًا لسهولة لعبها وشعبيتها في أوائل العقد الأول من القرن الحادي والعشرين.

ميزات "Space Invader"

بادئ ذي بدء - خفة البرنامج. حجم الملف القابل للتنفيذ أقل من 100 كيلو بايت وسيعمل على النحو المنشود تقريبًا على أي جهاز كمبيوتر يقوم بتشغيل OC Windows مع حزمة Visual C ++.


ثانيًا ، قابلية النقل - يمكن تحويل الكود المصدري إلى أنظمة POSIX في بضع دقائق ، وبالتالي ضمان قابلية التشغيل على أنظمة تشغيل UNIX و Mac ، فقط عن طريق استبدال بعض الوظائف وإعادة بناء البرنامج على المترجم المناسب.


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


أبسط واجهة سهلة الاستخدام لا تتطلب وصفًا أو تعليمات للاستخدام.


  • العنصر الفرعي "لعبة جديدة" - تبدأ جلسة لعبة جديدة.
  • العنصر الفرعي "متابعة" - يقوم بتحميل آخر لعبة محفوظة من الملف الثنائي في دليل الملف القابل للتنفيذ ويبدأ جلسة اللعبة باستخدام البيانات المستلمة.
  • بند "المساعدة" - تعليمات للعمل مع التطبيق ووصفه. قم بالتمرير عن طريق الضغط على الأسهم الموجودة على لوحة المفاتيح.
  • عنصر "Hall of Fame" - قائمة بقادة جلسات اللعب ، يتم تحميلها من ملف ثنائي في دليل الملف القابل للتنفيذ وإخراج منسق إلى وحدة التحكم.
  • عنصر "خروج" - الخروج من التطبيق.
  • التحول إلى "العالم" الأيسر بسرعة ديناميكية. يحتوي "العالم" على حقول عشوائية في الأعلى والأسفل بسماكة 1 أو 2 حرف. أيضًا بين الحقول يظهر بشكل عشوائي "حطام فضائي" ، معروضًا بالرمز "" ، وهو عقبة أمام اللاعب.
  • الضغط على الحافة اليسرى من نافذة "سفينة الفضاء". يتم تحريك السفينة باستخدام الأسهم الموجودة على لوحة المفاتيح لأعلى ولأسفل ، بالضغط على شريط المسافة ، تطلق قذيفة تقضي على "الحطام الفضائي" عند اللمس.
  • "لوحة القيادة" في الجزء العلوي من وحدة التحكم ، تعرض المسافة المقطوعة والسرعة الحالية وعدد المحاولات المتبقية.
  • كيف يعمل Space Invader؟

    عند بدء تشغيل التطبيق ، تظهر شاشة متحركة لشاشة البداية. وهو يتألف من 6 مصفوفات أحرف مسبقة التنسيق ، يتم تدويرها كل 200 مللي ثانية.


    بدء شاشة التوقف - الشريحة النهائية


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


    باطل StartMenu (مفتاح التحويل) (النظام ("cls") ؛ مفتاح التبديل (الجلاد) (الحالة 1: cout<< "\n\n\n << ИГРАТЬ! >> << "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >> "؛ break؛) int choice = _getch () ؛ إذا (اختيار == ​​224) اختيار = _getch () ؛ إذا كان (خيار == ​​72) إذا (switcher! = 1) StartMenu (switcher - 1) ؛ وإلا StartMenu ( 4) ؛ إذا (الاختيار == ​​80) إذا (الجلاد! = 4) StartMenu (الجلاد + 1) ؛ وإلا StartMenu (1) ؛ إذا (الاختيار == ​​13 || الاختيار == ​​32) (إذا (الجلاد == 1 ) GameMenu (1) ؛ إذا (الجلاد == 2) المساعدة (0) ؛ إذا (الجلاد == 3) TopChart () ؛ إذا (الجلاد == 4) _exit (0) ؛))


    القائمة الرئيسية (تم إدخال الوظيفة بالمعامل 1)


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


    void GameMenu (int switcher) (system ("cls") ؛ if (switcher == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >> << "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >> "؛ int choice = _getch () ؛ if (choice == 224) option = _getch () ؛ if (choice == 72 || Choice == 80) GameMenu (3 - switcher) ؛ if (choice == 27) StartMenu (1) ؛ إذا (الاختيار == ​​13 || الاختيار == ​​32) اللعبة (الجلاد) ؛)


    قائمة إضافية (تم إدخال الوظيفة مع المعلمة 1)


    الآن إلى الرئيسي - عملية اللعبة. عند تحديد العنصر الفرعي "لعبة جديدة" ، يتم بدء جلسة لعبة جديدة. يتم إنشاء صفيف ثنائي الأبعاد ، بأبعاد 14 صفًا في 50 عمودًا. يتم تخصيص السطر الأول تحت لوحة القيادة. الجهاز الأول هو عدد الكيلومترات المقطوعة ، وهو يساوي عدد تحديثات وحدة التحكم (مبدئيًا ، يتم تحديث وحدة التحكم كل 80 مللي ثانية ، مع كل تحديث تتناقص هذه المعلمة حتى تصل إلى قيمة 25).


    int odometerBuf = عداد المسافات ، عداد المسافاتالرقم الرقمي ؛ لـ (odometerDigitLength = 0 ؛ عداد المسافات Buf! = 0 ؛ عداد المسافة / = 10 ، عداد المسافات + الطول ++) ؛ // حساب عدد الأرقام على عداد المسافات لـ (int i = odometerDigitLength ، عداد المسافات Buf = عداد المسافات ؛ i> = 0 ؛ i-- ، scr [i] = عداد المسافة Buf٪ 10 + "0" ، عداد المسافات Buf / = 10) ؛ // رسم عداد المسافات على لوحة القيادة scr = "K" ؛ scr = "M" ؛ // إضافة عداد المسافات "KM" ++ ؛ // زيادة عداد المسافات

    المقياس الثاني ، السرعة الحالية ، هو الصيغة - معدل تحديث 1000 / وحدة التحكم. السرعة تقاس بالكيلومترات في الثانية. وهكذا ، تتحرك السفينة مبدئيًا بسرعة 12 كم / ث ، وبعد فترة تصل إلى علامة 40 كم / ث.


    السرعة = 1000 / مؤقت ؛ // تحديث عداد السرعة int speedBuf = السرعة ؛ لـ (int i = 42 ؛ speed! = 0 ؛ i-- ، scr [i] = السرعة٪ 10 + "0" ، السرعة / = 10) ؛ // رسم عداد السرعة على لوحة القيادة scr = "К" ؛ scr = "M" ؛ scr = "/" ؛ scr = "С" ؛ // إضافة "КМ / С"

    يعرض الجهاز الثالث عدد المحاولات المتبقية ، في البداية هناك 3. المحاولات يشار إليها بالرمز "&".


    لـ (int i = 50؛ lifes> 0؛ i--، lifes--، scr [i] = "&")؛


    لوحة القيادة في بداية جلسة اللعبة


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


    char borderSymbols = ("†"، "‡"، "¤"، "")؛ لـ (int aboveBelow = 0؛ aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; }


    لوحة القيادة والحقول في بداية جلسة اللعبة


    في الخط المركزي لمساحة اللعبة ، عند الضغط على الحافة اليسرى ، يتم رسم سفينة الفضاء ، والتي سيتعين على اللاعب التحكم فيها.


    scr = "\\" ؛ scr = "\\" ؛ // رسم السفينة scr = "3" ؛ scr = "=" ؛ scr = "=" ؛ scr = "/" ؛ scr = "/" ؛

    يمكنك التحكم فيه باستخدام السهمين لأعلى ولأسفل.


    if (_kbhit ()) // إذا تم الضغط على المفتاح (control = _getch () ؛ // سيأخذ المتغير قيمته إذا (control == 224) control = _getch () ؛) if (control == 72) / / أثناء التحرك لأعلى إذا (scr == "\\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤") // إذا تحطمت السفينة في الحقل العلوي - انتهت اللعبة إذا (تفسخ> 1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) (خارج<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i > < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; }


    موقف السفينة عند الضغط مرتين على السهم لأعلى


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


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


    لـ (int i = 1 ؛ i< 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) (خارج<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j > < 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; }

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



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


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


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


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



    مطالبة اللاعب بإدخال اسم لحفظ درجاته في "صالة الشهرة"


    يعالج التطبيق ملفين:

    • "TopChart.bin" هو ملف ثنائي لتخزين لوحة الصدارة. يتم تخزين البيانات في الهياكل (كنية اللاعب ، حسابه ، تاريخ انتهاء جلسة اللعبة). تتم إضافة البيانات إلى نهاية الملف عند انتهاء اللعبة. عند استدعاء عنصر "Hall of Fame" ، يتم فتح الملف للقراءة مع إمكانية التحرير. بعد ذلك ، يتم الإعلان عن مصفوفة ديناميكية من الهياكل ، يتم فيها كتابة البيانات من الملف ، وبعد ذلك يتم فرز المصفوفة وتنسيق إخراجها إلى وحدة التحكم (الحد الأقصى لعدد النتائج الممكنة هو 12 ، إذا كانت المصفوفة تحتوي على 13 نتيجة ، فإن يتم التخلص من الأخير بعد الفرز). بعد ذلك ، يتم الكتابة فوق الملف بمجموعة من هياكل النتائج ، وبعد ذلك يتم إتلاف المصفوفة.
    • "CurrentSave.bin" هو ملف ثنائي لتخزين الألعاب المحفوظة. تمت دعوتك للقراءة عند بدء تشغيل العنصر الفرعي "متابعة" الخاص بالعنصر "اللعبة". قد يحتوي على بيانات لاستعادة جلسة لعبة واحدة غير مكتملة: رقم الخط الذي يحتوي على قوس السفينة ، وعدد الكيلومترات المقطوعة ، وعدد المحاولات المتبقية ، وموقع الكائنات على الشاشة. بمساعدة هذه البيانات ، يتم تشكيل جلسة لعبة تكرر تمامًا الجلسة غير المكتملة. لتجنب الغش ، عند تحميل جلسة من ملف ، يتم حذف الملف. عندما تضغط على Escape أثناء اللعبة ، يتم إنشاء هذا الملف وكتابة جميع البيانات الضرورية إليه لاستمرار جلسة اللعبة بنجاح.

    عنصر القائمة الرئيسي "Help" هو وظيفة تأخذ معلمة من 0 إلى 22 وتعرض 12 سطرًا من 50 حرفًا لكل منها من معلمة الإدخال. يتم التحكم بشكل متكرر باستخدام السهمين لأعلى ولأسفل.


    void Help (int switcher) (system ("cls") ؛ cout<< "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение нажатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher > < 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); }

    عنصر القائمة الرئيسية "خروج" - يخرج من التطبيق.


    دليل المستخدم

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


    السفينة مجهزة بالتحكم الديناميكي. كلما طارت بشكل أسرع ، استدارت السفينة بشكل أكثر حدة. تتسارع السفينة تلقائيًا بشكل تدريجي إلى 40 كم / ثانية.


    يمكنك إسقاط الحطام الفضائي بمساعدة البندقية المغناطيسية المدمجة في السفينة ، وكذلك الحواجز الجانبية.
    عند قيادة السفينة ، تعرض لوحة العدادات المسافة المقطوعة والسرعة الحالية وعدد "خلايا التراجع" المتبقية (يتم عرضها بواسطة الرمز "&") ، في البداية هناك 3 منها.


    إذا قررت التوقف عن اللعب ، فقط اضغط على ESCAPE. سيتم حفظ اللعبة ويمكنك متابعتها حتى بعد إعادة تشغيل التطبيق باستخدام عنصر "متابعة!".


    في القائمة الرئيسية يمكنك رؤية جدول الطيارين الفخريين. احصل على حقك في أن تكون هناك!

    حصيلة

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


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


    مصدر

    # تضمين "conio.h" # تضمين "windows.h" # تضمين "ctime" # تضمين استخدام اسم للمحطة؛ لاعب الهيكل // تحديد هيكل يخزن البيانات حول نتائج أي جلسة لعبة مكتملة (اسم شار ؛ درجة int ؛ int mday ؛ int mon ؛ int year ؛) ؛ هيكل حفظ // تحديد هيكل يخزن البيانات حول جلسة لعبة غير مكتملة (int weaponPos؛ int timer؛ int عداد المسافات؛ int lifes؛ char scr؛)؛ void ScreenOutput (char scr) // دالة إخراج مصفوفة عنصر تلو عنصر إلى وحدة التحكم (النظام ("cls") ؛ لـ (int i = 0 ؛ i< 14; i++) { for (int j = 0; j < 50; j++) cout << scr[i][j]; if (i != 13) cout << endl; } } //блок прототипов функций void StartMenu(int switcher);//функция, вызывающаяся из главного меню, содержит пункты "ИГРА" и "ПРОДОЛЖИТЬ" void GameMenu(int switcher);//функция главного меню void GameStart(char scr, int lifes, int *timer);//функция, определяющая начальный символьный массив при запуске нового игрового сеанса void Game(int var);//функция игровго сеанса void GameOver(int score);//функция, спрашивающая имя игрока, и записывающая его результат в бинарный файл void Help(int switcher);//функция помощи игроку void TopChart();//функция "ЗАЛ СЛАВЫ" - отображает список лидеров void Help(int switcher) { system("cls"); cout << "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение надатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher >0) مساعدة (الجلاد - 1) ؛ مساعدة أخرى (0) ؛ إذا (تحكم == 80) // إذا كان السهم لأسفل إذا (الجلاد< 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); } void StartMenu(int switcher) { system("cls"); switch (switcher) { case 1: cout << "\n\n\n << ИГРАТЬ! >> \ n \ n مساعدة! \ n \ n قاعة المشاهير \ n \ n الخروج "؛ كسر ؛ الحالة 2: cout<< "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >> \ n \ n HALL OF FAME \ n \ n EXIT "؛ كسر ؛ الحالة 3: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >> \ n \ n EXIT "؛ كسر ؛ الحالة 4: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >> "؛ break؛) int choice = _getch ()؛ if (choice == 224) خيار = _getch () ؛ إذا كان (خيار == ​​72) إذا (switcher! = 1) StartMenu (switcher - 1) ؛ وإلا StartMenu ( 4) ؛ إذا (الاختيار == ​​80) إذا (الجلاد! = 4) StartMenu (الجلاد + 1) ؛ وإلا StartMenu (1) ؛ إذا (الاختيار == ​​13 || الاختيار == ​​32) (إذا (الجلاد == 1 ) GameMenu (1) ؛ إذا (الجلاد == 2) المساعدة (0) ؛ إذا (الجلاد == 3) TopChart () ؛ إذا (الجلاد == 4) _exit (0) ؛)) باطل GameMenu (مفتاح التحويل) ( نظام ("cls") ؛ إذا (الجلاد == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >> \ n \ n تابع! "؛ آخر cout<< "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >> "؛ int choice = _getch () ؛ if (choice == 224) option = _getch () ؛ if (choice == 72 || Choice == 80) GameMenu (3 - switcher) ؛ if (choice == 27) StartMenu (1) ؛ إذا (الاختيار == ​​13 || الاختيار == ​​32) اللعبة (الجلاد) ؛) باطل GameStart (char scr، int lifes، int * timer) (for (int i = 0؛ i< 14; i++)//очищение от мусора for (int j = 0; j < 50; j++) scr[i][j] = " "; for (int i = 50; lifes >0 ؛ i--، lifes--، scr [i] = "&")؛ * عداد الوقت = 80 ؛ char borderSymbols = ("†"، "‡"، "¤"، "")؛ لـ (int aboveBelow = 0؛ aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; } scr = "\\"; scr = "\\";//прорисовка корабля scr = "3"; scr = "="; scr = "="; scr = "/"; scr = "/"; } void GameOver(int score) { system("cls"); player newPlayer;//объявляние структуры newPlayer.score = score;//инициализацие поля набранного счета cout << "Поздравляем Вас!\nВы продержались " << score << " километров.\n\n(Пожалуйста, не используйте кириллические символы)\n(Используйте не более 6 символов)\nОставьте свое имя и станьте примером\nдля подражания будущим игрокам: "; cin.getline(newPlayer.name, 7);//инициализацие поля имени time_t timeCur; time(&timeCur); struct tm * timeCurStruct = localtime(&timeCur); newPlayer.mday = timeCurStruct->tm_mday؛ // تهيئة تاريخ انتهاء اللعبة newPlayer.mon = timeCurStruct-> tm_mon ؛ newPlayer.year = timeCurStruct-> tm_year ؛ FILE * topchart ؛ fopen_s (& topChart، "TopChart.bin"، "ab +") ؛ fwrite (& newPlayer، 1، sizeof (player)، topChart) ؛ // إضافة النتيجة إلى الملف fclose (topChart) ؛ topchart () ؛ ) باطل TopChart () (FILE * topChart؛ fopen_s (& topChart، "TopChart.bin"، "rb +")؛ system ("cls")؛ if (topChart == NULL) // إذا حدث خطأ أثناء فتح الملف ( نظام ("cls") ؛ خارج<< "Нет ни единого результата."; Sleep(1000); system("cls"); cout << "Нет ни единого результата.."; Sleep(1000); system("cls"); cout << "Нет ни единого результата..."; Sleep(1000); cout << "\nНажмите любую клавишу, чтобы вернуться."; _getch(); StartMenu(3); } fseek(topChart, 0L, SEEK_END); int playerAmount = ftell(topChart) / sizeof(player); player *temp = new player; fseek(topChart, 0L, SEEK_SET); for (int i = 0; i < playerAmount; i++)//копирование содержиомого файла в структкры fread(&temp[i], 1, sizeof(player), topChart); fclose(topChart); for (int i = 1; i < playerAmount; i++)//сортировка структур по спаданию итоговых счетов if (temp[i].score >temp.score) (لاعب tempAlone ؛ strcpy (tempAlone.name ، temp [i] .name) ؛ tempAlone.score = temp [i] .score ؛ tempAlone.mday = temp [i] .mday ؛ tempAlone.mon = temp [ i] .mon؛ tempAlone.year = temp [i] .year؛ strcpy (temp [i] .name، temp.name) ؛ temp [i] .score = temp.score ؛ temp [i] .mday = temp. mday ؛ temp [i] .mon = temp.mon ؛ temp [i] .year = temp.year ؛ strcpy (temp.name ، tempAlone.name) ؛ temp.score = tempAlone.score ؛ temp.mday = tempAlone.mday ؛ temp.mon = tempAlone.mon ؛ temp.year = tempAlone.year ؛ if (i> 1) i - = 2 ؛ وإلا i = 0 ؛) if (playerAmount> 12) playerAmount = 12 ؛ كوت<< "№ " << "Имя" << "\t" << "Счет" << "\t" << "Дата" << endl;//вывод таблицы лидеров в консоль for (int i = 0; i < playerAmount; i++) { cout << i + 1 << ")" << "\t" << temp[i].name << "\t" << temp[i].score << "\t"; if (temp[i].mday / 10 == 0) cout << "0" << temp[i].mday; else cout << temp[i].mday; cout << " "; switch (temp[i].mon) { case 0: cout << "января"; break; case 1: cout << "февраля"; break; case 2: cout << "марта"; break; case 3: cout << "апреля"; break; case 4: cout << "мая"; break; case 5: cout << "июня"; break; case 6: cout << "июля"; break; case 7: cout << "августа"; break; case 8: cout << "сентября"; break; case 9: cout << "октября"; break; case 10: cout << "ноября"; break; case 11: cout << "декабря"; break; } cout << " " << 1900 + temp[i].year << endl; } fopen_s(&topChart, "TopChart.bin", "wb+"); for (int i = 0; i < playerAmount; i++)//запись таблицы лидеров в бинарный файл fwrite(&temp[i], 1, sizeof(player), topChart); fclose(topChart); delete temp; _getch(); StartMenu(3); } int main() { setlocale(LC_ALL, "Rus");//задание кодировки system("mode con cols=51 lines=14");//задание размеров окна консоли system("title Space Invader");//задание описания окна консоли system("color 0A");//задание цвета консоли (0-задний фон; А-передний фон) HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);//получение хендла CONSOLE_CURSOR_INFO cursor = { 100, false };//число от 1 до 100 размер курсора в процентах; false\true - видимость SetConsoleCursorInfo(hCons, &cursor);//применение заданных параметров курсора int timer = 200; cout << " (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\";//вступительная заставка Sleep(timer); system("cls"); cout << " \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /";//вступительная заставка Sleep(timer); system("cls"); cout << " / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << " ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка cout << "\a"; Sleep(10 * timer);//задержка заставки StartMenu(1); return 0; } void Game(int var) { int weaponPos;//позиция строки дула в массиве int timer;//задержка между перерисовками экрана int odometer;//количество перерисовок экрана, они же итоговые очки int lifes;//количество жизней char control = "&";//переменная управления кораблем int shotPause = 4;//задержка между выстрелами (указывать на одну перерисовку больше) int speed;//скорость корабля char scr; if (var == 1) { weaponPos = 7;//позиция строки дула в массиве odometer = 1;//количество перерисовок экрана, они же итоговые очки lifes = 3;//количество жизней GameStart(scr, lifes, &timer); } else//при восстановлении игрового сеанса из сохранения { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "rb"); if (!saveBin) { system("cls"); cout << "Нет сохранения."; Sleep(1000); system("cls"); cout << "Нет сохранения.."; Sleep(1000); system("cls"); cout << "Нет сохранения..."; Sleep(1000); Game(1); } fread(&weaponPos, 1, sizeof(int), saveBin); timer = 80; fread(&odometer, 1, sizeof(int), saveBin); fread(&lifes, 1, sizeof(int), saveBin); fread(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); remove("CurrentSave.bin"); } while (true) { int odometerBuf = odometer, odometerDigitLength; for (odometerDigitLength = 0; odometerBuf != 0; odometerBuf /= 10, odometerDigitLength++);//вычисление количества цифр на одометре for (int i = odometerDigitLength, odometerBuf = odometer; i >= 0 ؛ i-- ، scr [i] = عداد المسافات Buf٪ 10 + "0" ، عداد المسافات Buf / = 10) ؛ // رسم عداد المسافات على لوحة القيادة scr = "К" ؛ scr = "M" ؛ // إضافة عداد المسافات "KM" ++ ؛ // زيادة سرعة عداد المسافات = 1000 / مؤقت ؛ // تحديث عداد السرعة int speedBuf = speed ؛ لـ (int i = 42 ؛ speed! = 0 ؛ i-- ، scr [i] = السرعة٪ 10 + "0" ، السرعة / = 10) ؛ // رسم عداد السرعة على لوحة القيادة scr = "К" ؛ scr = "M" ؛ scr = "/" ؛ scr = "C" ؛ // إضافة "KM / S" إذا (_kbhit ()) // إذا تم الضغط على المفتاح (control = _getch () ؛ // سيأخذ المتغير قيمته إذا (control == 224) control = _getch ()؛) إذا (control == 13 && shotPause == 4 || control == 32 && shotPause == 4) // عند الضغط على الزناد إذا تم إعادة تحميل البندقية (scr = "-"؛ shotPause = 0؛) إذا كان (إيقاف مؤقت< 4)//перезарядка shotPause++; if (control == 27)//при выходе { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "wb"); fwrite(&weaponPos, 1, sizeof(int), saveBin); fwrite(&odometer, 1, sizeof(int), saveBin); fwrite(&lifes, 1, sizeof(int), saveBin); fwrite(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); GameMenu(2); } if (control == 72)//при движении корабля вверх if (scr == "\\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤")//если корабль врезался в верхнее поле - игра окончена if (lifes >1) (خارج<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) (خارج<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i >= 2 ؛ i -) // تحرك السفينة عنصرًا واحدًا لأسفل من أجل (int j = 0 ؛ j< 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; } for (int i = 1; i < 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) (خارج<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j >= 0 ؛ j--) إذا (scr [i] [j] == "-") إذا (j! = 48) (scr [i] = "-" ؛ scr [i] [j] = "" ؛) else scr [i] [j] = "" ؛ char borderSymbols = ("†"، "‡"، "¤"، "")؛ scr = "" ؛ // ملء عناصر الحدود الجديدة عشوائيًا scr = borderSymbols ؛ إذا (scr == "‡") scr = "¤" ؛ scr = "" ؛ scr = borderSymbols ؛ إذا (scr == "‡") scr = "¤" ؛ لـ (int i = 3 ؛ i< 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; } ScreenOutput(scr);//вывод экрана if (control != "&")//"обнуление" управляющей переменной control = "&"; if (timer >25) // مؤقت تسارع السفينة - ؛ النوم (مؤقت) ؛ // تأخير إعادة الرسم))


    يمكنك تنزيل ملف exe. هنا.

    أنا تلك الفاكهة. تمت كتابة جميع مشاريع الألعاب الشخصية التي كنت أقوم بها مؤخرًا في "Vanilla" C. لا أحد يفعل ذلك ، لذا أعتقد أنك قد تتساءل عن سبب اتخاذي هذا الاختيار.
    فيما يلي آراء حول لغات البرمجة التي قد لا تعجبك. حذرت.

    ماذا احتاج من لغة

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

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

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

    ماذا اريد من اللغة

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

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

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

    أنا أكثر قلقًا بشأن سرعة المترجم. أنا لست سيدًا بوذيًا للتركيز ، والانتظار لأكثر من 10 ثوانٍ مضيعة. الأسوأ من ذلك ، أنه خارج التيار. يبدو أنه نظر للتو إلى Twitter ، واختفت 5 دقائق في مكان ما.

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

    البدائل

    لا تزال C ++ هي اللغة الأكثر استخدامًا لتطوير الألعاب ، ولسبب وجيه. حتى الآن ، تتم كتابة معظم مشاريعي المخصصة عليها ، وأنا لا أحب ذلك.

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

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

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

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

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

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

    لماذا C هو الخيار الأفضل بالنسبة لي

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

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

    هناك دعم ممتاز للمكتبات والأدوات.

    على الرغم من أن هذا يحزنني قليلاً ، إلا أن C لا تزال أفضل لغة بالنسبة لي.

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

    لذا نعم ، سي هو الخيار الأفضل بالنسبة لي.

    من المترجم

    الترجمة في الأماكن مجانية تمامًا ، ولكن ليس على حساب المعنى أو المحتوى.

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

    مع الاقتراحات والرغبات والتعليقات ، كالعادة ، في الشبكة المحلية.

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