本文实例为大家分享了java实现俄罗斯方块的具体代码,供大家参考,具体内容如下
Simpan peta game menggunakan array 2D:
// 游戏地图格子,每个格子保存一个方块,数组纪录方块的状态private State map[][] = new State[rows][columns];
Inisialisasi semua kisi di peta untuk mengosongkan sebelum permainan:
/* Menginisialisasi semua blok menjadi kosong*/untuk (int i = 0; i <map.length; i ++) {for (int j = 0; j <peta [i] .length; j ++) {peta [i] [j] = state.empty; }}During the game, we can see the blocks on the interface, so we have to draw all the blocks in the map. Tentu saja, selain menggambar blok, poin permainan dan akhir permainan juga perlu ditarik bila perlu:
/*** Gambar konten formulir, termasuk blok game, poin game atau string end*/@overridepublic void cat (grafik g) {super.paint (g); untuk (int i = 0; i <rows; i ++) {for (int j = 0; j <kolom; j ++) {if (peta [i] [j] == state.active) {// Gambar blok aktif g.setColor (activeColor); g.fillroundrect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); } else if (peta [i] [j] == state.stoped) {// Gambar blok statis g.setColor (stopedColor); g.fillRoundRect(j * BLOCK_SIZE, i * BLOCK_SIZE + 25, BLOCK_SIZE - 1, BLOCK_SIZE - 1, BLOCK_SIZE / 5, BLOCK_SIZE / 5); }}} /* Cetak skor* / g.setColor (scorecolor); g.setfont (font baru ("Times New Roman", Font.Bold, 30)); g.drawString("SCORE : " + totalScore, 5, 70); // Game berakhir, cetak string akhir if (! Is akanon) {g.setColor (color.red); g.setFont(new Font("Times New Roman", Font.BOLD, 40)); g.drawString("GAME OVER !", this.getWidth() / 2 - 140, this.getHeight() / 2); }}Beberapa jenis grafik yang terdiri dari kotak dihasilkan oleh angka acak. Secara umum, tujuh jenis grafik: batang, bidang, reguler 7, terbalik 7, berbentuk T, berbentuk z dan berbentuk z terbalik, seperti menghasilkan batang:
peta [0] [randpos] = peta [0] [randpos - 1] = peta [0] [randpos + 1] = peta [0] [randpos + 2] = state.active;
Setelah menghasilkan grafik, keberadaannya diimplementasikan. Jika Anda menghadapi hambatan, Anda tidak dapat terus jatuh:
isfall = true; // Apakah itu bisa jatuh // periksa dari baris saat ini, hentikan musim gugur jika hambatan ditemui untuk (int i = 0; i <blockrows; i ++) {for (int j = 0; j <kolom; j ++) {// jika blok di garis adalah blok aktif, blok adalah blok statis, blok itu ditemui IF (peta & peta (peta & rowex (JACKE/ JEGRICE [JACKE = JECKEX (JACKE/ JECKE (JACKE/ JLICEX. i + 1][j] == State.STOPED) { isFall = false; // Hentikan istirahat musim gugur; }} if (! isfall) break;}Jika tidak ada hambatan yang ditemui, diagram blok akan bergerak ke bawah satu baris secara keseluruhan:
// Grafik jatuh satu baris untuk (int i = 0; i <blockrows; i ++) {for (int j = 0; j <columns; j ++) {if (peta [rowindex - i] [j] == state.active) {// blok aktif turun satu peta baris [rowindex - i] [j] = state.empry; // blok aktif asli menjadi peta blok kosong [rowindex - i + 1] [j] = state.active; // Baris blok berikutnya menjadi blok aktif}}}Operasi serupa adalah saat bergerak ke kiri dan kanan:
/** * Go left*/private void left() { // Mark whether there is an obstacle on the left boolean hasBlock = false; /* Periksa apakah ada hambatan di sebelah kiri*/ untuk (int i = 0; i <blockrows; i ++) {if (peta [rowindex - i] [0] == state.active) {// Periksa apakah kiri adalah hasblock dinding = true; merusak; // There is an obstacle, do not need to loop to judge the row} else { for (int j = 1; j < columns; j++) { // Check whether there are other blocks on the left if (map[rowIndex - i][j] == State.ACTIVE && map[rowIndex - i][j - 1] == State.STOPED) { hasBlock = true; merusak; // Ada hambatan, tidak perlu mendaur ulang kolom penilaian}} if (hasblock) break; // Ada hambatan, tidak perlu mendaur ulang baris penilaian}}/* Tidak ada hambatan di sebelah kiri, pindahkan gambar ke kiri dengan jarak blok*/ if (! Hasblock) {for (int i = 0; i <blockrows; i ++) {for (int j = 1; j <kolom; j ++) {if (int (int j = 1; j <j <j ++) {if (int (int j = 1; i] [j - 1] = state.active;Saat bergerak ke bawah, itu mengurangi interval waktu untuk setiap keadaan normal jatuh:
/*** langsung ke bawah*/private void down () {// tanda dapat mempercepat musim gugur segera = true;}Cara mengubah arah grafik, hanya metode yang sangat sederhana yang digunakan di sini untuk mencapai transformasi arah. Tentu saja, mungkin ada algoritma yang lebih baik untuk mengimplementasikan operasi transformasi arah. Anda dapat mempelajarinya sendiri:
/*** Putar bentuk persegi*/private void rotate () {coba {if (bentuk == 4) {// square, bentuk yang sama dikembalikan sebelum dan sesudah rotasi; } lain jika (bentuk == 0) {// strip // array sementara, tempatkan gambar setelah status rotasi [] [] tmp = status baru [4] [4]; int startColumn = 0; // Temukan posisi kuadrat pertama di awal gambar untuk (int i = 0; i <kolom; i ++) {if (peta [rowIndex] [i] == state.active) {startColumn = i; merusak; }} // Cari tahu apakah ada hambatan setelah rotasi. Jika ada hambatan, jangan berputar untuk (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (peta [rowindex - 3+i] [j+startColumn] == state.stoped) {return; }}}} if (peta [rowIndex] [startColumn+1] == state.active) {// batang horizontal, ubah menjadi bilah vertikal untuk (int i = 0; i <4; i ++) {tmp [i] [0] = state.active; untuk (int j = 1; j <4; j ++) {tmp [i] [j] = state.empty; }} blockrows = 4; } else {// vertikal batang, ubah menjadi bilah horizontal untuk (int j = 0; j <4; j ++) {tmp [3] [j] = state.active; untuk (int i = 0; i <3; i ++) {tmp [i] [j] = state.empty; }} blockrows = 1; } // Ubah grafik di peta asli ke grafik yang ditransformasikan untuk (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {peta [rowindex - 3+i] [startColumn+j] = tmp [i] [j]; }}} else {// array sementara, tempatkan rotasi status gambar [] [] tmp = status baru [3] [3]; int startColumn = kolom; // Temukan posisi blok pertama di awal gambar untuk (int j = 0; j <3; j ++) {untuk (int i = 0; i <kolom; i ++) {if (peta [rowindex - j] [i] == state.active) {startColumn = i <startColumn? I: StartColumn; }}} // Tentukan apakah akan ada hambatan setelah transformasi untuk (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {if (peta [rowindex - 2+j] [startColumn+2 - i] == state.stoped) kembali; }} // Transform untuk (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {tmp [2 - j] [i] = peta [rowindex - 2+i] [startColumn+j]; }} // Ubah grafik di peta asli ke grafik yang diubah untuk (int i = 0; i <3; i ++) {untuk (int j = 0; j <3; j ++) {peta [rowindex - 2+i] [startColumn+j] = tmp [i] [j]; }} // mengecat ulang (); // Remove the line pointer for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (map[rowIndex - i][startColumn + j] != null || map[rowIndex - i][startColumn + j] != State.EMPTY) { rowIndex = rowIndex - i; blockrows = 3; kembali; }}}}}} catch (Exception e) {// Jika subskrip array ditemui, itu berarti bahwa bentuk grafik tidak dapat diubah dan tidak ada pemrosesan yang dilakukan}}Ketika angka itu jatuh dan berhenti ketika mengalami hambatan, kita perlu menentukan apakah ada garis tertentu atau beberapa garis yang dapat dihilangkan. Pada saat ini, pertama -tama kita dapat memperoleh jumlah kotak di setiap baris, dan kemudian membuat penilaian:
int [] blockscount = int [baris] baru; // Catat jumlah kolom dengan blok per baris int eliminaterows = 0; // Jumlah baris dihilangkan/* Hitung jumlah blok per baris*/untuk (int i = 0; i <baris; i ++) {blockscount [i] = 0; untuk (int j = 0; j <kolom; j ++) {if (peta [i] [j] == state.stoped) blockscount [i] ++; }}Jika ada barisan penuh blok, deretan blok akan dihilangkan:
/* Menerapkan operasi eliminasi blok dengan baris penuh*/untuk (int i = 0; i <rows; i ++) {if (blockscount [i] == kolom) {// Bersihkan baris untuk (int m = i; m> = 0; m--) {for (int n = 0; n <kolom; n ++) {m] [m] [n] [n] = (n = n <)? State.empty: peta [m - 1] [n]; }} eliminaterows ++; // Catat jumlah baris yang dihilangkan}}Akhirnya, kita dapat mengecat ulang poin dan menampilkannya.
Ulangi operasi di atas untuk menghasilkan grafik, grafik jatuh, bergerak ke kiri dan kanan, dan menilai garis eliminasi, dan tetris sederhana akan selesai.
Efek Menjalankan:
Kode sampel lengkap: Tetris
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.