» elektronik » Arduino »Arduino'da Tetris Yapımı

Arduino'da Tetris Yapımı

selamlar sitemizin sakinleri!
Bugün platform altında yazılan Tetris oyununun içini inceleyeceğiz arduino ve LED matrisi.

Bu ev yapımı ürünün yazarı, aynı adlı YouTube kanalının yazarı AlexGyver'dir. Kare piksellerin harika dünyasına hoş geldiniz.

Hikayeyle başlayalım. Tetris, 4 kareden oluşan figürlerin yukarıdan aşağıya düştüğü bir oyundur. Farklı kombinasyonlarda, bu şekiller döndürülebilir ve sola ve sağa hareket ettirilebilir. Oyunun amacı temizlenen yatay seviyeleri toplamak ve puanları size vermektir. Kaybetmek, yeni figürün düşeceği hiçbir yer olmadığı düşünülür. Tetris, Sovyet programcısı Alexei Leonidovich Pazhitnov tarafından icat edildi.

Orijinal Pascal sürümü 6 Haziran 1984'te çıktı. O zamandan beri Tetris uzun bir yol kat etti ve genellikle oyun oynamanın mümkün olduğu tüm platformlara ve ayrıca bir mühendislik hesap makinesi, osiloskop ve bir havya gibi hiç oyun için tasarlanmamış cihazlara taşındı.



Satılan ticari versiyon sayısına göre Tetris, insanlık tarihindeki diğer oyunlardan daha üstündür. Sadece bir Game Boy için, neredeyse hepsi bir kerede olan taşınabilir Tuğla Oyunundan bahsetmemek için 35 milyon kopya satıldı.
Arduino üzerinde tetris ve “koltuk değneği” analizi ile bir renk matrisi uygulanmaya başlayacağız. Matris, üç renkli adres LED'lerinden oluşur. Bu tip matrisin problemi çok soğuk olmasıdır. Her pikselin rengi 24 bit ile kodlanır, yani her bileşen için 8 bit: kırmızı, yeşil ve mavi. Arduino'da böyle bir veri türü yoktur, aşağıdakiler vardır - 32 bit.

Tüm LED'lerin renkleri, değiştireceğimiz için RAM'de saklanmalıdır. Ek olarak, 16 x 16 matris için tam olarak 1 KB dolu dinamik belleğe sahibiz ve arduino nano'nun bunlardan sadece 2 tanesi var.

Birkaç kitaplık daha ekleyin ve kod yazmaya başlayın, bellek sona erecek. Yazar temelde daha fazla belleğin olduğu arduino mega'yi kullanmaz. Amaç, basit, standart ve iyi bilinen araçları kullanarak arduino nano'da oyunu yapmak, ancak aynı zamanda standart dışı yaklaşımlar ve "koltuk değnekleri" ve onların yardımıyla en uygun kodu elde etmektir.

İlk “koltuk değneği”, figürlerin konumlarını ve genel olarak ekranda gerçekleşen her şeyi ayrı ayrı hafızaya kaydetmeyi reddetmek olacaktır.Besleme figürünün noktalarının koordinatlarını ve zaten düşmüş figürlerin noktalarının koordinatlarını saklamamız gerekiyor, yani maksimum olarak başka bir 1 diziye, iki boyutlu 16'ya 16'ya ihtiyacımız var ve bu 256 bayt kadar.

Sen ve ben zaten tüm pikseller için bir renk dizimiz var, hadi kullanalım. Gerçekten de, matrise renkli bir nokta koyabilmemize ek olarak, mevcut bir noktanın ışığını ölçebiliriz, böylece renklerle çalışırız.

Tetris, düğmeler tarafından kontrol edilen ve matris koordinat sisteminde 2 koordinatı olan düşen bir blokla başlar. Çok basit, bloğun düşeceği bir zamanlayıcı oluşturuyoruz. Bu yazarın kütüphanesidir, sitede okuyabilirsiniz.

Düğmeleri işlemek için yazar ayrıca kütüphanesini kullanır. Düğmelerin bağlantı şeması gülünç derecede basittir: 4 düğme, 8 tel.

Zamanlayıcının her adımı, eskisinin altına bir piksel çizer ve eski noktayı siyah olarak çizeriz, yani LED'i kapatırız. Düğmeye tıklayarak, aynısını yapıyoruz, ancak yatay bir koordinatla. Ahlaksızlık için, matrisin boyutunu sınırlayacağız, böylece nokta alanın ötesine geçmeyecek.

Bakın, karmaşık bir şey yok. Ama bu uzun sürmedi çünkü rakamları çizme zamanı geldi. Aşağıdaki gibi çalışacağız: daha önce yazmış olduğumuz tedarik noktasına referans tutacağız, ana nokta veya ana blok olarak adlandıracağız. Ana blok matris koordinat sisteminde hareket eder, bunu zaten yaptık. Tetris'in tüm figürleri 4 bloktan oluşur, bu yüzden Tetris denir.

Buna göre, ana bloğa 3 blok daha eklemeyi bitirmemiz gerekiyor. Koordinatlarını ana bloğun koordinat sistemine yazalım, böylece ana blok her zaman aşağıda olur. Çok basit, ters harf T rakamını alın. Alttan merkeze doğru ana blok koordinat sisteminde 0.0 koordinatlarına sahiptir.

Üst blok 0.1, sağ 1.1 ve sol -1.1'dir.

G harfini alın. Alt blok 0.0, sonraki 0.1, sonraki 0.2 ve 1.2 harfinin kenarıdır.

Bu koordinatları diziye şu biçimde yazarız: {0.1, 0.2, 1.2} ve dinamik belleği boşa harcamamak için diziyi flash belleğe bırakırız. Şekillerin dönüşüne gelince. Rakamları döndürmek imkansızdır. Bu nasıl yapılacağını mikrodenetleyiciye açıklamak çok zordur. Bunu yapmak için, dönüş merkezini ayarlamanız, bir şekilde figürü parçalara ayırmanız ve her parça için yeni koordinatlar aramanız gerekir, bu da açık hatalara yol açacak ve saçmalıklara yol açacaktır. Sorun çok basit bir şekilde çözüldü, tüm rakamlar ve her şey için 4 konumu da hafızada tutacağız.

Aslında, şimdi rakam numarasını rastgele seçmek ve düşen blokun etrafında çizmek kalır. Burada, kalan tüm 3 blok için, flash bellekten koordinatları alır, bunları matrisin küresel koordinatlarına çevirir ve LED'leri açarız. Bu arada, renk de rgb alanının en basit ve parlak 6 renginden rastgele seçilir. Turun başlangıcında şeklin dönme açısı da rastgele ayarlanır ve düğmeye yukarı bastığınızda, saat yönünde çizmek ve döndürmek için bir sonraki koordinat setini almanız yeterlidir. Bir şekli taşımak aynı şekilde çalışır. İlk olarak, figürü bir önceki konumda sileriz, yani siyah olarak çizeriz, daha sonra yeni konumda şeklin geçerli rengini çizeriz. Döndürürken tekrar eski pozisyonu siliyoruz ve sadece yeni bir pozisyon çiziyoruz.

Bellenim adresinden indirilebilir. Sadece özü analiz edeceğiz. Sol ve sağ duvarları ve tabanı kontrol ederek başlayalım. Her şey altta çok basit, düşüşün her adımına bakıyoruz, ana ünite 0 yüksekliğe ulaştı, bu zor değil, ancak kontrol düğmesine her bastığımızda, matrisin yan duvarlarının şeklinin en uç noktasının dokunup dokunmadığını görmeliyiz.

Dokunulursa, şekli hareket ettirmeyin. Aynı şey rakamların dönüşü için de geçerlidir. Örneğin, şeklin yeni pozisyonu duvarların ötesine uzanırsa, dönme yasaktır ve sahip olduğumuz tüm şekiller farklı şekillere sahip olduklarından, bunlar için aşırı blokların hepsi farklıdır. Mikrodenetleyicinin çalışmasını basitleştirmek için her şekil için ayrı ayrı aşırı bloklar boyamak mümkün olacaktır, ancak bunun için icat ettikleri düşünülmelidir.

Her şey çok basit. Ancak bir sonraki görev çok daha ilginç. Zaten aşağıda yatan bloklarla çarpışmaları kontrol etmeliyiz.Alandaki tüm hücrelerin durumunu içeren bir dizimiz olsaydı, daha kolay olurdu, ancak bandın pikselleri için bir renk dizisi kullanacağız, bu yüzden en havalı “koltuk değneği” ne sahip olacağız. Asıl sorun nedir. Her şey basit gibi görünüyor, yeşil bir figür düşecek ve düşüşün her adımı, yana doğru her vardiya ve her dönüş denemesi, yeni pozisyondaki figürün zaten yalancı figürlere dayanıp dayanmadığını kontrol etmelidir. Tüm bloklar için çevredeki renk siyaha eşit veya şeklin rengine eşitse, istenen yönde harekete izin veririz. Bu, altımızdaki şekil, düşen şekil ile aynı renk oluncaya kadar çalışacaktır. Bu aslında “koltuk değneği”: Düşen şekli farklı bir renkte yeniden boyayacağız. Gözler için farkedilemez şekilde yeniden programlayın, ancak program için fark edilir. Tek yapmanız gereken şeklin mevcut renginin parlaklığını biraz artırmak ve hepsi bu.


Rakam tabana veya başka bir şekle düştü, parlaklığı belirgin bir şekilde artmadı ve yeni turda düşen figürler artık rengini kendi başlarına karıştırmayacak, üzerine düşecek ve sabit olarak, biraz parlaklık ekleyecekler.

Bu arada, düğmeye bastığınızda, şekil yüksek bir hızda aşağı iner ve yerini alır.

Tetrisimiz son dokunuşla bırakılır, yani doldurulmuş seviyeleri yatay olarak kontrol eder ve temizler. Burada her şey basit. Mevcut turdaki şekli sabitledikten sonra çizgiler boyunca hareket eder ve piksellerin renklerini siyahla karşılaştırırız. Tüm çizgide tek bir siyah piksel yoksa, tüm çizgiyi temizleyeceğiz.


Tespit edilen çizgiler beyazla doldurulur, daha sonra parlaklık yavaş yavaş sıfıra düşer ve animasyon elde edilir. Ayrıca, ilk doldurulmuş çizgiden başlayarak tüm pikseller aşağı kaydırılır ve silinen satır sayısı. Bu işlem, tamamlanmış seviye kalmayana kadar tekrarlanır. Ayrıca zirveye ulaşıp ulaşmadığımızı da kontrol ediyoruz, yani kaybetmek demek. Bu durumda, temizlenen düzey sayısına eşit bir hesap görüntülenir.

Hesap, LED'lerin daha sonra açılıp kapatıldığı bir dizi ve sıfır olarak hafızada saklanan sayılarla görüntülenir. Adres matrisinde yazılmış Tetris böyle görünüyor. İlginiz için teşekkürler. Yakında görüşürüz!

video:
10
10
10

Yorum ekle

    • gülümsegülümsemelerxaxatamamdontknowyahoonea
      patronçizikaptalevetevet-evetagresifgizli
      üzgünümdansdance2dance3pardonyardımiçecekler
      Durarkadaşlariyigoodgooddüdükbaygınlıkdil
      dumanzırıltıcraybeyanalaycıDon-t_mentionindir
      ısıöfkelilaugh1mdatoplantımoskingnegatif
      Not_ipatlamış mısırcezalandırmakokumakkorkutmakkorkutuyorarama
      alaythank_youbuto_clueumnikakutanlaşmak
      kötübeeeblack_eyeblum3kızarmakövünçcan sıkıntısı
      sansürlüşakasecret2tehdit etmekzaferyusun_bespectacled
      shokrespektlolPrevedkarşılamaKrutoyya_za
      ya_dobryiyardımcıne_huliganne_othodiFludyasakyakın

Okumanızı tavsiye ederiz:

Akıllı telefon için verin ...