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

تحديث
- تمت إضافة محرر الخرائط الخاص بك (كما في اللعبة الأصلية).
- أسلم تنفيذها.
- وأضاف القدرة على اللحاق على الدك وعلى الغزل.
- وأضاف العديد من أنواع الأسماك.
- تحسن كبير في أداء المشروع.
- إصلاح عدد كبير من الأخطاء.
- أيضا ، تحسن كبير في بنية التطبيق (بتعبير أدق ، مظهره).
- وأضاف حفظ الملف الشخصي لاعب.
- الجوائز المحققة.
- إضافة تغيير ليلا ونهارا.
- وأضاف السفر.
- نفذت محل بقالة.
- نفذت نمط MVP.
- نفذت نظام الأحداث في اللعبة
- نفذت الطعم ، مع القدرة على خلط المكونات
- صوت بالنيابة المضافة
- الرسوم المتحركة المضافة
- يتم تنفيذ تآكل قضبان ، وهذا يتوقف على حجم السمك ووقت الصيد
سأضيف المزيد من التغييرات إلى ملف مشروع 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 لتعديل الصور الغذائية بشكل مثير للاهتمام.

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

لعبة لقطة
خطط
- اصنع خادم عميل للعبة
- مبتدئ FPGA (FPGA) المطور
- التعرف على الوجوه عبر كاميرا الويب (أبحث عن كتابات قد تكون مفيدة)
- استبدال ListView منتظم مع ObjectListView
في نهاية المقال السابق ، كتبت أنني أريد الحصول على وظيفة. حسنًا ، في أيلول (سبتمبر) ، أغلقت أول اختصاصات لـ SNMP ، لكن في C.
استنتاج
لقد أصبح المشروع كبيرًا جدًا ، مع وجود قاعدة رمز مثالية على الأقل ، ولكنه مناسب جدًا للصيانة ، وفي مكان ما قد تنتهك مبادئ SOLID ، لكن هذا يرجع إلى حقيقة أن المشروع كان طويلًا للغاية. أيضًا ، إذا كنت مطور مبتدئ ، وتبحث عن مشروع يمكنك المشاركة فيه ، فيمكنك تقديم تعهدات إلى هذا المستودع. يمكن العثور على قائمة التغييرات المتوقعة في ملف README الخاص بالمشروع.
أود أيضًا أن أشير إلى أنني لا أرى أي فرص في مهنة مطور C # ، أو بالأحرى أود الحصول على شيء أقرب إلى الأجهزة ، لذلك أحاول دراسة اللغات ذات المستوى الأدنى.
شكرا لجميع الذين قرأوا حتى النهاية ، أي انتقاد للشفرة المصدرية مرحب به وسيتم النظر فيه على الفور.