Membuat Game Tetris Dengan Java Menggunakan NetBeans IDE

Share:


Assalamualaikum warohmatullahi wabarokatuh

Programmer Bojonegoro - Hello world, pada akhir pekan kali ini saya akan membagikan sebuah source code untuk Membuat Game Tetris Dengan Java Menggunakan NetBeans IDE.

Tapi sebelum kita membuat game nya, terlebih dahulu kita harus tahu sejarah dan asal usul dari game tetris ini. Seperti kata Bung Karno, JAS MERAH("JAngan Sekali-kali MElupakan SejaRAH") hehehe . . .

Nah, untuk mengetahui sejarah dari game tetris yang sangat legendaris ini, saya berusaha googling di yahoo :v dan mengetikkan keyword "Sejarah game tetris". Hasilnya saya menemukan banyak sekali artikel(sekitar 34.500 hasil) tentang sejarah dan asal usul game tetris ini, diantaranya dari wikipedia dan kaskus.

Berikut rangkuman sejarah dan asal usul game tetris yang saya dapatkan dari dua website tersebut.

Tetris (bahasa Rusia: Тетрис) adalah teka-teki yang didesain dan diprogram oleh Alexey Pajitnov pada bulan Juni 1985, pada saat ia bekerja di Pusat Komputer Dorodnicyn di Akademi Sains Uni Soviet di Moskow. Namanya berasal dari awalan numerik Yunani tetra yang bermakna bangun dengan empat bagian.

Konsep permainan ini tidaklah terlalu rumit. Kita hanya perlu menyusun balok-balok yang berbentuk I, J, L, O, S, T dan Z dengan memutar balok dan menggeser balok kiri-kanan sampai membentuk garis horisontal tanpa celah. ketika terbentuk garis horisontal susunan balok tersebut akan hilang. Semakin lama memainkan game ini, balok akan turun semakin cepat. Permainan akan berakhir jikalau banyak celah dan telah memenuhi ruang permainannya.

Walaupun Tetris muncul kebanyakan pada komputer rumahan, permainan ini lebih sukses pada versi Gameboy yang dirilis pada 1989 yang membuatnya sebagai permainan paling populer sepanjang masa. Pada berita Electronic Gaming Monthly ke-100, Tetris berada pada urutan pertama pada "Permainan Terbaik Sepanjang Masa". Pada tahun 2007, Tetris berada di urutan kedua pada "100 Permainan Terbaik Sepanjang Masa" menurut IGN.

Tetris telah sukses terjual lebih dari 70 juta copy ke seluruh dunia dalam berbagai macam bentuknya. Dan juga menerima beberapa penghargaan dari Guinness World Record termasuk penghargaan sebagai "Longest Prison Sentence for Playing a Video Game".

Sejarah mengatakan bahwa game ini banyak sekali mengalami kontroversi tentang hak cipta. Awalnya Alexey Pajitnov tidak mendapat keuntungan apapun atas ciptaannya itu. Kemudian tahun 1996 mendirikan The Tetris Company, Alexey Pajitnov baru bisa menikmati keuntungan komersil dari hasil game buatannya.

Pada era serba modern sekarang, banyak game-game jaman now dengan teknologi yang lebih canggih bermunculan seperti Mobile Legends, Pockemon GO, Clash of Clans, dkk. Tetapi kenyataannya, tetris berada diurutan pertama pada "Permainan Terbaik Sepanjang Masa" menurut berita Electronic Game Monthly.

Oke, akhirnya kita telah mengetahui sejarah dan asal usul dari game tetris ini. Itu artinya kita telah siap untuk membuat game legendaris yang satu ini. #Check This Out Gaess :)

Berikut source code untuk Membuat Game Tetris Dengan Java Menggunakan NetBeans IDE.

Main Class : Tetris.java

package tetris;
//programmerbojonegoro.blogspot.co.id, Referensi Coding Terbaikmu!
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;


public class Tetris extends JFrame {

    JLabel statusbar;


    public Tetris() {

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

        setSize(200, 400);
        setTitle("[PB] Tetris");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
   }

   public JLabel getStatusBar() {
       return statusbar;
   }

    public static void main(String[] args) {

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

    } 
}

Class: Board.java

package tetris;
//programmerbojonegoro.blogspot.co.id, Referensi Coding Terbaikmu!
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.Shape.Tetrominoes;


public class Board extends JPanel implements ActionListener {


    final int BoardWidth = 10;
    final int BoardHeight = 22;

    Timer timer;
    boolean isFallingFinished = false;
    boolean isStarted = false;
    boolean isPaused = false;
    int numLinesRemoved = 0;
    int curX = 0;
    int curY = 0;
    JLabel statusbar;
    Shape curPiece;
    Tetrominoes[] board;



    public Board(Tetris parent) {

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

       statusbar =  parent.getStatusBar();
       board = new Tetrominoes[BoardWidth * BoardHeight];
       addKeyListener(new TAdapter());
       clearBoard();  
    }

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


    int squareWidth() { return (int) getSize().getWidth() / BoardWidth; }
    int squareHeight() { return (int) getSize().getHeight() / BoardHeight; }
    Tetrominoes shapeAt(int x, int y) { return board[(y * BoardWidth) + x]; }


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

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

        newPiece();
        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 boardTop = (int) size.getHeight() - BoardHeight * squareHeight();


        for (int i = 0; i < BoardHeight; ++i) {
            for (int j = 0; j < BoardWidth; ++j) {
                Tetrominoes shape = shapeAt(j, BoardHeight - i - 1);
                if (shape != Tetrominoes.NoShape)
                    drawSquare(g, 0 + j * squareWidth(),
                               boardTop + i * squareHeight(), shape);
            }
        }

        if (curPiece.getShape() != Tetrominoes.NoShape) {
            for (int i = 0; i < 4; ++i) {
                int x = curX + curPiece.x(i);
                int y = curY - curPiece.y(i);
                drawSquare(g, 0 + x * squareWidth(),
                           boardTop + (BoardHeight - y - 1) * squareHeight(),
                           curPiece.getShape());
            }
        }
    }

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

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


    private void clearBoard()
    {
        for (int i = 0; i < BoardHeight * BoardWidth; ++i)
            board[i] = Tetrominoes.NoShape;
    }

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

        removeFullLines();

        if (!isFallingFinished)
            newPiece();
    }
    boolean end=true;
    private void newPiece()
    {
        curPiece.setRandomShape();
        curX = BoardWidth / 2 + 1;
        curY = BoardHeight - 1 + curPiece.minY();
        
        if (!tryMove(curPiece, curX, curY) && end==true) {
            curPiece.setShape(Tetrominoes.NoShape);
            timer.stop();
            isStarted = false;
       
         }
        end=false;
        if(!tryMove(curPiece, curX, curY) && end==false){
            statusbar.setText("game over");
        } 
    }

    private boolean tryMove(Shape newPiece, int newX, int newY)
    {
        for (int i = 0; i < 4; ++i) {
            int x = newX + newPiece.x(i);
            int y = newY - newPiece.y(i);
            if (x < 0 || x >= BoardWidth || y < 0 || y >= BoardHeight)
                return false;
            if (shapeAt(x, y) != Tetrominoes.NoShape)
                return false;
        }

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

    private void removeFullLines()
    {
        int numFullLines = 0;

        for (int i = BoardHeight - 1; i >= 0; --i) {
            boolean lineIsFull = true;

            for (int j = 0; j < BoardWidth; ++j) {
                if (shapeAt(j, i) == Tetrominoes.NoShape) {
                    lineIsFull = false;
                    break;
                }
            }

            if (lineIsFull) {
                ++numFullLines;
                for (int k = i; k < BoardHeight - 1; ++k) {
                    for (int j = 0; j < BoardWidth; ++j)
                         board[(k * BoardWidth) + j] = shapeAt(j, k + 1);
                }
            }
        }

        if (numFullLines > 0) {
            numLinesRemoved += numFullLines;
            statusbar.setText(String.valueOf(numLinesRemoved));
            isFallingFinished = true;
            curPiece.setShape(Tetrominoes.NoShape);
            repaint();
        }
     }

    private void drawSquare(Graphics g, int x, int y, Tetrominoes shape)
    {
        Color colors[] = { new Color(0, 0, 0), new Color(204, 102, 102), 
            new Color(102, 204, 102), new Color(102, 102, 204), 
            new Color(204, 204, 102), new Color(204, 102, 204), 
            new Color(102, 204, 204), new Color(218, 170, 0)
        };


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

        g.setColor(color);
        g.fillRect(x + 1, y + 1, squareWidth() - 2, squareHeight() - 2);

        g.setColor(color.brighter());
        g.drawLine(x, y + squareHeight() - 1, x, y);
        g.drawLine(x, y, x + squareWidth() - 1, y);

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

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

             if (!isStarted || curPiece.getShape() == Tetrominoes.NoShape) {  
                 return;
             }

             int keycode = e.getKeyCode();

             if (keycode == 'p' || keycode == 'P') {
                 pause();
                 return;
             }
             
            if (keycode == 's' || keycode == 'S' && end==false) {
                statusbar.setText(String.valueOf(numLinesRemoved));
                start();
            }

             if (isPaused)
                 return;

             switch (keycode) {
             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.rotateRight(), curX, curY);
                 break;
             case KeyEvent.VK_UP:
                 tryMove(curPiece.rotateLeft(), curX, curY);
                 break;
             case KeyEvent.VK_SPACE:
                 dropDown();
                 break;
             case 'd':
                 oneLineDown();
                 break;
             case 'D':
                 oneLineDown();
                 break;
             }

         }
     }
}

Class: Shape.java

package tetris;
//programmerbojonegoro.blogspot.co.id, Referensi Coding Terbaikmu!
import java.util.Random;
import java.lang.Math;


public class Shape {

    enum Tetrominoes { NoShape, ZShape, SShape, LineShape, 
               TShape, SquareShape, LShape, MirroredLShape };

    private Tetrominoes pieceShape;
    private int coords[][];
    private int[][][] coordsTable;


    public Shape() {

        coords = new int[4][2];
        setShape(Tetrominoes.NoShape);

    }

    public void setShape(Tetrominoes shape) {

         coordsTable = 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) {
                coords[i][j] = coordsTable[shape.ordinal()][i][j];
            }
        }
        pieceShape = shape;

    }

    private void setX(int index, int x) { coords[index][0] = x; }
    private void setY(int index, int y) { coords[index][1] = y; }
    public int x(int index) { return coords[index][0]; }
    public int y(int index) { return coords[index][1]; }
    public Tetrominoes getShape()  { return pieceShape; }

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

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


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

    public Shape rotateLeft() 
    {
        if (pieceShape == Tetrominoes.SquareShape)
            return this;

        Shape result = new Shape();
        result.pieceShape = pieceShape;

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

    public Shape rotateRight()
    {
        if (pieceShape == Tetrominoes.SquareShape)
            return this;

        Shape result = new Shape();
        result.pieceShape = pieceShape;

        for (int i = 0; i < 4; ++i) {
            result.setX(i, -y(i));
            result.setY(i, x(i));
        }
        return result;
    }
}
Game Controls:
  • 'P' or 'p' = Pause
  • 'R' or 'r' = Restart
  • Space = Coming Down Fast
  • UP Arrow = Rotate Left current piece 90 degrees
  • DOWN Arrow = Rotate Right current piece 90 degrees
  • LEFT Arrow =  Move current piece Left
  • RIGHT Arrow =  Move current piece Right

Berikut tampilan game tetris yang telah kita buat
Membuat Game Tetris Dengan Java Menggunakan NetBeans IDE

Alhamdulillah, itulah source code untuk Membuat Game Tetris Dengan Java Menggunakan NetBeans IDE.
Baca juga: Cara Membuat Game Petualangan Spiderman Dengan Java Menggunakan Greenfoot
Semoga bermanfaat dan menambah wawasan temen-temen semua.

Terimakasih

Wassalamulaikum warohmatullahi wabarokatuh 

No comments