من مترجم: هذا المنشور هو ترجمة
للمقال الأصلي من قبل ماكي تشيز ، المبرمج المتمرس الذي لا يكتب برامج رائعة فحسب ، بل يوضح أيضًا قدرات اللغات المختلفة لزملائه ، سواء المبتدئين والمحترفين.
كاسحة ألغام هي لعبة ممتعة ، كثير منا لعبها. ربما تريد أن تجعل كاسحة الألغام بنفسك؟
توصي Skillbox: المهنة عبر الإنترنت "مهنة مطوري الويب" .
نذكرك: لجميع قراء "هبر" - خصم 10000 روبل عند التسجيل في أي دورة من دورات Skillbox باستخدام الرمز الترويجي "Habr".
تميز اللعبة هو أنها بسيطة للغاية وفي نفس الوقت مثيرة للغاية. لا توجد آليات لعب ماكرة في Meepweeper ، ما عليك سوى النقر على المربعات ، على أمل عدم وجود ألغام تحتها.
أقترح محاولة كتابة "كاسحة الألغام" على المعالجة. هذه أداة رائعة تسمح لك بإنشاء تطبيقات رسومية في Java. رابط لها
هنا .
قبل البدء ، سأقول أن هذا البرنامج التعليمي مخصص لأولئك الذين يعرفون جافا بالفعل. تجربة المعالجة اختيارية.
ها نحن ذا. الخطوة الأولى هي تحديد حالة اللعبة. قررت تنفيذها على هذا النحو.
int gridW;
يبدو أن كل شيء له معنى هنا ، باستثناء هذا القسم:
int [] [] الألغام . لماذا شبكة المنجم عدد صحيح وليس منطقية؟ والحقيقة هي أن هذا يجعل من السهل حساب عدد الألغام القريبة من موقع معين.
int calcNear(int x, int y) { int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { i+=mines[offsetX+x][offsetY+y]; } } return i; }
يحدد هذا الرمز عدد الألغام الموجودة بالقرب من موقع معين. بعد إزالة الاستثناءات ، نحصل على شيء مشابه لما يلي:
boolean outBounds(int x,int y){ return x<0||y<0||x>=gridW||y>=gridH; } int calcNear(int x, int y) { if(outBounds(x,y))return 0; int i=0; for (int offsetX=-1; offsetX<=1; offsetX++) { for (int offsetY=-1; offsetY<=1; offsetY++) { if (outBounds(offsetX+x, offsetY+y))continue; i+=mines[offsetX+x][offsetY+y]; } } return i; }
المهمة الرئيسية للعبة نفسها هي الكشف عن المربعات بدءاً من النقطة x، y.
void reveal(int x, int y){ if(outBounds(x,y))return; if(revealed[x][y])return; revealed[x][y]=true; if(calcNear(x,y)!=0)return; reveal(x-1,y-1); reveal(x-1,y+1); reveal(x+1,y-1); reveal(x+1,y+1); reveal(x-1,y); reveal(x+1,y); reveal(x,y-1); reveal(x,y+1); }
نتيجة لذلك ، لدينا الخوارزمية التالية:
- إذا كان الموقف خارج الميدان ، فأنهى ؛
- إذا تم الكشف عن الموقف ، ينتهي ؛
- نفتح الموقف الحالي.
- إذا كان لدينا قنبلة بالقرب من الموقع الحالي ، تنتهي ؛
- إذا وصلنا إلى هذه النقطة أثناء تنفيذ الوظيفة ، تم العثور على الموقع الحالي داخل الملعب ولا توجد قنابل بجواره ، افتح المربعات المجاورة.
في الأساس ، بقية اللعبة هي نفسها. يمكن العثور على الرمز الكامل بالنقر على
هذا الرابط .
إذا كنت تريد أن تعرف عن التصور ، تابع القراءة.
التصوريجب أن يكون كل شيء واضحًا هنا ، لكنني سأشرح الأجزاء الصعبة.
لذلك ، لدينا حجم خلية متغير ، والذي يحدد عدد البكسل في كل مربع.
void settings(){ size(gridW*cellSize, gridH*cellSize); }
وهكذا ، نقوم بإنشاء حقل مع جوانب الشبكة س س س س ، حيث أحجام كل مربع ستكون مساوية لقيمة حجم الخلية.
ثم نعيد المتغيرات إلى حالتها الأصلية.
void setup(){
لتهيئة حقل:
ثم قم بتشغيل الاستجابة لنقرات الماوس.
ووظيفة العرض ، نسميها مرة واحدة لكل إطار.
void draw() { background(0);
هذا كل ما في الأمر ، كاسحة الألغام لدينا.
تبدو اللعبة بسيطة ، ولكنها بشكل عام تعمل بكامل طاقتها. وتذكر: كاسحة ألغام تسبب الإدمان!
توصي Skillbox بما يلي: