Daftar Isi:

Minesweeper-Raspberry-Pi-Edition: 7 Langkah (dengan Gambar)
Minesweeper-Raspberry-Pi-Edition: 7 Langkah (dengan Gambar)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Langkah (dengan Gambar)

Video: Minesweeper-Raspberry-Pi-Edition: 7 Langkah (dengan Gambar)
Video: Bot Plays Minesweeper in Power Automate Desktop 2024, Juli
Anonim
Minesweeper-Raspberry-Pi-Edisi
Minesweeper-Raspberry-Pi-Edisi
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Proyek akhir saya untuk seri CSC 130 di Louisiana Tech University adalah Minesweeper Raspberry Pi Edition. Dalam proyek ini, saya berusaha untuk membuat ulang permainan klasik kapal penyapu ranjau dengan memanfaatkan perpustakaan Tkinter dari bahasa pemrograman Python. Kisi-kisi yang dicakup oleh permainan kapal penyapu ranjau memiliki lebar delapan ubin dan tinggi lima ubin. Pemformatan proyek telah disesuaikan dan disempurnakan untuk penggunaan Raspberry Pi yang diinstal dengan Python 2.7.

Kode dan gambar tugas akhir Minesweeper Raspberry Pi Edition dapat diunduh pada link berikut:

Minesweeper-Raspberry-Pi-Edition

Perlengkapan

x1 Raspberry Pi

Python 2.7 Diinstal di Raspberry Pi

Microsoft Powerpoint (atau perangkat lunak lain untuk membuat gambar untuk tombol)

Langkah 1: Buat Gambar Tombol

Buat Gambar Tombol
Buat Gambar Tombol

PENJELASAN:

Setiap tombol yang membentuk GUI perlu dibuat. Untuk tugas ini, saya menggunakan Microsoft Powerpoint untuk membuat gambar yang saya perlukan untuk ditampilkan pada tombol.

Pertama, saya membuat sepuluh tombol ubin yang diperlukan untuk membuat kisi penyapu ranjau (kosong, bob, nol, satu, dua, tiga, empat, lima, enam, tujuh, dan delapan) menggunakan Microsoft Powerpoint.

Kedua, saya membuat empat gambar yang diperlukan untuk layar menu (tampilan menu, tombol kesulitan mudah, tombol kesulitan sedang, dan tombol kesulitan keras) menggunakan Microsoft Powerpoint.

Ketiga, saya membuat gambar yang diperlukan untuk tombol mulai ulang dan gambar yang diperlukan untuk tombol tampilan lain yang berbeda (tampilan "game over", tampilan "Anda menang", dan tampilan "aturan") menggunakan Microsoft Powerpoint.

Keempat, Anda harus mengubah ukuran gambar agar pas dengan layar Anda. Untuk Rasberry Pi saya, saya menggunakan dimensi berikut untuk jendela (mengacu pada piksel panjang dan lebar): 432x576.

Langkah 2: Format Program

Format Program
Format Program

PENJELASAN:

Sebelum pemrograman yang sebenarnya dapat dilakukan, kita harus mengimpor perpustakaan yang kita butuhkan dan menulis bagian utama dari program kita.

Pertama, kita perlu mengimpor * dari perpustakaan Tkinter dan mengacak dari perpustakaan acak. Kedua, kita perlu menyelesaikan langkah-langkah berikut dalam kode di bagian utama program: buat jendela, atur jendela judul, buat GUI, dan tampilkan GUI dan tunggu interaksi pengguna. Kode ini ditulis dalam format yang tepat sehubungan dengan perpustakaan Tkinter (lihat kode yang diberikan dalam instruksi untuk melihat format yang benar).

Langkah 3: Buat GUI (Menu & Minesweeper Grid)

Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)
Buat GUI (Menu & Minesweeper Grid)

PENJELASAN:

Setelah memulai program, layar menu akan diluncurkan. Setelah kesulitan dipilih (dengan mengklik salah satu tombol kesulitan pada layar menu), GUI akan disegarkan dengan kisi penyapu ranjau, tampilan, dan tombol mulai ulang. Karena Anda baru mulai mengerjakan GUI, kita hanya perlu menjalankan menu, membuat tombol kesulitan menu menjadi operasional, dan menyegarkan GUI ke layar game dengan kisi kapal penyapu ranjau.

Pertama, kita dapat menampilkan layar menu itu sendiri saat program dimulai dengan memanggil metode "setupMenu" di dalam konstruktor kelas MainGUI.

Kedua, kita dapat meminta setiap tombol kesulitan menu mengeksekusi baris kode tertentu setiap kali diklik dengan menambahkan metode "proses" (juga harus menambahkan perintah lambda: self.process("returnButtonName") di dalam parameter fungsi tombol yang digunakan dalam pembuatan setiap tombol kesulitan). Tiga pernyataan if-else akan dibuat dalam metode "proses" dan mengeksekusi metode dan baris kode tambahan tertentu lainnya tergantung pada apa yang sama dengan tombol (tombol sama dengan apa pun nama tombol yang terakhir didaftarkan).

Ketiga, saat layar menu menyala dan jika pengguna mengklik salah satu tombol kesulitan, maka program akan menyimpan nilai tertentu ke variabel "kesulitan" (kesulitan sama dengan "mudah", "sedang", atau "sulit" berdasarkan mematikan tombol kesulitan mana yang diklik). Klik tombol ini mengetahui pernyataan if-else mana yang harus diikuti berdasarkan nama tombol apa yang terakhir didaftarkan (tombol apa yang sama). Selain itu, untuk menetapkan kembali variabel "kesulitan" kita perlu membuat instance terlebih dahulu itu di luar kelas Jadi kita akan mengatur variabel "kesulitan" sebagai string kosong sebelum kelas "MainGUI" dibuat.

Keempat, hapus GUI tombol yang dibuat oleh metode "setupMenu" dengan membuat metode "clearMenu" (menggunakan fungsi button.destroy() dalam beberapa contoh) dan memanggil metode "clearMenu" dalam metode "proses" (di bawah masing-masing tombol kesulitan mendaftar setelah penugasan variabel kesulitan).

Kelima, refresh GUI dengan membuat metode "setSLASHresetGUI" (tombol dibuat sama seperti pada metode "setupMenu") dan memanggil metode "setSLASHresetGUI" pada metode "proses" (di bawah masing-masing register tombol kesulitan setelah tugas variabel kesulitan dan memanggil metode "clearMenu").

Selain itu, sebelum semua tombol ditetapkan dalam metode "setSLASHresetGUI" kita harus mengonfigurasi baris dan kolom di dalam kisi dan setelah semua tombol ditetapkan dalam metode "setSLASHresetGUI" kita harus mengemas semua konten di dalam kisi (lihat kode yang diberikan dalam instruksi untuk melihat pemformatan yang tepat).

Langkah 4: Jadikan Tombol di Layar Dalam Game Beroperasi

Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi
Jadikan Tombol di Layar Dalam Game Beroperasi

PENJELASAN:

Untuk membuat tombol mengeksekusi baris kode tertentu saat diklik, kita harus menjalankan metode dalam metode "proses". Untuk tugas ini, kita harus membuat beberapa metode, variabel, dan daftar baru.

Pertama, kita akan membuat dua daftar. Akan ada daftar yang disebut "grid". Daftar "grid" ini hanya akan terdiri dari bilangan bulat 9 dan 0. Dalam daftar ini, sembilan akan mewakili bom, dan nol akan mewakili non-bom. Ini adalah bagaimana program akan membedakan apakah sebuah ubin adalah bom atau bukan. Daftar kedua akan dibuat, dan itu akan disebut "status". Daftar "status" ini hanya terdiri dari satu karakter string ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Dalam daftar ini, setiap string karakter akan sesuai dengan gambar tertentu. Ini adalah bagaimana program akan mengetahui gambar apa yang akan ditampilkan pada setiap tombol di grid kapal penyapu ranjau. Setiap tombol di kisi kapal penyapu ranjau akan memiliki indeks yang sesuai di setiap daftar berdasarkan penempatannya di kisi. Indeks yang sesuai akan ditetapkan dengan prosedur berikut (nomor tombol - 1). Misalnya, indeks yang sesuai dengan tombol seseorang di setiap daftar adalah indeks nol. Terakhir, kedua daftar ini akan dieksekusi sebelum kelas "MainGUI" dijalankan dan akan dibuat di luar kelas "MainGUI". Kelas "kisi" akan dibuat sebagai daftar kosong (kisi = ) dan daftar "status" akan dibuat oleh fungsi rentang (menambahkan empat puluh string karakter tunggal "n" ke daftar "status").

Kedua, kami akan membuat berbagai metode yang dapat mendeteksi jumlah ranjau di sekitarnya dan yang dapat dipanggil ketika tombol diklik (keputusan metode mana yang harus dijalankan ditentukan oleh penempatan tombol). Metode-metode ini akan disebut penganalisis tambang kami. Metode ini akan meningkatkan penghitung yang disebut "NumOfMines" dan akan menggunakan indeks tertentu dalam daftar "grid" untuk menentukan berapa banyak bom yang mengelilingi ubin. String yang akan disimpan dalam variabel "NumOfMines" akan digunakan untuk menggantikan indeks yang sama dalam daftar "status". Sekarang, Anda mungkin bertanya-tanya bagaimana program akan mengetahui indeks mana yang akan digunakan. Ketika sebuah tombol didaftarkan dalam metode "proses", maka variabel "indeks" akan dibuat/dipindahkan ke bilangan bulat tertentu (berdasarkan string apa yang didaftarkan tombol). Salah satu metode yang dibuat akan menggunakan indeks yang ditetapkan untuk mengetahui penempatan ubin dan indeks ubin di sekitarnya (algoritma dalam metode akan mengetahuinya). Selain itu, untuk menetapkan kembali variabel "indeks" kita harus terlebih dahulu membuat instance-nya di luar kelas. Jadi kita akan mengatur variabel "indeks" sebagai bilangan bulat nol sebelum kelas "MainGUI" dibuat.

Ketiga, metode "operasi" akan dibuat. Metode "operasi" akan dijalankan setiap kali tombol didaftarkan. Metode "operasi" ini akan dijalankan dalam metode "proses". Dalam metode "proses", beberapa pernyataan if-else akan menentukan tombol mana yang diklik (berdasarkan apa yang sama dengan tombol tersebut). Di sinilah metode "operasi" tertentu akan dipanggil (dalam pernyataan if-else).

Keempat, kita akan benar-benar masuk ke bagaimana tombol menjadi operasional. Seperti yang dinyatakan sebelumnya, beberapa pernyataan if-else terletak di metode "proses" dan mengeksekusi metode dan baris kode tambahan tertentu lainnya tergantung pada apa yang sama dengan tombol (tombol sama dengan string apa pun yang terakhir didaftarkan). Dalam pernyataan if-else ini, berikut akan terjadi secara berurutan: indeks akan ditetapkan secara global, indeks yang sesuai dalam daftar "status" akan dipindahkan ke string "b" (jika indeks yang sesuai dari daftar "kisi" sama dengan bilangan bulat sembilan), metode "operasi" yang sesuai akan dieksekusi (jika indeks yang sesuai dari daftar "kisi" sama dengan bilangan bulat nol), indeks yang sesuai dalam daftar "status" akan dipindahkan ke string yang sama dengan variabel "NumOfMines" (jika indeks yang sesuai dari daftar "grid" sama dengan bilangan bulat nol), dan GUI akan di-refresh dengan memanggil metode "setSLASHresetGUI".

Langkah 5: Metode "setDifficulty" & Metode "restart"

Gambar
Gambar
Gambar
Gambar

PENJELASAN:

Selanjutnya, metode "setDifficulty" perlu dibuat dan tombol restart yang terletak di bagian bawah layar dalam game harus beroperasi (dengan membuat metode "restart" untuk dijalankan ketika diklik oleh pengguna).

Pertama, metode "setDifficulty" perlu diimplementasikan dalam pernyataan if-else dari tombol kesulitan dalam metode "proses" dan dalam metode "restart". Baris kode dan metode yang dieksekusi dalam metode ini cukup sederhana. Dalam metode "setDifficulty", kami akan menambahkan sejumlah nol (non-bom) dan sembilan (bom) ke daftar "grid" (melalui dua fungsi rentang dalam setiap pernyataan if-else), dan kemudian kami akan mengocok daftar "grid" (dengan fungsi acak perpustakaan) dalam metode "setDifficulty" (setelah pernyataan if-else dieksekusi). Rasio nol hingga sembilan akan ditentukan oleh string apa yang disetel variabel "kesulitan" ("mudah": 34-6, "sedang": 28-12, "keras": 16-24).

Kedua, dalam metode "restart", kita akan mengatur variabel "index" dan "NumOfMinesLEFT" menjadi nol secara global, mengosongkan daftar "status" dan "grid" secara global, mengatur ulang daftar "status" dengan fungsi rentang (menambahkan empat puluh string karakter tunggal "n" ke daftar "status"), dan panggil metode "setDifficulty".

Langkah 6: Skenario Akhir Game

Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game
Skenario Akhir Game

PENJELASAN:

Setiap permainan kapal penyapu ranjau memiliki dua skenario akhir permainan: menang dan kalah. Dalam program ini, kami akan menerapkan dua skenario akhir permainan ini dengan dua metode baru: metode "You_A_Winner_Son" dan metode "GameOver". Sebelum GUI di-refresh dalam metode "proses" dan berdasarkan indeks yang diubah oleh dua metode skenario akhir permainan, tombol tampilan akan diubah untuk mewakili hasil dengan benar.

Pertama, ketika pengguna mengklik ubin non-bom tersembunyi terakhir, maka metode "You_A_Winner_Son" harus dijalankan. Kami akan menyelesaikan tugas ini dengan memanggil metode "You_A_Winner_Son" setiap kali ubin diklik dan ubin ternyata bukan ubin bom (dalam metode "operasi" yang dijalankan dalam metode "proses"). Jika kondisi pemenang terpenuhi, maka dua pernyataan if-else dalam metode "You_A_Winner_Son" akan dieksekusi. Pernyataan if-else pertama akan selalu dijalankan terlepas dari apakah pemain menang atau tidak ketika metode ini dipanggil. Berdasarkan apa variabel "kesulitan" sama dengan, algoritma tertentu yang akan menentukan berapa banyak ranjau/bom yang disembunyikan. Integer yang ditemukan oleh algoritma ini akan disimpan dalam variabel "NumOfMinesLEFT". Selanjutnya, di antara dua pernyataan if-else algoritma lain akan dieksekusi untuk menemukan jumlah ubin awal yang tersisa (ubin yang tidak diklik). Integer yang ditemukan oleh algoritma ini akan disimpan dalam variabel "NumOfStartingTilesLEFT". Pernyataan if-else kedua akan selalu dijalankan terlepas dari apakah pemain menang atau tidak ketika metode ini dipanggil. Berdasarkan apa variabel "kesulitan" sama dengan, salah satu dari tiga pernyataan if-else dapat dieksekusi jika kondisinya terpenuhi. Kondisi akan didasarkan pada persamaan dua variabel "NumOfMinesLEFT" dan "NumOfStartingTilesLEFT". Dalam tiga pernyataan if-else ini, sebuah algoritma akan dieksekusi yang akan membuat setiap tombol tidak berguna (permainan berakhir).

Kedua, ketika pengguna mengklik salah satu ubin bom tersembunyi, maka metode "GameOver" harus dijalankan. Kami akan menyelesaikan tugas ini dengan memanggil metode "GameOver" setiap kali ubin diklik dan ubin tersebut ditemukan sebagai ubin bom (dalam metode "operasi" yang dijalankan dalam metode "proses"). Ketika metode "GameOver" dipanggil, sebuah algoritme akan dieksekusi yang akan membuat setiap ubin awal tidak berguna (permainan berakhir) dan ubin bom tersembunyi akan terungkap (berdasarkan indeks yang sesuai dalam "daftar kisi, indeks tertentu). dalam daftar "status" akan dipindahkan ke string karakter tunggal "b").

Ketiga, tampilan layar dalam game akan diperbarui setiap kali GUI di-refresh dengan melakukan sedikit pengeditan kecil pada metode "setSLASHresetGUI". Setelah kisi-kisi GUI dikonfigurasi, kami akan menempatkan tiga pernyataan if-else di mana penetapan tombol tampilan saat ini ditempatkan. Salah satu dari tiga pernyataan if-else akan dijalankan berdasarkan variabel berikut yang sama dengan: "GameOverDETECTOR", "kesulitan", "NumOfMinesLEFT", dan "NumOfStartingTilesLEFT". Seperti yang Anda mungkin bertanya-tanya, variabel "GameOverDETECTOR" adalah variabel baru variabel. Variabel ini akan dibuat tepat sebelum pernyataan if-else dieksekusi dalam metode "setSLASHresetGUI". Variabel "GameOverDETECTOR" akan sama dengan bilangan bulat yang ditemukan menggunakan algoritme yang menemukan berapa banyak indeks dalam "grid" list telah dipindahkan ke bilangan bulat sembilan puluh sembilan (bagaimana tombol dianggap tidak berguna) Berdasarkan kondisi pernyataan if-else yang terpenuhi, penugasan ulang yang sesuai ke tampilan akan terjadi.

Langkah 7: Membuat Tombol Restart Beroperasi

Membuat Tombol Restart Beroperasi
Membuat Tombol Restart Beroperasi

PENJELASAN:

Langkah ini terjadi menjadi yang terpendek. Sebagian besar pekerjaan untuk langkah ini telah dilakukan. Yang perlu kita lakukan sekarang adalah menjalankan metode "restart" setiap kali tombol restart diklik oleh pengguna.

Pertama dan terakhir, kita akan mengeksekusi metode "restart" dalam metode "proses" dengan pernyataan if-else. Jika string "!" terdaftar, maka metode "restart" harus dijalankan. Kita juga harus membuat tombol yang disebut restart di akhir metode "setSLASHresetGUI" sebelum konten grid dikemas bersama. Tombol restart ini akan memproses string "!" (perintah lambda: self.process("!")) dan jalankan metode "restart" yang sesuai dalam metode "proses".

Direkomendasikan: