İçindekiler:

Mayın Tarlası-Raspberry-Pi-Edition: 7 Adım (Resimli)
Mayın Tarlası-Raspberry-Pi-Edition: 7 Adım (Resimli)

Video: Mayın Tarlası-Raspberry-Pi-Edition: 7 Adım (Resimli)

Video: Mayın Tarlası-Raspberry-Pi-Edition: 7 Adım (Resimli)
Video: AI Days - Görüntü İşleme (Computer Vision) | Eftal İnan 2024, Kasım
Anonim
Mayın Tarlası-Raspberry-Pi-Edition
Mayın Tarlası-Raspberry-Pi-Edition
Mayın Tarlası-Raspberry-Pi-Edition
Mayın Tarlası-Raspberry-Pi-Edition

Louisiana Tech Üniversitesi'ndeki CSC 130 serisi için son projem Mayın Tarlası Raspberry Pi Sürümü. Bu projede Python programlama dilinin Tkinter kütüphanesini kullanarak klasik mayın tarama gemisi oyununu yeniden yaratmaya çalıştım. Mayın tarama gemisi oyununun kapsadığı ızgara, sekiz karo genişliğinde ve beş karo yüksekliğindedir. Projenin biçimlendirmesi, Python 2.7 ile kurulmuş bir Raspberry Pi'nin kullanımı için uygun ve mükemmelleştirildi.

Mayın Tarlası Raspberry Pi Edition final projesinin kodu ve görüntüleri aşağıdaki bağlantıdan indirilebilir:

Mayın Tarlası-Raspberry-Pi-Edition

Gereçler

x1 Ahududu Pi

Raspberry Pi'de Python 2.7 Yüklendi

Microsoft Powerpoint (veya düğmeler için görüntü oluşturmak için başka bir yazılım)

Adım 1: Düğme Görüntüleri Oluşturun

Düğme Görüntüleri Oluşturun
Düğme Görüntüleri Oluşturun

AÇIKLAMA:

GUI'yi oluşturan her düğmenin oluşturulması gerekecektir. Bu görev için, düğmelerde göstermem gereken görüntüleri yapmak için Microsoft Powerpoint kullandım.

İlk olarak, Microsoft Powerpoint kullanarak mayın tarama gemisi ızgarasını (boş, bob, sıfır, bir, iki, üç, dört, beş, altı, yedi ve sekiz) yapmak için gereken on döşeme düğmesini oluşturdum.

İkinci olarak menü ekranı için gerekli olan dört resmi (menü ekranı, kolay zorluk butonu, orta zorluk butonu ve zor zorluk butonu) Microsoft Powerpoint kullanarak yaptım.

Üçüncü olarak, Microsoft Powerpoint kullanarak yeniden başlatma düğmesi için gereken görüntüyü ve diğer farklı ekran düğmeleri ("oyun bitti" ekranı, "kazanırsınız" ekranı ve "kurallar" ekranı) için gereken görüntüleri oluşturdum.

Dördüncüsü, resimlerinizi ekranınıza sığacak şekilde yeniden boyutlandırmanız gerekecek. Rasberry Pi'm için pencere için aşağıdaki boyutları kullandım (piksel uzunluk ve genişlik anlamında): 432x576.

Adım 2: Programı Biçimlendirin

Programı Biçimlendir
Programı Biçimlendir

AÇIKLAMA:

Herhangi bir gerçek programlama yapılmadan önce, ihtiyacımız olan kütüphaneleri almalı ve programımızın ana bölümünü yazmalıyız.

İlk olarak, Tkinter kütüphanesinden * almamız ve rastgele kütüphaneden karıştırmamız gerekecek. İkinci olarak, programın ana bölümünde kodda şu adımları tamamlamamız gerekecek: pencereyi oluşturun, başlık penceresini ayarlayın, GUI'yi oluşturun ve GUI'yi görüntüleyin ve kullanıcı etkileşimini bekleyin. Bu kod, Tkinter kitaplığına göre uygun formatta yazılmıştır (uygun formatlamayı görmek için talimatta verilen koda bakın).

Adım 3: GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)

GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)
GUI'yi oluşturun (Menü ve Mayın Tarlası Izgarası)

AÇIKLAMA:

Program başlatıldığında menü ekranı açılacaktır. Zorluk seçildikten sonra (menü ekranındaki zorluk düğmelerinden birine tıklanarak), GUI, mayın tarama gemisi ızgarası, bir ekran ve bir yeniden başlatma düğmesi ile yenilenecektir. GUI üzerinde çalışmaya yeni başladığınız için, sadece menüyü başlatmamız, menü zorluk düğmelerinin çalışır hale gelmesini sağlamamız ve GUI'nin mayın tarama gemisi ızgarası ile oyun ekranına yenilenmesini sağlamamız gerekecek.

İlk olarak, MainGUI sınıfının yapıcısı içindeki "setupMenu" yöntemini çağırarak, program başlatıldığında menü ekranının kendisini göstermesini sağlayabiliriz.

İkinci olarak, bir "process" yöntemi ekleyerek (ayrıca kullanılan düğme işlevinin parametreleri içine lambda: self.process("returnButtonName") komutunu eklememiz gerekecektir) tıklatıldığında menünün zorluk düğmelerinin her birinin belirli kod satırlarını çalıştırmasını sağlayabiliriz. her zorluk düğmesinin oluşturulmasında). "İşlem" yönteminde üç if-else ifadesi oluşturulacak ve düğmenin neye eşit olduğuna bağlı olarak bazı diğer yöntemleri ve ek kod satırlarını yürütecektir (düğme, en son kaydedilen düğme adı ne olursa olsun).

Üçüncüsü, menü ekranı açıkken ve kullanıcı zorluk düğmelerinden birine tıklarsa, program "zorluk" değişkenine belirli bir değer kaydeder (zorluk eşittir "kolay", "orta" veya "zor" tabanlıdır. hangi zorluk düğmesinin tıklandığı kapalı) Bir düğmenin bu tıklanması, en son hangi düğme adının kaydedildiğine (hangi düğmenin eşittir) bağlı olarak hangi if-else ifadesinin izleneceğini bilir. Ek olarak, "zorluk" değişkenini yeniden atamak için önce başlatmamız gerekir Bu yüzden "MainGUI" sınıfı oluşturulmadan önce "zorluk" değişkenini boş bir dize olarak ayarlayacağız.

Dördüncüsü, bir "clearMenu" yöntemi yaparak (birden çok durumda button.destroy() işlevini kullanarak) ve "process" yönteminde (altında) "clearMenu" yöntemini çağırarak "setupMenu" yöntemiyle oluşturulan düğmelerin GUI'sini temizleyin. zorluk düğmesinin her biri, zorluk değişkeni atamasından sonra kaydedilir).

Beşinci olarak, bir "setSLASHresetGUI" yöntemi yaparak (düğmeler "setupMenu" yöntemiyle aynı şekilde yapılır) ve "process" yönteminde "setSLASHresetGUI" yöntemini çağırarak GUI'yi yenileyin (her bir zorluk düğmesinin altında, zorluk değişkeni ataması ve "clearMenu" yöntemini çağırma).

Ayrıca, "setSLASHresetGUI" yönteminde tüm butonlar atanmadan önce, grid içindeki satır ve sütunları yapılandırmalı ve tüm butonlar "setSLASHresetGUI" metodu içinde atandıktan sonra, grid içindeki tüm içerikleri paketlemeliyiz (bkz. uygun biçimlendirmeyi görmek için talimatta verilen kod).

Adım 4: Oyun İçi Ekrandaki Butonları Çalışır Hale Getirin

Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin
Oyun İçi Ekrandaki Düğmeleri Çalışır Hale Getirin

AÇIKLAMA:

Düğmelerin tıklandığında belirli kod satırlarını çalıştırmasını sağlamak için, "işlem" yöntemi içindeki yöntemleri yürütmemiz gerekecek. Bu görev için birden fazla yeni yöntem, değişken ve liste yapmamız gerekecek.

İlk önce iki liste yapacağız. "Izgara" adında bir liste olacak. Bu "ızgara" listesi yalnızca 9 ve 0 tam sayılarından oluşacaktır. Bu listede dokuzlar bombaları, sıfırlar bomba olmayanları temsil edecektir. Program bir karonun bomba olup olmadığını bu şekilde ayırt edecektir. İkinci bir liste yapılacak ve buna "statü" adı verilecek. Bu "durum" listesi yalnızca bir karakter dizisinden oluşur ("0", "1", "2", "3", "4", "5", "6", "7", "8", "b" "). Bu listede, her bir karakter dizisi belirli bir görüntüye karşılık gelecektir. Program, mayın tarama gemisi ızgarasındaki her bir düğmede hangi görüntünün görüntüleneceğini bu şekilde bilecektir. Mayın tarama gemisi ızgarasındaki her düğme, ızgaradaki yerleşimine bağlı olarak her listede karşılık gelen bir dizine sahip olacaktır. Karşılık gelen dizin aşağıdaki prosedürle atanacaktır (düğme numarası - 1). Örneğin, her listede bir düğmenin karşılık gelen indeksi indeks sıfırdır. Son olarak, bu iki liste "MainGUI" sınıfı yürütülmeden önce yürütülecek ve "MainGUI" sınıfının dışında oluşturulacaktır. "grid" sınıfı boş bir liste (grid = ) olarak oluşturulacak ve "durum" listesi bir aralık işlevi tarafından oluşturulacaktır ("durum" listesine "n" nin kırk tek karakterli dizesini ekleyerek).

İkinci olarak, etrafını saran mayın sayısını tespit edebilen ve bir butona tıklandığında çağrılabilecek çeşitli metotlar yapacağız (hangi metodun uygulanacağına butonun yerleşimine göre karar verilecektir). Bu yöntemlere bizim maden analizörlerimiz denilecektir. Bu yöntemler, "NumOfMines" adlı bir sayacı artıracak ve karoyu kaç bombanın çevrelediğini belirlemek için "ızgara" listesindeki belirli dizinleri kullanacaktır. "NumOfMines" değişkeninde saklanacak dize, "durum" listesindeki aynı ilgili dizini değiştirmek için kullanılacaktır. Şimdi, programın hangi dizini kullanacağını nasıl bileceğini merak edebilirsiniz. "İşlem" yöntemine bir düğme kaydedildiğinde, belirli bir tamsayıya (düğmenin kaydettiği dizeye bağlı olarak) bir "indeks" değişkeni oluşturulur/yeniden atanır. Oluşturulan yöntemlerden biri, karonun yerleşimini ve onu çevreleyen karoların dizinlerini bilmek için bu atanan dizini kullanacaktır (yöntem içindeki algoritma bunu çözecektir). Ek olarak, "index" değişkenini yeniden atamak için önce onu sınıfın dışında somutlaştırmamız gerekecek. Bu nedenle, "MainGUI" sınıfı oluşturulmadan önce "index" değişkenini sıfır tamsayı olarak ayarlayacağız.

Üçüncüsü, "operasyon" yöntemleri oluşturulacaktır. Her düğme kaydedildiğinde bir "işlem" yöntemi yürütülecektir. Bu "işlem" yöntemleri, "işlem" yönteminde yürütülecektir. "İşlem" yönteminde, birden çok if-else ifadesi hangi düğmenin tıklandığını belirleyecektir (düğmenin neye eşit olduğuna bağlı olarak). Bu, belirli bir "işlem" yönteminin çağrılacağı yerdir (if-else ifadelerinde).

Dördüncüsü, aslında düğmelerin nasıl çalışır hale geldiğine gireceğiz. Daha önce belirtildiği gibi, birden çok if-else ifadesi "işlem" yönteminde bulunur ve düğmenin neye eşit olduğuna bağlı olarak diğer belirli yöntemleri ve ek kod satırlarını yürütür (düğme, en son kaydedilen dize ne olursa olsun eşittir). Bu if-else deyimleri içinde, sırayla aşağıdakiler gerçekleşecektir: dizin global olarak atanacak, "durum" listesindeki karşılık gelen dizin "b" dizgisine yeniden atanacak ("ızgara" listesinin karşılık gelen dizini eşitse dokuz tamsayı), karşılık gelen bir "işlem" yöntemi yürütülecektir ("ızgara" listesinin karşılık gelen dizini sıfır tamsayıya eşitse), "durum" listesindeki karşılık gelen dizin, değişkene eşit olan bir dizeye yeniden atanacaktır "NumOfMines" ("ızgara" listesinin karşılık gelen dizini sıfır tamsayıya eşitse) ve GUI, "setSLASHresetGUI" yöntemi çağrılarak yenilenecektir.

Adım 5: "setDifficulty" Yöntemi ve "yeniden başlatma" Yöntemi

resim
resim
resim
resim

AÇIKLAMA:

Ardından, bir "setDifficulty" yönteminin oluşturulması gerekecek ve oyun içi ekranın alt kısmında bulunan yeniden başlatma düğmesinin çalışır hale gelmesi gerekecek (kullanıcı tarafından tıklandığında yürütülmesi için bir "yeniden başlatma" yöntemi oluşturarak)).

Öncelikle “process” yönteminde ve “restart” yönteminde zorluk butonlarının if-else ifadelerinde “setDifficulty” yönteminin uygulanması gerekecektir. Bu yöntemde yürütülen kod satırları ve yöntemler oldukça basittir. "setDifficulty" yönteminde, "ızgara" listesine belirli bir miktarda sıfır (bomba olmayan) ve dokuz (bomba) ekleyeceğiz (her if-else ifadesinde iki aralık işlevi aracılığıyla) ve sonra karıştıracağız. "setDifficulty" yönteminde (if-else ifadeleri yürütüldükten sonra) "ızgara" listesi (rastgele kitaplığın karıştırma işleviyle birlikte). Sıfırların dokuza oranı, "zorluk" değişkeninin hangi dizeye ayarlandığına göre belirlenir ("kolay": 34-6, "orta": 28-12, "zor": 16-24).

İkinci olarak, "restart" yönteminde, "index" ve "NumOfMinesLEFT" değişkenlerini global olarak sıfırlayacağız, hem "durum" hem de "grid" listelerini global olarak boşaltacağız, "durum" listesini bir aralık işleviyle sıfırlayacağız (ekleyerek "n"den "durum" listesine kırk tek karakter dizisi) ve "setDifficulty" yöntemini çağırın.

6. Adım: Oyunu Bitirme Senaryoları

Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları
Oyun Bitirme Senaryoları

AÇIKLAMA:

Her mayın tarama gemisi oyununda iki oyun sonu senaryosu vardır: kazanma ve kaybetme. Bu program dahilinde, bu iki oyun bitirme senaryosunu iki yeni yöntemle uygulayacağız: "You_A_Winner_Son" yöntemi ve "GameOver" yöntemi. GUI, "süreç" yöntemi içinde ve iki oyun sonu senaryosu yöntemiyle değiştirilen dizinlere dayalı olarak yenilenmeden önce, sonucu doğru şekilde temsil etmek için görüntüleme düğmesi değiştirilecektir.

İlk olarak, kullanıcı son gizli bomba olmayan kutucuğa tıkladığında, "You_A_Winner_Son" yöntemi çalıştırılmalıdır. Bir döşemeye her tıklandığında ve döşemenin bomba olmayan bir döşeme olduğu tespit edildiğinde ("işlem" yönteminde yürütülen "işlem" yöntemleri içinde) "You_A_Winner_Son" yöntemini çağırarak bu görevi tamamlayacağız. Kazanma koşulları karşılanırsa, "You_A_Winner_Son" yöntemi içinde iki if-else ifadesi yürütülür. İlk if-else ifadesi, bu yöntem çağrıldığında oyuncunun kazanıp kazanmadığına bakılmaksızın her zaman yürütülür. "Zorluk" değişkeninin neye eşit olduğuna bağlı olarak, kaç tane mayın/bomba gizli kaldığını belirleyen belirli bir algoritma. Bu algoritma tarafından bulunan tam sayı, "NumOfMinesLEFT" değişkenine kaydedilecektir. Daha sonra, iki if-else ifadesi arasında, kalan başlangıç döşemelerinin (tıklanmamış döşemelerin) sayısını bulmak için başka bir algoritma yürütülür. Bu algoritma tarafından bulunan tam sayı, "NumOfStartingTilesLEFT" değişkenine kaydedilecektir. İkinci if-else ifadesi, bu yöntem çağrıldığında oyuncunun kazanıp kazanmadığına bakılmaksızın her zaman yürütülür. "Zorluk" değişkeninin neye eşit olduğuna bağlı olarak, koşulları karşılanırsa üç if-else ifadesinden biri yürütülebilir. Koşullar, "NumOfMinesLEFT" ve "NumOfStartingTilesLEFT" değişkenlerinin neye eşit olduğuna bağlı olacaktır. Bu üç if-else deyimi içinde, her düğmeyi işe yaramaz hale getirecek bir algoritma yürütülecektir (oyun biter).

İkincisi, kullanıcı gizli bomba döşemelerinden birine tıkladığında, "GameOver" yöntemi çalıştırılmalıdır. Bu görevi, bir döşemeye her tıklandığında ve döşemenin bir bomba döşemesi olduğu tespit edildiğinde ("işlem" yönteminde yürütülen "işlem" yöntemleri içinde) "GameOver" yöntemini çağırarak tamamlayacağız. "GameOver" yöntemi çağrıldığında, her başlangıç karosunu işe yaramaz hale getirecek bir algoritma yürütülür (oyun biter) ve gizli bomba karoları ortaya çıkar ("ızgara listesi, belirli dizinler" içindeki karşılık gelen dizinlere göre). "durum" listesinde, tek karakterli "b" dizesine yeniden atanacaktır).

Üçüncüsü, oyun içi ekranın görüntüsü, "setSLASHresetGUI" yönteminde çok az küçük düzenleme yapılarak GUI her yenilendiğinde güncellenecektir. GUI'nin ızgarası yapılandırıldıktan sonra, mevcut ekran düğmesi atamasının yerleştirildiği üç if-else ifadesi yerleştireceğiz. Üç if-else ifadesinden biri, aşağıdaki değişkenlerin neye eşit olduğuna bağlı olarak yürütülür: "GameOverDETECTOR", "difficulty, "NumOfMinesLEFT" ve "NumOfStartingTilesLEFT". Merak etmiş olabileceğiniz gibi, "GameOverDETECTOR" değişkeni yeni bir değişkendir. Bu değişken, "setSLASHresetGUI" yönteminde if-else ifadeleri yürütülmeden hemen önce oluşturulacaktır. "GameOverDETECTOR" değişkeni, "grid" içinde kaç tane dizin bulan bir algoritma kullanılarak bulunan tam sayıya eşit olacaktır. liste doksan dokuz tamsayısına yeniden atanmıştır (düğmelerin nasıl işe yaramaz hale getirildiği). Hangi if-else ifadesinin koşullarının karşılandığına bağlı olarak, ekrana karşılık gelen bir yeniden atama gerçekleşecektir.

7. Adım: Yeniden Başlatma Düğmesini Çalıştırma

Yeniden Başlatma Düğmesini Çalıştırma
Yeniden Başlatma Düğmesini Çalıştırma

AÇIKLAMA:

Bu adım en kısa olur. Bu adım için yapılan çalışmaların çoğu zaten yapıldı. Şimdi yapmamız gereken tek şey, kullanıcı tarafından yeniden başlat düğmesine her tıklandığında "yeniden başlatma" yöntemini yürütmek.

İlk ve son olarak if-else deyimi ile "process" metodunda "restart" metodunu çalıştıracağız. Eğer "!" kaydedilir, ardından "yeniden başlatma" yöntemi yürütülür. Ayrıca grid içerikleri bir araya toplanmadan önce "setSLASHresetGUI" metodunun sonunda restart adında bir buton oluşturmamız gerekecek. Bu yeniden başlatma düğmesi "!" dizesini işleyecektir. (komut lambda: self.process("!")) ve ilgili "restart" yöntemini "process" yöntemi içinde yürütün.

Önerilen: