Isi kandungan:

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, Julai
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

Projek terakhir saya untuk siri CSC 130 di Louisiana Tech University adalah Minesweeper Raspberry Pi Edition. Dalam projek ini, saya berusaha membuat permainan klasik penyapu ranjau dengan menggunakan perpustakaan Tkinter dari bahasa pengaturcaraan Python. Grid yang diliputi oleh permainan penyapu ranjau ialah lapan jubin lebar dan tinggi lima jubin. Pemformatan projek telah sesuai dan disempurnakan untuk penggunaan Raspberry Pi yang dipasang dengan Python 2.7.

Kod dan gambar untuk projek akhir Minesweeper Raspberry Pi Edition boleh dimuat turun di pautan berikut:

Minesweeper-Raspberry-Pi-Edition

Bekalan

x1 Raspberry Pi

Python 2.7 Dipasang pada Raspberry Pi

Microsoft Powerpoint (atau perisian lain untuk membuat gambar untuk butang)

Langkah 1: Buat Imej Butang

Buat Imej Butang
Buat Imej Butang

PENJELASAN:

Setiap butang yang membentuk GUI perlu dibuat. Untuk tugas ini, saya menggunakan Microsoft Powerpoint untuk membuat gambar yang perlu saya paparkan pada butang.

Pertama, saya membuat sepuluh butang jubin yang diperlukan untuk membuat grid penyapu ranjau (kosong, bob, sifar, satu, dua, tiga, empat, lima, enam, tujuh, dan lapan) menggunakan Microsoft Powerpoint.

Kedua, saya membuat empat gambar yang diperlukan untuk layar menu (paparan menu, butang kesukaran mudah, butang kesukaran sederhana, dan butang kesukaran keras) menggunakan Microsoft Powerpoint.

Ketiga, saya membuat gambar yang diperlukan untuk butang restart dan gambar yang diperlukan untuk butang paparan lain yang berbeza (paparan "game over", paparan "anda menang", dan paparan "peraturan") menggunakan Microsoft Powerpoint.

Keempat, anda perlu mengubah saiz gambar anda agar sesuai dengan skrin anda. Untuk Rasberry Pi saya, saya menggunakan dimensi berikut untuk tetingkap (merujuk kepada piksel dengan panjang dan lebar): 432x576.

Langkah 2: Format Program

Format Program
Format Program

PENJELASAN:

Sebelum sebarang pengaturcaraan sebenar dapat dilaksanakan, kita mesti mengimport perpustakaan yang kita perlukan dan menulis bahagian utama program kita.

Pertama, kita perlu mengimport * dari perpustakaan Tkinter dan mengacak dari perpustakaan rawak. Kedua, kita perlu menyelesaikan langkah-langkah berikut dalam kod dalam bahagian utama program: buat tetingkap, tetapkan tetingkap judul, buat GUI, dan tampilkan GUI dan tunggu interaksi pengguna. Kod ini ditulis dalam format yang tepat sehubungan dengan perpustakaan Tkinter (lihat kod yang diberikan dalam petunjuk untuk melihat pemformatan yang betul).

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 program dimulakan, skrin menu akan dilancarkan. Setelah kesulitan dipilih (dengan mengklik salah satu tombol kesukaran pada layar menu), GUI akan disegarkan dengan grid penyapu ranjau, layar, dan butang restart. Oleh kerana anda baru mulai mengerjakan GUI, kami hanya perlu membuat menu untuk diluncurkan, mengaktifkan butang kesukaran menu, dan mengaktifkan GUI ke layar permainan dengan grid penyapu ranjau.

Pertama, kita dapat memaparkan skrin menu sendiri semasa permulaan program dengan memanggil kaedah "setupMenu" dalam pembangun kelas MainGUI.

Kedua, setiap butang kesukaran menu dapat menjalankan baris kod tertentu setiap kali diklik dengan menambahkan kaedah "proses" (juga harus menambahkan perintah lambda: self.process ("returnButtonName") dalam parameter fungsi butang yang digunakan dalam penciptaan setiap butang kesukaran). Tiga pernyataan if-else akan dibuat dalam kaedah "proses" dan melaksanakan kaedah dan baris kod tambahan yang lain bergantung pada apa yang sama dengan butang (butang sama dengan nama butang yang terakhir didaftarkan).

Ketiga, ketika layar menu di atas dan jika pengguna mengklik salah satu butang kesukaran, maka program akan menyimpan nilai tertentu ke variabel "kesulitan" (kesulitan sama dengan "mudah", "sederhana", atau "keras" berdasarkan butang kesukaran mana yang diklik). Klik butang ini mengetahui pernyataan if-else yang mana yang harus diikuti berdasarkan nama butang apa yang terakhir didaftarkan (butang apa yang sama). Selain itu, untuk menetapkan semula pemboleh ubah "kesukaran", kita perlu terlebih dahulu menunjukkan di luar kelas. Jadi kita akan menetapkan pemboleh ubah "kesukaran" sebagai rentetan kosong sebelum kelas "MainGUI" dibuat.

Keempat, hapus GUI butang yang dibuat dengan kaedah "setupMenu" dengan membuat kaedah "clearMenu" (menggunakan fungsi button.destroy () dalam beberapa keadaan) dan memanggil kaedah "clearMenu" dalam kaedah "proses" (di bawah setiap butang kesukaran mendaftar setelah tugasan pemboleh ubah kesukaran).

Kelima, segarkan GUI dengan membuat kaedah "setSLASHresetGUI" (butang dibuat dengan cara yang sama seperti dalam kaedah "setupMenu") dan memanggil kaedah "setSLASHresetGUI" dalam kaedah "proses" (di bawah setiap butang kesukaran mendaftar setelah tugasan pembolehubah kesukaran dan memanggil kaedah "clearMenu").

Selain itu, sebelum semua butang ditetapkan dalam kaedah "setSLASHresetGUI" kita mesti mengkonfigurasi baris dan lajur dalam grid dan setelah semua butang ditetapkan dalam kaedah "setSLASHresetGUI" kita mesti memasukkan semua kandungan dalam grid (lihat kod yang diberikan dalam arahan untuk melihat pemformatan yang betul).

Langkah 4: Buat Butang pada Skrin Dalam Permainan Beroperasi

Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi
Buat Butang pada Skrin Dalam Permainan Beroperasi

PENJELASAN:

Untuk membuat butang menjalankan baris kod tertentu ketika diklik, kita harus menjalankan kaedah dalam metode "proses". Untuk tugas ini, kita harus membuat beberapa kaedah, pemboleh ubah, dan senarai baru.

Pertama, kami akan membuat dua senarai. Akan ada senarai yang disebut "grid". Senarai "grid" ini hanya akan terdiri daripada bilangan bulat 9 dan 0. Dalam senarai ini, nine akan mewakili bom, dan nol akan mewakili bukan bom. Ini adalah bagaimana program akan membezakan jika jubin itu bom atau tidak. Senarai kedua akan dibuat, dan akan disebut "status". Senarai "status" ini hanya terdiri daripada satu rentetan watak ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b "). Dalam senarai ini, setiap rentetan watak akan sesuai dengan gambar tertentu. Ini adalah bagaimana program akan mengetahui gambar apa yang akan dipaparkan pada setiap butang di grid penyapu ranjau. Setiap butang di grid penyapu ranjau akan memiliki indeks yang sesuai dalam setiap daftar berdasarkan penempatannya di grid. Indeks yang sesuai akan ditetapkan dengan prosedur berikut (nombor butang - 1). Contohnya, butang indeks yang sesuai dalam setiap senarai adalah indeks sifar. Terakhir, kedua senarai ini akan dilaksanakan sebelum kelas "MainGUI" dijalankan dan akan dibuat di luar kelas "MainGUI". Kelas "grid" akan dibuat sebagai senarai kosong (grid = ) dan senarai "status" akan dibuat oleh fungsi julat (menambahkan empat puluh rentetan watak tunggal "n" ke senarai "status").

Kedua, kami akan membuat pelbagai kaedah yang dapat mengesan jumlah ranjau yang mengelilinginya dan yang dapat dipanggil ketika butang diklik (keputusan kaedah mana yang harus dijalankan ditentukan oleh penempatan butang). Kaedah-kaedah ini akan dipanggil penganalisis lombong kita. Kaedah-kaedah ini akan meningkatkan penghitung yang disebut "NumOfMines" dan akan menggunakan indeks tertentu dalam senarai "grid" untuk menentukan berapa banyak bom yang mengelilingi jubin. Rentetan yang akan disimpan dalam pemboleh ubah "NumOfMines" akan digunakan untuk menggantikan indeks yang sama dalam senarai "status". Sekarang, anda mungkin tertanya-tanya bagaimana program akan mengetahui indeks mana yang akan digunakan. Apabila butang didaftarkan dalam metode "proses", maka variabel "indeks" akan dibuat / ditugaskan kembali ke bilangan bulat tertentu (berdasarkan rentetan tombol yang didaftarkan). Salah satu kaedah yang dibuat akan menggunakan indeks yang ditetapkan untuk mengetahui penempatan jubin dan indeks jubin yang mengelilinginya (algoritma dalam kaedah akan mengetahuinya). Selain itu, untuk menetapkan semula pemboleh ubah "indeks", kita perlu menunjukkannya terlebih dahulu di luar kelas. Oleh itu, kita akan menetapkan pemboleh ubah "indeks" sebagai sifar integer sebelum kelas "MainGUI" dibuat.

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

Keempat, kita sebenarnya akan mengetahui bagaimana butang-butang itu beroperasi. Seperti yang dinyatakan sebelumnya, banyak pernyataan if-else terletak dalam kaedah "proses" dan melaksanakan kaedah dan baris kod tambahan lain bergantung pada apa yang sama dengan butang (butang sama dengan rentetan apa pun yang terakhir didaftarkan). Dalam pernyataan if-else ini, yang berikut akan berlaku mengikut urutan: indeks akan ditetapkan secara global, indeks yang sesuai dalam senarai "status" akan ditugaskan semula ke string "b" (jika indeks yang sesuai dari daftar "grid" sama dengan bilangan bulat sembilan), kaedah "operasi" yang sesuai akan dijalankan (jika indeks yang sesuai dari senarai "grid" sama dengan sifar bilangan bulat), indeks yang sesuai dalam senarai "status" akan ditugaskan kembali ke rentetan yang sama dengan pemboleh ubah "NumOfMines" (jika indeks yang sesuai dari daftar "grid" sama dengan bilangan bulat nol), dan GUI akan disegarkan dengan memanggil kaedah "setSLASHresetGUI".

Langkah 5: Kaedah "setDifficulty" & Kaedah "restart"

Imej
Imej
Imej
Imej

PENJELASAN:

Seterusnya, kaedah "setDifficulty" perlu dibuat dan butang restart yang terletak di bahagian bawah skrin dalam permainan perlu beroperasi (dengan membuat kaedah "mulakan semula" agar dapat dilaksanakan ketika diklik oleh pengguna).

Pertama, kaedah "setDifficulty" perlu dilaksanakan dalam pernyataan if-else butang kesukaran dalam kaedah "proses" dan dalam kaedah "mulakan semula". Garis kod dan kaedah yang dilaksanakan dalam kaedah ini agak mudah. Dalam kaedah "setDifficulty", kami akan menambahkan sejumlah nol (bukan bom) dan sembilan (bom) ke senarai "grid" (melalui dua fungsi jarak dalam setiap pernyataan if-else), dan kemudian kami akan mengacak Senarai "grid" (dengan fungsi shuffle perpustakaan rawak) dalam kaedah "setDifficulty" (setelah pernyataan if-else dijalankan). Nisbah nol ke sembilan akan ditentukan oleh rentetan apa yang diubah oleh pemboleh ubah "kesukaran" ke ("mudah": 34-6, "sederhana": 28-12, "keras": 16-24).

Kedua, dalam kaedah "mulakan semula", kita akan menetapkan pemboleh ubah "indeks" dan "NumOfMinesLEFT" ke sifar secara global, kosongkan senarai "status" dan "grid" secara global, tetapkan semula senarai "status" dengan fungsi julat (menambah empat puluh rentetan watak tunggal "n" ke senarai "status"), dan gunakan kaedah "setDifficulty".

Langkah 6: Senario Akhir Permainan

Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan
Senario Akhir Permainan

PENJELASAN:

Setiap permainan penyapu ranjau mempunyai dua senario akhir permainan: menang dan kalah. Dalam program ini, kami akan melaksanakan dua senario akhir permainan ini dengan dua kaedah baru: kaedah "You_A_Winner_Son" dan kaedah "GameOver". Sebelum GUI disegarkan dalam kaedah "proses" dan berdasarkan indeks yang diubah oleh dua kaedah senario akhir permainan, butang paparan akan diubah untuk mewakili hasilnya dengan tepat.

Pertama, apabila pengguna mengklik jubin tanpa bom terakhir yang tersembunyi, maka kaedah "You_A_Winner_Son" mesti dijalankan. Kami akan menyelesaikan tugas ini dengan memanggil kaedah "You_A_Winner_Son" setiap kali jubin diklik dan jubin tersebut didapati sebagai jubin bukan bom (dalam kaedah "operasi" yang dilaksanakan dalam kaedah "proses"). Sekiranya syarat menang dipenuhi, maka dua pernyataan if-else dalam kaedah "You_A_Winner_Son" akan dilaksanakan. Pernyataan if-else pertama akan selalu dilaksanakan tanpa mengira sama ada pemain menang atau tidak semasa kaedah ini dipanggil. Berdasarkan kepada apa pemboleh ubah "kesukaran" itu, algoritma tertentu yang akan menentukan berapa banyak ranjau / bom yang tersembunyi. Bilangan bulat yang dijumpai oleh algoritma ini akan disimpan dalam pemboleh ubah "NumOfMinesLEFT". Seterusnya, di antara kedua-dua pernyataan if-else algoritma lain akan dijalankan untuk mencari bilangan jubin permulaan yang tinggal (jubin yang tidak diklik). Bilangan bulat yang dijumpai oleh algoritma ini akan disimpan dalam pemboleh ubah "NumOfStartingTilesLEFT". Pernyataan if-else kedua akan selalu dilaksanakan tanpa mengira pemain menang atau tidak semasa kaedah ini dipanggil. Berdasarkan kepada apa pemboleh ubah "kesukaran" itu, satu daripada tiga pernyataan if-else boleh dilaksanakan jika syaratnya dipenuhi. Keadaan akan berdasarkan kepada apa yang sama dengan dua pemboleh ubah "NumOfMinesLEFT" dan "NumOfStartingTilesLEFT". Dalam tiga pernyataan if-else ini, algoritma akan dijalankan yang akan menjadikan setiap butang tidak berguna (permainan sudah berakhir).

Kedua, apabila pengguna mengklik salah satu jubin bom tersembunyi, maka kaedah "GameOver" mesti dijalankan. Kami akan menyelesaikan tugas ini dengan memanggil kaedah "GameOver" setiap kali jubin diklik dan jubin tersebut didapati sebagai jubin bom (dalam kaedah "operasi" yang dilaksanakan dalam kaedah "proses"). Apabila kaedah "GameOver" dipanggil, algoritma akan dijalankan yang akan menjadikan setiap jubin permulaan tidak berguna (permainan berakhir) dan jubin bom tersembunyi akan didedahkan (berdasarkan indeks yang sesuai dalam daftar grid, indeks tertentu dalam senarai "status" akan ditugaskan semula ke rentetan satu huruf "b").

Ketiga, paparan layar dalam permainan akan diperbarui setiap kali GUI disegarkan dengan membuat sedikit pengeditan kecil pada metode "setSLASHresetGUI". Setelah grid GUI dikonfigurasi, kami akan meletakkan tiga pernyataan if-else di mana penugasan butang paparan semasa diletakkan. Salah satu daripada tiga pernyataan if-else akan dilaksanakan berdasarkan kepada apa pemboleh ubah berikut sama dengan: "GameOverDETECTOR", "kesukaran," NumOfMinesLEFT ", dan" NumOfStartingTilesLEFT ". Seperti yang anda mungkin tertanya-tanya, pemboleh ubah" GameOverDETECTOR "adalah baru pemboleh ubah. Pemboleh ubah ini akan dibuat tepat sebelum pernyataan if-else dijalankan dalam kaedah "setSLASHresetGUI". Pemboleh ubah "GameOverDETECTOR" akan sama dengan bilangan bulat yang dijumpai menggunakan algoritma yang menemui berapa banyak indeks dalam "grid" senarai telah ditugaskan kembali ke bilangan bulat sembilan puluh sembilan (bagaimana butang itu tidak berguna). Berdasarkan syarat pernyataan if-else dipenuhi, penugasan yang sesuai untuk paparan akan berlaku.

Langkah 7: Menjadikan Butang Mulakan Semula Beroperasi

Menjadikan Butang Mulakan Semula Beroperasi
Menjadikan Butang Mulakan Semula Beroperasi

PENJELASAN:

Langkah ini berlaku paling pendek. Sebilangan besar kerja untuk langkah ini telah dilakukan. Yang perlu kita lakukan sekarang ialah melaksanakan kaedah "restart" setiap kali butang restart diklik oleh pengguna.

Pertama dan terakhir, kami akan melaksanakan kaedah "mulakan semula" dalam kaedah "proses" dengan pernyataan if-else. Sekiranya rentetan "!" didaftarkan, maka kaedah "restart" akan dijalankan. Kita juga harus membuat butang yang disebut restart pada akhir kaedah "setSLASHresetGUI" sebelum isi grid dikemas bersama. Butang mulakan semula ini akan memproses rentetan "!" (perintah lambda: self.process ("!")) dan jalankan kaedah "restart" yang sesuai dalam kaedah "proses".

Disyorkan: