Rabu, 19 November 2014

MAKALAH PEMBUATAN GAME TETRIS DENGAN JAVA 2D





DISUSUN OLEH :
NAMA    :
Ø    ALFARH YODI PRATAMMA (50414792)
Ø    M. FAZRIANSAH (56414695)
Ø    M. RISFAHUDDIN ( 57414503 )
Ø    M. AMIR MUNAJAT (57414612)
Ø    M. IKBAL SETIAWAN (56414238)           
Ø    IVAN FIKRI HANIFA (55414545)
KELAS    : 1IA06

UNIVERSITAS GUNADARMA





KATA PENGANTAR


Puji syukur kami panjatkan ke hadirat Allah Subhanahu wata΄ala, karena berkat rahmat-Nya kami bisa menyelesaikan makalah yang berjudul “PEMBUATAN GAME TETRIS DENGAN JAVA”. Makalah ini dibuat guna memenuhi tugas Mata Kuliah “ALGORITMA PEMOGRAMAN 1B”
Kami mengucapkan terima kasih kepada semua pihak yang telah membantu sehingga makalah ini dapat diselesaikan tepat pada waktunya. Makalah ini masih jauh dari sempurna, oleh karena itu, kritik dan saran yang bersifat membangun sangat kami harapkan demi sempurnanya makalah ini. .
Semoga makalah ini memberikan informasi yang bermanfaat untuk pengembangan wawasan dan peningkatan ilmu pengetahuan bagi kita semua, khususnya bagi kami sebagai penyusun.


BAB I
PENDAHULUAN

1.1 Latar Belakang
Perangkat lunak adalah satu bagian yang tak terpisahkan dari system computer saat ini. Perkembanganteknologi saat ini dapat dipastikan mengikutsertakan perkembangan perangkat lunak. Perkembanganpembangunan perangkat lunak mengalami kemajuan yang signifikan sejak 6 dekade terakhir : dimulaidari sekedar memberi instruksi biner ke system computer sederhana, pembuatan bahasa pemrogramantingkat rendah, tingkat menengah sampai tingkat tinggi. Selain itu, karena semakin kompleknyakebutuhan akan computer sebagai alat Bantu komputasi, perkembangan perngkat lunak juga telahmelahirkan konsep-konsep pemrograman, mulai dari konsep pemrograman sederhana (hanyamenuliskan baris-baris program dari yang berjalan dari awal sampai akhir program), pembuatanprosedur-prosedur, sampai pada pemrograman berorientasi obyek.Pemrograman berorientasi obyek merupakan konsep pemrograman yang relatif baru, di manapemrograman diarahkan ke paradigma pembentukan obyek-obyek yang saling berinteraksi. Selainkonsepnya lebih mudah dicerna oleh pemrograman, baik yang awam sekalipun, konsep pemrogramanberorientasi obyek mempermudah maintenance software sehingga software menjadi lebih fleksibelapabila akan direvisi atau dikembangakan.
1.2 Maksud dan Tujuan
Maksud dan tujuan dari pembuatan makalah ini adalah Untuk memenuhi salah satu tugas mata kuliah Algoritma Pemograman yang.Menjelaskan fitur-fitur teknologi dari Java Virtual Machine (JVM), garbage collection, dan code security.

BAB II
ISI
2.1 Definisi pembuatan game tetris

Game Tetris merupakan salah satu dari beberapa game computer yang terpopular yang pernah ciptakan. Game orisinalnya sih didisain dan diprogram oleh seorang programmer Russia yang bernama Alexey Pajitnov pada tahun 1985. Sejak saat itu, Tetris tersedia hampir pada seluruh platform komputer dengan berbagai variasinya.
Tetris merupakan sebutan bagi permainan yang ada block puzzle runtuh. Pada game ini, saya mempunyai 7 bentuk berbeda yang bernama tetrominoes. S-shape, Z-shape, T-shape, L-shape, Line-shape, Mirrored L-shape and a Square-shape. Masing-masing dari bentuk-bentuk ini terbuat dari 4 balok. Bentuk-bentuk tersebut berjatuhan ke papan game (board). Cara permainan tertris ini adalah dengan cara memindahkan dan memutarkan bentuk-bentuk tersebut, sehingga mereka bias masuk dengan benar. Jika kita benar mengatur shape2 tersebut baris demi baris, garis tersebut akan hancur dan kita mendapatkan skor. Kita memainkan game tetris sampai habis spes tetrisnya.
 

2.2  Cara Pembuatan
1.    Buka Netbeans, Start-all program-Netbeans.exe
2.   Buat projek baru dengan nama ‘TetrisSederhana’. 
3.   Pada projek yang telah dibuat tadi, buat package baru dengan nama ‘Tetris’.
4.   Lalu buat class baru dengan nama ‘Tetris’ pada package ‘Tetris’.
5.   Setelah itu, samakan source code-nya dengan yang berikut ini.

package Tetris;

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

public class Tetris extends JFrame{
    JLabel statusbar;
    JLabel statusbar2;

    public Tetris() {
        statusbar = new JLabel(" 0");
        add(statusbar, BorderLayout.SOUTH);
        statusbar2 = new JLabel(" 'U' = Ulang");
        add(statusbar2, BorderLayout.NORTH);
        Board board = new Board(this);
        add(board);
        board.start();

        setSize(200, 400);
        setTitle("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);
    }
}
6.  Lalu buat class baru dengan nama ‘Board’ pada package ‘Tetris’.
7.  Setelah itu, samakan source code-nya dengan yang berikut ini.

package Tetris;

import Tetris.Shape.Tetrominoes;
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.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

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;
    int nilai=numLinesRemoved;
    JLabel statusbar;
    JLabel statusbar2;
    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();
        }
    }

    private void newPiece() {
        curPiece.setRandomShape();
        curX = BoardWidth / 2 + 1;
        curY = BoardHeight - 1 + curPiece.minY();

        if (!tryMove(curPiece, curX, curY)) {
            curPiece.setShape(Tetrominoes.NoShape);
            timer.stop();
            isStarted = false;
            JOptionPane.showMessageDialog(this, "Skor Anda : "+statusbar.getText(),"Game Over",JOptionPane.INFORMATION_MESSAGE);
            if(JOptionPane.showConfirmDialog(this,"Main Lagi?","Konfirmasi",JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){
                start();
                statusbar.setText(" 0");
            }
            else{
                System.exit(0);
            }
        }
    }

    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 (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;
                case 'u':
                    start();
                    statusbar.setText(" 0");
                    break;
                case 'U':
                    start();
                    statusbar.setText(" 0");
                    break;
            }

        }
    }
}
           
8.  Lalu buat class baru dengan nama ‘Shape’ pada package ‘Tetris’.
9. Setelah itu, samakan source code-nya dengan yang berikut ini.
Class Shape menyediakan informasi mengenai bagian tetris (tertrominoes).
package Tetris;

import java.util.Random;

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

    private Tetrominoes pieceShape;
    private int coords[][];
    private int[][][] coordsTable;
Tetrominoes enum bertugas membentuk ketujuh bentuk tetris. Plus bentuk kosong yang dinamakan di sini sebagai NoShape.
    public Shape() {
        coords = new int[4][2];
        setShape(Tetrominoes.NoShape);
    }
Ini adalah constructor dari class Shape. Array coords bertugas dalam menentukan coordinates sebnarnya dari sebuah potongan Tetris.

  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}}
        }; 
Array coordsTable bertugas untuk menentukan semuka kemungkinan nilai kordinat dari potongan tetris kita. Ini adalah template dari nilai koorsinat yang biasa.       
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;
    }
Code ini merotasi potongan tetris ke sebelah kiri. Bentuk kotak tidak perlu dirotasi. Itulah alasannya mengapa kita hanya mengembalikan referensi ke objek sekarang saja. Dengan melihat gambar sebelumnya mudah-mudah bias membantu dalam memahami tentang rotasi tersebut.

    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;
    }
}

10. Setelah selesai, klik Run untuk menjalankan program.
11. Jika berhasil maka akan muncul seperti gambar dibawah ini.

BAB III
PENUTUPAN

3.1   Kesimpulan
·         Mahasiswa dapat mengetahui source code dalam java
·         Mahasiswa dapat membuat game berbasis 2D
·         Mahasiswa dapat mengetahui salah satu fungsi dari program java


DAFTAR PUSTAKA

Ø  http://hendisantika.wordpress.com