Skip to main content

Cara Membuat Game Tetris Dengan Java

Tetris adalah sebuah game yang merupakan game teka-teki yang didesain dan diprogram oleh Alexey Pajitnov pada bulan Juni 1985. Hampir semua orang familiar atau pernah memainkan game tersebut. Game Tetris sampai saat ini masih ada di berbagai device dan keluar dengan berbagai bentuk pengembagan lainnya dari game tersebut.
Cara Membuat Game Tetris Dengan Java

Kamu juga bisa mendasain dan membuat game Tetris ini dengan berbagai bahasa pemrograman favorit kamu. Salah satu bahasa pemrograman yang bisa digunakan adalah Java. Kali ini kamu akan mendapat tutorial bagaimana membuat game Tetris dengan Java. Berikut adalah Cara Membuat Game Tetris Dengan Java :

Buat Class Kotak

Class ini akan membentuk komponen kotak-kotak balok pada game Tetris. Dan ada fungsi-fungsi untuk memutar balok ke kiri,kanan, melakukan random pada kotak yang keluar, dan fungsi pergeseran ke kiri dan kanan kotak.

import java.util.Random;
import java.lang.Math;


public class Kotak {

    enum Komponen { Kosong, BentukZ, BentukS, BentukBatang, 
               BentukT, BentukKotak, BentukL, BentukL2 };

    private Komponen potonganKomponen;
    private int kordinat[][];
    private int[][][] tableKordinat;


    public Kotak() {

        kordinat = new int[4][2];
        setKomponen(Komponen.Kosong);

    }

    public void setKomponen(Komponen komponen) {

         tableKordinat = new int[][][] {
            { { 0, 0 },   { 0, 0 },   { 0, 0 },   { 0, 0 } },
            { { 0, -1 },  { 0, 0 },   { -1, 0 },  { -1, 1 } },
            { { 0, -1 },  { 0, 0 },   { 1, 0 },   { 1, 1 } },
            { { 0, -1 },  { 0, 0 },   { 0, 1 },   { 0, 2 } },
            { { -1, 0 },  { 0, 0 },   { 1, 0 },   { 0, 1 } },
            { { 0, 0 },   { 1, 0 },   { 0, 1 },   { 1, 1 } },
            { { -1, -1 }, { 0, -1 },  { 0, 0 },   { 0, 1 } },
            { { 1, -1 },  { 0, -1 },  { 0, 0 },   { 0, 1 } }
        };

        for (int i = 0; i < 4 ; i++) {
            for (int j = 0; j < 2; ++j) {
                kordinat[i][j] = tableKordinat[komponen.ordinal()][i][j];
            }
        }
        potonganKomponen = komponen;

    }

    private void setX(int index, int x) { kordinat[index][0] = x; }
    private void setY(int index, int y) { kordinat[index][1] = y; }
    public int x(int index) { return kordinat[index][0]; }
    public int y(int index) { return kordinat[index][1]; }
    public Komponen getShape()  { return potonganKomponen; }

    public void acakBentukKeluar()
    {
        Random r = new Random();
        int x = Math.abs(r.nextInt()) % 7 + 1;
        Komponen[] values = Komponen.values(); 
        setKomponen(values[x]);
    }

    public int minX()
    {
      int m = kordinat[0][0];
      for (int i=0; i < 4; i++) {
          m = Math.min(m, kordinat[i][0]);
      }
      return m;
    }


    public int minY() 
    {
      int m = kordinat[0][1];
      for (int i=0; i < 4; i++) {
          m = Math.min(m, kordinat[i][1]);
      }
      return m;
    }

    public Kotak putarKiri() 
    {
        if (potonganKomponen == Komponen.BentukKotak)
            return this;

        Kotak result = new Kotak();
        result.potonganKomponen = potonganKomponen;

        for (int i = 0; i < 4; ++i) {
            result.setX(i, y(i));
            result.setY(i, -x(i));
        }
        return result;
    }

    public Kotak putarKanan()
    {
        if (potonganKomponen == Komponen.BentukKotak)
            return this;

        Kotak result = new Kotak();
        result.potonganKomponen = potonganKomponen;

        for (int i = 0; i < 4; ++i) {
            result.setX(i, -y(i));
            result.setY(i, x(i));
        }
        return result;
    }
}

Membuat Class Papan

Pada Class Papan adalah class untuk mengelola behavior dari berjalannya game. Berikut code-nya:


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

import tetris.Kotak.Komponen;

public class Papan extends JPanel implements ActionListener {


    final int lebar = 10;
    final int tinggi = 22;

    Timer timer;
    boolean isFallingFinished = false;
    boolean isStarted = false;
    boolean isPaused = false;
    int numLinesRemoved = 0;
    int curX = 0;
    int curY = 0;
    JLabel statusbar;
    Kotak curPiece;
    Komponen[] papan;



    public Papan(Main parent) {

       setFocusable(true);
       curPiece = new Kotak();
       timer = new Timer(400, this);
       timer.start(); 

       statusbar =  parent.getStatusBar();
       papan = new Komponen[lebar * tinggi];
       addKeyListener(new Tombol());
       hapus();  
    }

    public void actionPerformed(ActionEvent e) {
        if (isFallingFinished) {
            isFallingFinished = false;
            potonganBaru();
        } else {
            oneLineDown();
        }
    }


    int lebarKotak() { return (int) getSize().getWidth() / lebar; }
    int tinggiKotak() { return (int) getSize().getHeight() / tinggi; }
    Komponen komponenAt(int x, int y) { return papan[(y * lebar) + x]; }


    public void start()
    {
        if (isPaused)
            return;

        isStarted = true;
        isFallingFinished = false;
        numLinesRemoved = 0;
        hapus();

        potonganBaru();
        timer.start();
    }

    private void pause()
    {
        if (!isStarted)
            return;

        isPaused = !isPaused;
        if (isPaused) {
            timer.stop();
            statusbar.setText("paused");
        } else {
            timer.start();
            statusbar.setText(String.valueOf(numLinesRemoved));
        }
        repaint();
    }

    public void paint(Graphics g)
    { 
        super.paint(g);

        Dimension size = getSize();
        int papanTop = (int) size.getHeight() - tinggi * tinggiKotak();


        for (int i = 0; i < tinggi; ++i) {
            for (int j = 0; j < lebar; ++j) {
                Komponen komponen = komponenAt(j, tinggi - i - 1);
                if (komponen != Komponen.Kosong)
                    membuatKomponen(g, 0 + j * lebarKotak(),
                               papanTop + i * tinggiKotak(), komponen);
            }
        }

        if (curPiece.getShape() != Komponen.Kosong) {
            for (int i = 0; i < 4; ++i) {
                int x = curX + curPiece.x(i);
                int y = curY - curPiece.y(i);
                membuatKomponen(g, 0 + x * lebarKotak(),
                           papanTop + (tinggi - y - 1) * tinggiKotak(),
                           curPiece.getShape());
            }
        }
    }

    private void turunkanPenuh()
    {
        int newY = curY;
        while (newY > 0) {
            if (!tryMove(curPiece, curX, newY - 1))
                break;
            --newY;
        }
        menurunkanKomponen();
    }

    private void oneLineDown()
    {
        if (!tryMove(curPiece, curX, curY - 1))
            menurunkanKomponen();
    }


    private void hapus()
    {
        for (int i = 0; i < tinggi * lebar; ++i)
            papan[i] = Komponen.Kosong;
    }

    private void menurunkanKomponen()
    {
        for (int i = 0; i < 4; ++i) {
            int x = curX + curPiece.x(i);
            int y = curY - curPiece.y(i);
            papan[(y * lebar) + x] = curPiece.getShape();
        }

        hapusBarisPenuh();

        if (!isFallingFinished)
            potonganBaru();
    }

    private void potonganBaru()
    {
        curPiece.acakBentukKeluar();
        curX = lebar / 2 + 1;
        curY = tinggi - 1 + curPiece.minY();

        if (!tryMove(curPiece, curX, curY)) {
            curPiece.setKomponen(Komponen.Kosong);
            timer.stop();
            isStarted = false;
            statusbar.setText("GAME OVER");
        }
    }

    private boolean tryMove(Kotak potonganBaru, int newX, int newY)
    {
        for (int i = 0; i < 4; ++i) {
            int x = newX + potonganBaru.x(i);
            int y = newY - potonganBaru.y(i);
            if (x < 0 || x >= lebar || y < 0 || y >= tinggi)
                return false;
            if (komponenAt(x, y) != Komponen.Kosong)
                return false;
        }

        curPiece = potonganBaru;
        curX = newX;
        curY = newY;
        repaint();
        return true;
    }

    private void hapusBarisPenuh()
    {
        int jumlah = 0;

        for (int i = tinggi - 1; i >= 0; --i) {
            boolean barisPenuh = true;

            for (int j = 0; j < lebar; ++j) {
                if (komponenAt(j, i) == Komponen.Kosong) {
                    barisPenuh = false;
                    break;
                }
            }

            if (barisPenuh) {
                ++jumlah;
                for (int k = i; k < tinggi - 1; ++k) {
                    for (int j = 0; j < lebar; ++j)
                         papan[(k * lebar) + j] = komponenAt(j, k + 1);
                }
            }
        }

        if (jumlah > 0) {
            numLinesRemoved += jumlah;
            statusbar.setText(String.valueOf(numLinesRemoved));
            isFallingFinished = true;
            curPiece.setKomponen(Komponen.Kosong);
            repaint();
        }
     }

    private void membuatKomponen(Graphics g, int x, int y, Komponen komponen)
    {
        Color colors[] = { new Color(0, 0, 0), new Color(204, 0, 0), 
            new Color(0, 204, 0), new Color(100, 0, 0), 
            new Color(204, 0, 100), new Color(204, 100, 0), 
            new Color(204, 100, 100), new Color(218, 170, 0)
        };


        Color color = colors[komponen.ordinal()];

        g.setColor(color);
        g.fillRect(x + 1, y + 1, lebarKotak() - 2, tinggiKotak() - 2);

        g.setColor(color.brighter());
        g.drawLine(x, y + tinggiKotak() - 1, x, y);
        g.drawLine(x, y, x + lebarKotak() - 1, y);

        g.setColor(color.darker());
        g.drawLine(x + 1, y + tinggiKotak() - 1,
                         x + lebarKotak() - 1, y + tinggiKotak() - 1);
        g.drawLine(x + lebarKotak() - 1, y + tinggiKotak() - 1,
                         x + lebarKotak() - 1, y + 1);
    }

    class Tombol extends KeyAdapter {
         public void keyPressed(KeyEvent e) {

             if (!isStarted || curPiece.getShape() == Komponen.Kosong) {  
                 return;
             }

             int geser = e.getKeyCode();

             if (geser == 'p' || geser == 'P') {
                 pause();
                 return;
             }

             if (isPaused)
                 return;

             switch (geser) {
             case KeyEvent.VK_LEFT:
                 tryMove(curPiece, curX - 1, curY);
                 break;
             case KeyEvent.VK_RIGHT:
                 tryMove(curPiece, curX + 1, curY);
                 break;
             case KeyEvent.VK_DOWN:
                 tryMove(curPiece.putarKanan(), curX, curY);
                 break;
             case KeyEvent.VK_UP:
                 tryMove(curPiece.putarKiri(), curX, curY);
                 break;
             case KeyEvent.VK_SPACE:
                 turunkanPenuh();
                 break;
             case 'g':
                 oneLineDown();
                 break;
             case 'G':
                 oneLineDown();
                 break;
             }

         }
     }
}

Terakhir Membuat Class Main Dari Game Tetris

Class Main adalah main dari aplikasi game Tetris yang dibuat.

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame {

    JLabel statusbar;

    
    public Main() {

        statusbar = new JLabel(" 0");
        add(statusbar, BorderLayout.SOUTH);
        Papan board = new Papan(this);
        add(board);
        board.start();

        setSize(400, 800);
        setTitle("");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
   }

   public JLabel getStatusBar() {
       return statusbar;
   }

    public static void main(String[] args) {

        Main game = new Main();
        game.setLocationRelativeTo(null);
        game.setVisible(true);

    } 
}

Itulah Cara Membuat Game Tetris Dengan Java.

Terima kasih.

Comments

Popular posts from this blog

Pembahasan Dan Contoh Algoritma Array

Array adalah type data yang mengacu sekumpulan elemen  bertipe sama melalui indeks. Memiliki sifat tersusun secara terurut dan memiliki indeks. Contoh :   A : array[1..10] of char  TNamaHari : array[1..7] of string TJumHari : array[1..12] of integer Contoh Pemakaian Array Program NamaHari Kamus TNamaHari :  array[1..7] of string HariKe : integer Algoritma   TNamaHari[1]←”Senin”   TNamaHari[2]←”Selasa”   TNamaHari[3]←”Rabu”   TNamaHari[4]←”Kamis”   TNamaHari[5]←”Jumat”   TNamaHari[6]←”Sabtu”   TNamaHari[7]←”Minggu”   input (HariKe)   output(TNamaHari[HariKe]) Contoh di atas adalah contoh array dengan jumlah indeks 7, dan setiap indeks diisi dengan nama-nama hari. Mengisi array bisa dilakukan dengan membuat sistem/algoritma pengulangan sampai jumlah indeks array yang dibutuhkan atau tersedia. Lalu disetiap pengulangan dimasukan nilai data pada indeks array. Skema Pemrosesan Array Skema ...

Pemrograman Java : Cara getText dan setText Pada Java GUI

Pada Java GUI untuk mendapatkan text yang user input kamu harus mengambil text dari text area atau bisa juga text field. Untuk melakukannya bisa menggunakan fungsi getText() yang ada pada Java. getText() adalah fungsi yang ada pada Java untuk mengambil teks yang diinput pada form. Lalu untuk memunculkan sebuah teks pada text area atau text field  dapat menggunakan fungsi setText(). Akan diberikan contoh form sebagai berikut untuk lebih memahami penggunaan setText() dan getText() pada Java. Berikut adalah Cara getText dan setText Pada Java GUI : Buatlah form pada JFrame seperti gambar diatas. Caranya hanya tinggal klik kanan pada package yang diinginkan new-->JFrame Form... Lalu buat form seperti berikut: Berikan nama variabel pada text field  sesuai kegunaan. Contohnya text field  jurusan akan diberi nama variabel "jurusan". Caranya klik kanan pada text field yang dikehendaki lalu pilih Change variable name. Ini untuk memudahkan menggunaka...

Pemrograman Java : Cara Membuat Matriks Pada Java

Pengertian umum dari matriks adalah type data yang mengacu sekumpulan elemen bertipe sama melalui 2 indeks (baris & kolom). Atau ada juga yang mengartikan matriks sebagai array dua dimensi. Jika array satu dimensi hanya terdiri satu baris dan beberapa kolom sedangkan matriks memiliki baris dan kolom lebih dari satu. Jika ingin mendapat dasar pembahasan dan contoh algoritma matriks bisa dilihat pada artikel  Pembahasan Dan Contoh Algoritma Matriks . Dalam artikel tersebut dijelaskan konsep dasar dari algoritma matriks tanpa  berkaitan dengan bahasa pemrograman apapun. Kembali ke pembahasan kita kali ini, yaitu membuat Cara Membuat Matriks Pada Java. Berikut adalah code seluruh program dari pembuatan matriks pada java. import java.util.Scanner; public class Array { public static void main(String[] args) { int jumlahBaris, jumlahKolom; Scanner scanner = new Scanner(System.in); System.out.print("Masukan Jumlah indeks baris martriks...