اللعبة على WinForms + C # في 16 عامًا (جزءان)

قبل التاريخ


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

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

صورة


تحديث


  1. تمت إضافة محرر الخرائط الخاص بك (كما في اللعبة الأصلية).
  2. أسلم تنفيذها.
  3. وأضاف القدرة على اللحاق على الدك وعلى الغزل.
  4. وأضاف العديد من أنواع الأسماك.
  5. تحسن كبير في أداء المشروع.
  6. إصلاح عدد كبير من الأخطاء.
  7. أيضا ، تحسن كبير في بنية التطبيق (بتعبير أدق ، مظهره).
  8. وأضاف حفظ الملف الشخصي لاعب.
  9. الجوائز المحققة.
  10. إضافة تغيير ليلا ونهارا.
  11. وأضاف السفر.
  12. نفذت محل بقالة.
  13. نفذت نمط MVP.
  14. نفذت نظام الأحداث في اللعبة
  15. نفذت الطعم ، مع القدرة على خلط المكونات
  16. صوت بالنيابة المضافة
  17. الرسوم المتحركة المضافة
  18. يتم تنفيذ تآكل قضبان ، وهذا يتوقف على حجم السمك ووقت الصيد

سأضيف المزيد من التغييرات إلى ملف مشروع README Git.

كيف ضلل رمز شخص آخر.


صورة

نرى في لقطة الشاشة محرر الخريطة لصيد الأسماك ، أي شبكة العمق لكل موقع (هذه عناصر تسمية مع FormBorderStyle = 0 ، لإظهار الإطار). بالمناسبة ، تم عمل لقطة الشاشة باستخدام مقصاتي الخاصة . ما هي المشكلة؟

شفرة المصدر
for (int x = 0; x < 51; x++){ for (int y = 0; y < 18; y++){ Point between = new Point(Game.CastPoint.X - LVL.Deeparr[x, y].Location.X, Game.CastPoint.Y - LVL.Deeparr[x, y].Location.Y); float distance = (float)Math.Sqrt(between.X * between.X + between.Y * between.Y); if (distance < 20){ if (Player.getPlayer().lure != null){ Game.gui.DeepLabel.Text = LVL.Deeparr[x, y].Tag.ToString(); Sounder.setY(x); Sounder.setX(y); } } Game.Deep = Convert.ToInt32(Game.gui.DeepLabel.Text); } } 



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

لذلك ، نحن بحاجة إلى تحديد الخلية التي في المؤشر. للقيام بذلك ، يمكنك استخدام شفرة المصدر هذه:

قانون
 for (var y = 0; y < CurLvl.Height; y++) { for (var x = 0; x < CurLvl.Widgth; x++) { var r = new Rectangle(CurLvl.DeepArray[x, y].Location, new System.Drawing.Size(LabelInfo.Width, LabelInfo.Height)); if (r.IntersectsWith(new Rectangle(point, new System.Drawing.Size(1, 1)))) { //SomeCode } } } 


هنا نأخذ إحداثيات المؤشر ، الصقها في PointToClient ، ونمررها إلى مُنشئ Rectangle ، وحدد الأحجام 1 و 1. ثم نستخدم طريقة التحقق IntersectsWith القياسية ، وتقاطع المؤشر ، والتسمية. أيضًا ، لا يمكننا معالجة نقرة واحدة على تسمية ، نظرًا لعدم ظهور نموذج معهم.
أيضا ، سمح بتنفيذ الدعم ل 3 قضبان الصيد.

جيل السمك


لذلك ، فإن الجزء الرئيسي من اللعبة هو توليد الأسماك. يحدث في عدة مراحل:
1. عند دخول الموقع ، نحن من خط مثل:
ذهبية: 25 250-400 [Cheese، Worm، Maggot، Corn] أين هو حجم السمك كنسبة مئوية من الحد الأقصى ، والحد الأدنى للعمق ، والحد الأقصى للعمق ، وقائمة من الطعم نحصل على كائن السمكة (لا تنس أن تحقق المسبق من الخط من خلال التعبيرات العادية). من أجل جمال الكود ، قمت بتحديد عامل تشغيل يلقي سلسلة لصيد السمك.

 public static explicit operator Fish(FishString fs) { return fs.GetFishByStr(); } 


نتيجة لذلك ، يسمح لنا هذا النهج بكتابة:

 Fish fish = (Fish)new FishString(" : 25 250 - 400 [ , , ,  ]"); 

يتم تقديم الرمز كمثال ولا يوجد في المشروع في هذا النموذج.

2. الآن نحن بحاجة إلى الانتظار حتى يتم إلقاء قضبان الصيد ، بعد ذلك نبدأ الموقت (خاص بنا لكل قضيب صيد) مع وقت عضة عشوائي ، ثم اتبع علامة المؤقت من قائمة الأسماك لدينا بأحجام 1000 وحدة ، حدد الأسماك التي عمقها الموائل يشمل عمق قضبان الصيد.

3. من هذه القائمة ، حدد عشوائيا سمكة. نحن نتحقق مما إذا كان الطعم المحدد يمكن أن يؤكل ، ونتحقق أيضًا من أن الوقت من يوم نشاط الأسماك يتوافق مع الوقت الحالي في اللعبة.

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

بفضل عملية التوليد ، أصبحت مستخدم LINQ واثقًا.

لعبة نفسها



الأطعمة

لقطة شاشة لمتجر البقالة.

يمكن الاطلاع على مصدره في المستودع. هناك ، يتم تنفيذ معالجات MouseEnter و MouseLeft لتعديل الصور الغذائية بشكل مثير للاهتمام.

صورة

لقطة من نموذج السفر. (جميع المسطحات المائية هي اختبار وأسمائها ليست أصلية.)

صورة

لعبة لقطة

خطط


  1. اصنع خادم عميل للعبة
  2. مبتدئ FPGA (FPGA) المطور
  3. التعرف على الوجوه عبر كاميرا الويب (أبحث عن كتابات قد تكون مفيدة)
  4. استبدال ListView منتظم مع ObjectListView

في نهاية المقال السابق ، كتبت أنني أريد الحصول على وظيفة. حسنًا ، في أيلول (سبتمبر) ، أغلقت أول اختصاصات لـ SNMP ، لكن في C.

استنتاج


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

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

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

Source: https://habr.com/ru/post/ar479864/


All Articles