Dari seorang penerjemah: posting ini adalah terjemahan dari
artikel asli oleh Maki Chiz, seorang pembuat kode berpengalaman yang tidak hanya menulis program yang hebat, tetapi juga menunjukkan kemampuan berbagai bahasa kepada rekan-rekannya, baik pemula maupun profesional.
Minesweeper adalah permainan yang menyenangkan, banyak dari kita yang memainkannya. Mungkin Anda ingin membuat Minesweeper sendiri?
Skillbox merekomendasikan: Profesi online "Profesi Pengembang Web" .
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promosi "Habr".
Keunikan permainan ini adalah sangat sederhana dan pada saat yang sama sangat menarik. Tidak ada mekanisme permainan yang licik di Minesweeper, Anda cukup mengklik kotak, berharap tidak ada ranjau di bawah mereka.
Saya sarankan mencoba menulis "Minesweeper" pada Pemrosesan. Ini adalah alat yang hebat yang memungkinkan Anda untuk membuat aplikasi grafis di Java. Tautkan ke
sini .
Sebelum memulai, saya akan mengatakan bahwa tutorial ini ditujukan untuk mereka yang sudah mengenal Java. Pengalaman dengan Pemrosesan adalah opsional.
Jadi di sini kita mulai. Langkah pertama adalah menentukan kondisi permainan. Saya memutuskan untuk mengimplementasikannya seperti ini.
int gridW;
Segalanya tampak masuk akal di sini, kecuali untuk bagian ini:
int [] [] ranjau . Mengapa grid tambang bilangan bulat dan bukan boolean? Faktanya adalah ini membuatnya mudah untuk menghitung berapa banyak ranjau yang dekat dengan posisi tertentu.
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; }
Kode ini menentukan berapa banyak ranjau yang terletak di dekat situs tertentu. Setelah kami menghapus pengecualian, kami mendapatkan sesuatu yang mirip dengan ini:
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; }
Tugas utama permainan itu sendiri adalah untuk mengungkapkan kotak mulai dari titik 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); }
Hasilnya, kami memiliki algoritme berikut:
- Jika posisi di luar bidang, akhiri;
- Jika posisi diungkapkan, akhiri;
- Kami membuka posisi saat ini;
- Jika kita memiliki bom di dekat posisi saat ini, akhiri;
- Jika kami mencapai titik ini selama pelaksanaan fungsi, posisi saat ini dalam lapangan bermain ditemukan dan tidak ada bom di sebelahnya, buka kotak yang berdekatan.
Pada dasarnya, sisa permainannya sama. Kode lengkap dapat ditemukan dengan mengklik
tautan ini .
Jika Anda ingin tahu tentang visualisasi, baca terus.
VisualisasiSemuanya harus jelas di sini, tetapi saya akan menjelaskan bagian yang sulit.
Jadi, kami memiliki cellSize variabel, yang menentukan jumlah piksel di setiap kotak.
void settings(){ size(gridW*cellSize, gridH*cellSize); }
Jadi, kita membuat bidang dengan sisi-sisi gridW x gridH, di mana ukuran setiap kotak akan sama dengan nilai cellSize.
Kemudian kita mengembalikan variabel ke keadaan semula.
void setup(){
Untuk menginisialisasi bidang:
Dan kemudian nyalakan respons terhadap klik mouse.
Dan fungsi tampilan, kami menyebutnya sekali untuk setiap frame.
void draw() { background(0);
Dan itu saja, ini Minesweeper kami.
Gim ini terlihat sederhana, tetapi secara keseluruhan berfungsi penuh. Dan ingat: Minesweeper membuat kecanduan!
Skillbox merekomendasikan: