Contoh -contoh dalam artikel ini berbagi dengan Anda kode spesifik tetris implementasi Java untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
Ide Desain Tetris
Tetris telah bermain sejak kecil. Semua orang tahu aturannya. Di masa lalu, saya pikir benda itu sangat menyenangkan, tetapi saya tidak bisa menang. Sekarang saya telah belajar menulis satu sendiri dan mempraktikkannya setiap hari!
Operasi keyboard:
Kunci Kiri: Bergerak ke kiri; Kunci Kanan: Bergerak ke kanan;
Kunci UP: Ubah Bentuk dan Kunci Bawah: Akselerate Drop (tidak masalah, tidak ada perbaikan lebih lanjut)
Jika kotak dari setiap baris penuh, baris ini akan dihilangkan. Menghilangkan deretan kotak akan mendapatkan 10 poin. Saat ini, saya belum menetapkan level. Bayi yang menyukainya dapat mengatur level itu sendiri;
Jadi dari mana bentuk persegi itu berasal? Itu dirancang oleh kita sendiri. Bentuk umum adalah: i type, t type, l tipe, tipe grid tianzi, dll., Tambahkan sendiri!
Jadi apa yang terjadi? Faktanya, itu hanya array 4*4. Tentu saja, Anda dapat mendesain dan dengan senang hati, Anda memiliki keputusan akhir!
Jadi, saya memberi contoh di bawah ini untuk memberi tahu Anda mengapa bentuk yang Anda lihat dapat diubah dirancang terlebih dahulu, 0 kosong dan 1 adalah pengisi, sehingga Anda dapat membuat bentuk dalam permainan Anda!
Lupakan: Taruh saja gambarnya dan lihat hasil yang menjalankan kode terlebih dahulu:
Suka itu? Jika Anda menyukainya, lakukan saja secara langsung. Mungkin kodenya tidak cukup ditulis dengan baik. Mohon maafkan saya. Saya akan meringkas lebih banyak ketika saya melihat ke belakang dan akan terus memperbarui kode;
Kelas Gamepanel: Kelas Antarmuka Game, seluruh blok dijatuhkan dan ditampilkan, dan logika game lambat diimplementasikan di kelas ini;
Paket Tetris; Impor Java.Awt.Graphics; impor java.awt.event.actionevent; import java.awt.event.actickener; impor java.awt.event.keyevent; impor java.awt.event.keylistener; impor java.util.randepswing; impor javax. javax.swing.jpanel; impor javax.swing.timer; gamepanel kelas publik memperluas jpanel mengimplementasikan keylistener {private int maprow = 21; private int mapcol = 12; private int mapgame [] [] = int baru [mapRow] [mapCol]; // buka ruang array dua dimensi untuk menyimpan informasi peta pengatur waktu private timer kami; private int skor = 0; // Catat skor acak acak = acak baru (); private int curshapetype = -1; private int curshapestate = -1; // atur jenis bentuk saat ini dan status bentuk saat ini private int nextshapetype = -1; private int nextshapeState = -1; // Atur jenis dan status grup blok yang muncul lain kali private int posx = 0; Private int posy = 0; bentuk int final pribadi [] [] [] = int int [] [] {// t mesin terbang disimpan dalam urutan berlawanan arah jarum jam {{0,1,0,0, 1,1,1,0, 0,0,0,0,0,0}, {0,1,0,0, 1,0,0,0,0,0}, {0,1,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, memesan {{0,0,0,0, 1,1,1,1,1,0,0,0,0, 0,0,0,0,0}, {0,1,0,0,0, 0,1,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,, {0,1,1,0, 1,1,0,0, 0,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0}, // Z berbentuk {1,1,0,0,0, 0,0,1,1,0,0,0,0,0,, 1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0}, {1,1,0,0, 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Dalam urutan berlawanan arah jarum jam {{0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 {1,0,0,0, 1,1,0,0,0,0,0}, {1,0,0,0, 1,1,0,0,0,0,0,0}, // L glyphs disimpan dalam urutan berlawanan arah {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,1,0,0,0,0,0,0,0,0}, {0,0,1,0, 1,1,0,0, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0}, {1,1,0,0, 0,1,0,0,0,0,0,0}, {1,1,1,0, Tanah 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 Penyelesaian,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0}}}}; private int rowrect = 4; private int colrect = 4; // Di sini kita menganggap gambar yang disimpan sebagai array dua dimensi 4*4. Meskipun kami menggunakan array satu dimensi untuk menyimpannya di atas, kami masih perlu menganggapnya sebagai array dua dimensi untuk mengimplementasikan intrwidth intr Private = 10; gamepanel publik () // konstruktor ---- buat peta yang bagus {createrect (); initmap (); // inisialisasi peta ini setWall (); // atur dinding // createrect (); timer = timer baru (500, timerListener baru ()); timer.start (); } class TimerListener mengimplementasikan ActionListener {public void actionPerformed (actionEvent e) {movingown (); }} public void setWall () // kolom 0 dan 11 keduanya dinding, dan baris 20 juga dinding {untuk (int i = 0; i <maprow; i ++) // Gambar kolom pertama {mapgame [i] [0] = 2; Mapgame [i] [11] = 2; } untuk (int j = 1; j <mapcol-1; j ++) // Gambar baris terakhir {mapgame [20] [j] = 2; }} public void initmap () // Inisialisasi peta ini, ID dinding adalah 2, ID ruang adalah 0, dan ID blok adalah 1 {untuk (int i = 0; i <maprow; i ++) {untuk (int j = 0; j <mapcol; j ++) {mapGame [i] [j] = 0; }}} public void createrect () // Buat blok --- Jika ada jenis blok saat ini, atur waktu berikutnya, jika tidak, atur status saat ini dan ketik {if (curShapetype == -1 && curshapestate == -1) // keadaan blok saat ini adalah 1, menunjukkan bahwa permainan baru saja dimulai {curshapetype = rawang. curshapestate = random.nextInt (bentuk [0] .length); } else {curShapeType = nextShapetype; Curshapestate = NextShapestate; } nextShapeType = random.nextInt (shapes.length); nextShapeState = random.nextInt (bentuk [0] .length); posx = 0; Posy = 1; // Buat persegi di sudut kiri atas dinding IF (GameOver (posx, Posy, Curshapetype, CurshapeState)) {JOptionPane.ShowConfirmDialog (NULL, "Game End!", "Tip", joptionpane.ok_option); System.exit (0); }} Public Boolean Gameover (int x, int y, int shapetype, int shapeState) // menilai apakah game berakhir {if (isornomove (x, y, shapetype, shapeState)) {return false; } return true; } public boolean isornomove (int x, int y, int shapetype, int shape) // menilai apakah angka saat ini dapat dipindahkan. Di sini kami menekankan bahwa koordinat x dan y merujuk ke target kiri atas dari array dua dimensi 4*4 (array yang menggambarkan gambar) {untuk (int i = 0; i <rowrect; i ++) {untuk (int j = 0; j <colrect; j ++) {if ife [shape] [colrect; MapGame [x+i] [y+j] == 1 || }}} return true; } public void turn () // rotate {int temp = curshapestate; Curshapestate = (Curshapestate+1) % bentuk [0] .length; if (isornomove (posx, posy, curshapetype, curshapestate)) {} else {curshapestate = temp; } repaint (); } public void dipindahkan () // Pindah ke bawah {if (isornomove (posx+1, posy, curshapetype, curshapeState)) {posx ++; } else {addToMap (); // Perbaiki baris ini di peta checkline (); Createrect (); // menciptakan kembali blok baru} repaint (); } public void moveleft () // bergerak kiri {if (isornomove (posx, posy-1, curshapetype, curshapestate)) {posy--; } repaint (); } public void Moveright () // Pindah ke kanan {if (iSornomove (posx, posy+1, CurShapetype, CurShapeState)) {Posy ++; } repaint (); } public void addToMap () // Perbaiki gambar yang jatuh ke dalam peta {for (int i = 0; i <rowrect; i ++) {for (int j = 0; j <colrect; j ++) {if] {bentuk 1) [peta] [paper] [posx] [posx] [posx] [posx] [posx] [posx] [posx] [posx] [pOSXX] [pOSXX [i*colrect+j] == 1) [CURSHAPETEPL bentuk [CurShapetype] [Curshapestate] [i*colrect+j]; }}}} public void checkline () // Periksa apakah ada baris lengkap di baris ini {int count = 0; untuk (int i = mapRow-2; i> = 0; i--) {count = 0; untuk (int j = 1; j <mapcol-1; j ++) {if (mapGame [i] [j] == 1) {count ++; } lain break; } if (count> = mapCol-2) {for (int k = i; k> 0; k--) {for (int p = 1; p <mapCol-1; p ++) {mapgame [k] [p] = mapgame [k-1] [p]; }} skor += 10; i ++; }}} public void cat (grafik g) // ulang jendela {super.paint (g); untuk (int i = 0; i <rowrect; i ++) // Gambar blok jatuh {for (int j = 0; j <colrect; j ++) {if (bentuk [CurShapetype] [CurShapeState] [i*colrect+j] == 1) {g.fillrect ((posy+j+1)*rangka*rangka*rangka*rece. Rectwidth, rectwidth); } } } for(int i = 0; i < mapRow; i++)//Draw the block information that has been fixed on the map { for(int j = 0; j < mapCol; j++) { if(mapGame[i][j] == 2)//Draw the wall{ g.drawRect((j+1)*RectWidth, (i+1)*RectWidth, RectWidth, Rectwidth); } if (mapGame [i] [j] == 1) // Gambar kotak kecil {g.fillrect ((j+1)*rectwidth, (i+1)*rectwidth, rectwidth, rectwidth); }}} g.drawstring ("skor ="+ skor, 225, 15); g.drawstring ("persegi berikutnya:", 225, 50); untuk (int i = 0; j <colrect; j ++) {if (bentuk [nextshapetype] [nextshapestate] [i*colrect+j] == 1) {g.fillrect (225+ (j*rectwidth), 100+ (i*rectwidth), rectwidth, rectwidth), 100+ }}}} public void newGame () // Game dimulai lagi {skor = 0; initmap (); SetWall (); Createrect (); ulang (); } public void stopgame () // game berhenti {timer.stop (); } public void lanjutanGame () {timer.start (); } @Override public void keyTyped (keyevent e) {} @Override public void keypressed (keyevent e) {switch (e.getKeyCode ()) {case Keyevent.vk_up: // up ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Keyevent.vk_right: // right ---- meight (); merusak; }} @Override public void keyreleased (KeyEvent e) {// TODO Metode yang dihasilkan otomatis Stub}} Kelas GameFrame: Port entri seluruh game, yah, terus terang, itu adalah kelas dengan fungsi utama (). Kelas ini mengimplementasikan beberapa desain antarmuka game, yang dapat Anda pahami sebagai UI kecil;
Paket Tetris; Impor Java.Awt.event.actionevent; impor java.awt.event.actionlistener; impor javax.swing.jframe; import javax.swing.jmenu; impor javax.swing.jmenubar; impor javax.swing.jmenuitemp; impor javax.swing. ActionListener {private int widthframe = 500; private int heightframe = 600; Private JMenu Menu = JMenu baru ("Game"); // Buat menu pribadi jmenuitem newGame = menu.add ("restart"); // Buat opsi menu bawaan pribadi jmenuitem exitgame = menu.add ("Game Exit"); Private JMenuitem Stemplame = menu.add ("Game Pause"); Private JMenuitem Goongame = menu.add ("Game Lanjutkan"); private jmenu menutwo = jmenu baru ("help"); // Buat menu kedua jmenuitem pribadi tentanggame = menutwo.add ("tentang permainan"); Gamepanel gamepanel = gamepanel baru (); gameframe publik () // konstruktor {addKeyListener (gamepanel); newgame.addactionListener (ini); exitgame.addactionListener (ini); stopgame.addactionListener (ini); goongame.addactionListener (ini); Tentanggame.addactionListener (ini); this.add (gamepanel); Menu jmenubar = jmenubar baru (); menu.add (menuOne); menu.add (menutwo); this.setjMenubar (menu); this.settitle ("Tetris"); this.setbounds (50, 10, widthframe, heightframe); this.setVisible (true); this.setDefaultCloseOperation (jframe.exit_on_close); } public void actionPerformed (actionEvent e) {if (e.getSource () == newGame) // Game dimulai lagi {gamepanel.newgame (); } if (e.getSource () == EXITGAME) // Game Exit {System.exit (0); } if (e.getSource () == stopgame) // game jeda {gamepanel.stopgame (); } if (e.getSource () == goongame) // Game Lanjutkan {gamepanel.continuegame (); } if (e.getSource () == Tentanggame) // Tentang Informasi Game {JOptionPane.ShowMessageDialog (NULL, "Pindah Kunci Kiri dan Kanan, Buat Rotasi ke atas", "Prompt", Joptionpane.ok_option); }} public static void main (string [] args) {new GameFrame (); }}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.