Hari ini kita akan mengkaji bahagian dalam permainan Tetris yang ditulis di bawah platform arduino dan matriks LED.
Pengarang produk buatan sendiri ini ialah AlexGyver, pengarang saluran YouTube dengan nama yang sama. Selamat datang ke dunia piksel persegi indah.
Mari kita mulakan dengan cerita itu. Tetris adalah permainan di mana angka yang terdiri daripada 4 kotak jatuh dari atas ke bawah. Dalam kombinasi yang berbeza, bentuk ini boleh diputar dan bergerak ke kiri dan ke kanan. Matlamat permainan ini adalah untuk mengumpul tahap mendatar yang dibersihkan dan mata diberikan kepada anda. Kehilangan dianggap saat ketika angka baru tidak dapat diturunkan. Tetris telah dicipta oleh programmer Soviet Alexei Leonidovich Pazhitnov.
Versi Pascal yang asal muncul pada 6 Jun 1984. Sejak itu, Tetris telah datang jauh dan telah dialihkan ke semua platform di mana ia biasanya mungkin untuk bermain permainan, dan juga untuk peranti yang tidak dimaksudkan untuk permainan sama sekali, seperti kalkulator kejuruteraan, osiloskop dan, anda tidak akan percaya, besi pematerian.
Dengan bilangan versi komersial yang dijual, Tetris lebih hebat daripada permainan lain dalam sejarah umat manusia. Untuk hanya satu Permainan Boy, 35 juta eksemplar telah dijual, belum lagi Permainan bata mudah alih, yang hampir semuanya ada pada satu masa.
Kami akan memulakan pelaksanaan tetris pada arduino dan matriks warna dengan analisis "tongkat". Matriks terdiri daripada tiga alamat warna LED. Masalah dengan jenis matriks ini adalah terlalu keren. Warna setiap piksel dikodkan dengan 24 bit, iaitu, 8 bit untuk setiap komponen: merah, hijau dan biru. Tidak ada jenis data seperti arduino, ada yang berikut - 32 bit.
Warna-warna semua LED perlu disimpan dalam RAM, kerana kami akan mengubahnya. Dan di samping itu, untuk 16 oleh 16 matriks, kita mempunyai 1 KB memori dinamis yang diduduki, dan arduino nano hanya mempunyai 2 daripadanya.
Tambah beberapa lagi perpustakaan dan mula menulis kod, ingatan akan berakhir. Penulis pada dasarnya tidak menggunakan, sebagai contoh, arduino mega, di mana terdapat lebih banyak ingatan. Matlamatnya adalah untuk membuat permainan khusus pada arduino nano, menggunakan alat mudah, standard dan terkenal, tetapi pada masa yang sama pendekatan tidak standard dan "kruk" dan dengan bantuan mereka mencapai kod yang paling optimum.
"Crutch" yang pertama adalah penolakan untuk menyimpan secara berasingan dalam memori kedudukan angka dan, secara umum, segala yang terjadi pada skrin.Kita perlu menyimpan koordinat titik-titik angka makan dan koordinat titik-titik angka yang telah dijatuhkan, iaitu maksimum, kita perlu satu lagi array, dua dimensi 16 oleh 16, dan ini sebanyak 256 bait.
Anda dan saya sudah mempunyai pelbagai warna untuk semua piksel, mari menggunakannya. Malah, sebagai tambahan kepada hakikat bahawa kita boleh meletakkan titik berwarna pada matriks, kita dapat mengukur cahaya titik sedia ada supaya kita bekerja dengan warna.
Tetris bermula dengan blok jatuh, yang dikawal oleh butang dan mempunyai 2 koordinat dalam sistem koordinat matriks. Ia sangat mudah, kami membina pemasa, mengikut mana blok akan jatuh. Ini adalah perpustakaan penulis, anda boleh membaca di laman web ini.
Untuk memproses butang, penulis juga menggunakan perpustakaannya. Skema sambungan butang adalah dengan mudah: 4 butang, 8 wayar.
Setiap langkah pemasa, kita menarik titik piksel di bawah yang lama, dan lukiskan titik lama dalam hitam, yakni mematikan LED. Dengan mengklik pada butang, kami melakukan perkara yang sama, tetapi dengan koordinat mendatar. Nah, untuk kesopanan, kita akan mengehadkan saiz matriks supaya titik itu tidak melampaui medan.
Lihat, tidak ada yang rumit. Tetapi ini tidak lama kerana masa telah datang untuk menarik angka. Kami akan bekerja seperti berikut: kami akan terus merujuk kepada titik bekalan, yang telah kami tulis, kami akan memanggilnya sebagai titik utama atau blok utama. Blok utama bergerak dalam sistem koordinat matriks, kita telah melakukan ini. Semua angka Tetris terdiri daripada 4 blok, oleh sebab itu, ia dipanggil Tetris.
Oleh itu, ia tetap untuk kami menyelesaikan menambah 3 lagi blok ke blok utama. Mari tulis koordinat mereka dalam sistem koordinat blok utama, supaya blok utama sentiasa di bawah. Sangat mudah, ambil gambar huruf terbalik T. Blok utama dari bawah ke tengah mempunyai koordinat 0.0 dalam sistem koordinatnya.
Blok atas adalah 0.1, hak adalah 1.1 dan kiri adalah -1.1.
Ambil huruf G. Blok yang lebih rendah ialah 0.0, 0.1 seterusnya, 0.2 seterusnya dan kelebihan surat 1.2.
Kami menulis koordinat ini ke dalam array dalam bentuk berikut: {0.1, 0.2, 1.2} dan jatuhkan array ke dalam memori kilat supaya tidak membazirkan memori dinamik. Mengenai putaran angka. Tidak mustahil untuk memutar angka-angka. Ia adalah sukar untuk menjelaskan kepada mikrokontroler bagaimana untuk melakukan ini. Untuk melakukan ini, anda perlu menetapkan pusat putaran, entah bagaimana menguraikan angka itu menjadi bahagian dan mencari koordinat baru untuk setiap bahagian, dengan mengambil kira piksel yang kuat, yang jelas akan membawa kepada kesilapan dan mendapatkan karut. Masalahnya diselesaikan sangat mudah, kita akan menyimpan ingatan semua 4 kedudukan untuk semua angka dan semua.
Sebenarnya, sekarang ia tetap memilih nombor angka secara rawak dan melukisnya di sekeliling blok jatuh. Di sini, untuk semua 3 baki blok, kami mengambil koordinat dari memori flash, menterjemahkannya ke dalam koordinat global matriks, dan hidupkan LED. Dengan cara ini, warna juga dipilih secara rawak dari 6 warna paling mudah dan terang ruang rgb. Sudut putaran angka pada awal pusingan juga ditetapkan secara rawak, dan apabila anda menekan butang ke atas, hanya mengambil set koordinat seterusnya untuk menarik dan memutarnya mengikut arah jam. Melangkah bentuk kerja semuanya sama. Pertama, kita memadam angka itu pada kedudukan terdahulu, iaitu, menariknya dalam warna hitam, kemudian di kedudukan baru itu menggambar warna semasa. Apabila beralih, sekali lagi, kami memadamkan kedudukan lama dan hanya menarik yang baru.
Firmware boleh dimuat turun di. Kami hanya akan menganalisis intipati. Mari kita mulakan dengan memeriksa dinding kiri dan kanan dan bawah. Segala-galanya sangat mudah dengan bahagian bawah, kita melihat setiap langkah kejatuhan, unit asas mencapai ketinggian 0, ini tidak sukar, tetapi setiap kali kita tekan butang kawalan kita perlu melihat jika titik melampau angka menyentuh dinding sisi matriks.
Jika disentuh, jangan gerakkan angka itu. Begitu juga untuk putaran angka. Sebagai contoh, jika kedudukan baru angka meluas di luar dinding, maka putaran dilarang, dan kerana semua bentuk yang kita ada adalah bentuk yang berbeza, maka blok yang melampau bagi mereka semua berbeza. Ia mungkin untuk melukis blok individu yang melampau bagi setiap angka untuk memudahkan kerja pengawal mikrokontroler, tetapi biarkan ia dianggap bahawa mereka menciptanya untuk ini.
Semuanya sangat mudah. Tetapi tugas seterusnya adalah lebih menarik. Kita perlu menyemak pelanggaran dengan blok yang sudah berbaring di bawah.Jika kita mempunyai array yang mengandungi keadaan semua sel di dalam bidang, akan lebih mudah, tetapi kita akan menggunakan pelbagai warna untuk piksel pita, jadi kita akan mempunyai "crutch" yang paling keren. Apakah masalah sebenar? Semuanya seolah-olah mudah, angka hijau akan jatuh, dan setiap langkah kejatuhan, setiap pergeseran ke sisi dan setiap percubaan untuk menghidupkan harus memeriksa sama ada angka dalam kedudukan baru terletak pada angka-angka yang sudah berbohong. Jika bagi semua blok warna sekitar sama dengan hitam atau sama dengan warna angka, maka kami membenarkan pergerakan ke arah yang dikehendaki. Ini akan berfungsi sehingga bentuk di bawah kita adalah warna yang sama dengan bentuk yang jatuh. Itulah sebenarnya "kruk": kita akan mengecat semula bentuk yang jatuh dalam warna yang berbeza. Repaint tidak kelihatan untuk mata, tetapi ketara untuk program. Apa yang anda perlu lakukan sedikit meningkatkan kecerahan warna semasa bentuk dan itu sahaja.
Angka itu jatuh di bawah atau angka lain, kecerahannya tidak meningkat dengan ketara, dan dalam pusingan baru angka-angka yang jatuh tidak akan lagi mengelirukan warna dengan mereka sendiri, mereka akan jatuh di atasnya dan hanya tetap, sedikit menambah kecerahan.
Dengan cara ini, apabila anda menekan butang ke bawah, angka bergegas ke kelajuan tinggi dan mengambil tempatnya.
Tetris kami ditinggalkan dengan sentuhan akhir, iaitu memeriksa dan mengosongkan tahap yang diisi secara mendatar. Semuanya mudah di sini. Selepas menetapkan angka dalam pusingan semasa, kami bergerak sepanjang garis dan membandingkan warna piksel dengan hitam. Sekiranya tidak ada piksel hitam tunggal di seluruh baris, maka kami akan membersihkan seluruh baris.
Garis yang dikesan dipenuhi dengan putih, maka kecerahan secara beransur-ansur turun ke sifar dan animasi diperolehi. Selanjutnya, semua piksel, bermula dari baris yang pertama diisi ke atas, dipindahkan ke bawah dan bilangan baris yang telah dibersihkan. Proses ini diulang sehingga tiada tahap yang lengkap. Kami juga memeriksa sama ada kita telah mencapai puncak, yang bermaksud kehilangan. Dalam kes ini, akaun yang sama dengan bilangan paras yang dibersihkan dipaparkan.
Akaun dipaparkan dalam nombor, yang disimpan di dalam memori sebagai satu set orang dan nol, di mana LED kemudian dihidupkan atau dimatikan. Inilah yang ditulis Tetris dalam matriks alamat seperti. Terima kasih atas perhatian anda. Lihat awak tidak lama lagi!
Video: