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.
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
Tidak ada komentar:
Posting Komentar