Final Project: Tetris

 Pengembangan Permainan Tetris Menggunakan Pendekatan Object-Oriented Programming (OOP)

Dosen Pengampu: 
Fajar Baskoro, S.Kom., M.T.


Mata Kuliah: 
Pemrograman Berorientasi Objek




Farrel Aqila Novianto (5025241015) 
Jalu Cahyo Senodiputro (5025241155) 
Aqil Syafiq Dzaki (5025241200) 

INSTITUT TEKNOLOGI SEPULUH NOPEMBER 
2025


Source Code

Demo Video

1. Deskripsi

1.1 Pengertian
Tetris merupakan permainan puzzle yang pertama kali dikembangkan oleh Alexey Pajitnov pada tahun 1984. Permainan ini menempatkan pemain pada situasi di mana balok-balok geometris yang disebut tetromino jatuh dari bagian atas layar secara kontinu. Pemain harus mengatur posisi dan orientasi balok tersebut agar dapat membentuk baris horizontal penuh pada area permainan. Setiap baris yang berhasil terisi penuh akan dihapus (line clear), dan pemain memperoleh poin.

Tetris termasuk dalam kategori game logika spasial karena menuntut ketepatan, kecepatan, serta kemampuan pemain untuk mengatur bentuk agar sesuai dengan ruang yang tersedia. Permainan berakhir ketika susunan balok mencapai bagian atas area permainan sehingga tidak ada ruang untuk kemunculan balok berikutnya.

1.2 Karakteristik Utama Tetris
Beberapa karakteristik mendasar dari permainan Tetris meliputi:
  1. Tetromino, bentuk balok yang terdiri dari empat unit kotak (cell) yang tersusun membentuk tujuh konfigurasi utama, yaitu I, O, T, S, Z, J, dan L. Setiap bentuk memiliki pola rotasi tersendiri.
  2. Play Area (Board), area permainan umumnya berupa grid dengan ukuran 20 baris × 10 kolom. Grid ini berfungsi sebagai tempat jatuhnya tetromino dan lokasi terjadinya line clearing.
  3. Mechanics (Gameplay), pemain dapat menggerakkan tetromino ke kiri, kanan, atau bawah, serta memutar tetromino. Jika tetromino tidak dapat lagi bergerak ke bawah karena bertumpu pada balok lain atau dasar grid, tetromino tersebut akan dikunci dan menjadi bagian dari board.
  4. Line Clearing and Scoring, ketika satu atau lebih baris horizontal terisi penuh, baris tersebut akan dihapus dan pemain mendapatkan poin berdasarkan jumlah baris yang dihapus secara bersamaan.
  5. Game Over Condition, permainan berakhir apabila tidak ada ruang lagi untuk menempatkan tetromino baru pada area permainan.
1.3 Implementasi Tetris dengan Pendekatan Object-Oriented Programming (OOP) di Java
Dalam pembuatan permainan Tetris menggunakan Java, pendekatan Object-Oriented Programming (OOP) digunakan untuk memudahkan pengorganisasian komponen game ke dalam bentuk objek-objek yang saling berinteraksi. Penerapan OOP membantu agar kode lebih modular, terstruktur, mudah diperluas, dan lebih sederhana untuk dikelola. Lengkapnya akan dijelaskan pada bab berikutnya.

2. Rancangan Kelas


3. Penjelasan Tampilan dan Fitur

3.1 Main Menu (MainMenu.java)


Tampilan:
  • Layout menggunakan GridBagLayout untuk penataan vertikal
  • Window muncul di tengah layar

Komponen UI:
  1. Title "TETRIS" - Label besar dengan font Arial Bold
  2. Button "Start Game" - Memulai permainan baru
  3. Button "High Score" - Menampilkan 5 skor tertinggi
  4. Button "Controls" - Menampilkan panduan kontrol
  5. Button "Exit" - Keluar dari aplikasi
Fungsi:
  • Start Game: Menutup menu dan membuka GameWindow
  • High Score: Membuka dialog yang menampilkan top 5 skor dari file `highscore.txt`
  • Controls: Menampilkan dialog informasi kontrol keyboard
  • Exit: Menutup aplikasi dengan System.exit(0)
3.2 Game Window (GameWindow.java & GamePanel.java)


Layout Area Bermain:

    A. Grid Area (Kiri)
  • Grid 10 kolom × 20 baris
  • Background hitam
  • Border setiap cell berwarna abu-abu gelap
    Elemen yang ditampilkan:
  1. Locked blocks - Block yang sudah terkunci dengan warna sesuai tetromino
  2. Ghost piece - Bayangan transparan menunjukkan posisi jatuh
  3. Current piece - Tetromino aktif dengan warna solid
    B. Sidebar (Kanan)

Informasi yang ditampilkan:
  1. Score - Menampilkan skor pemain
  2. Lines - Menampilkan jumlah baris yang telah dihapus
  3. Level - Menampilkan level saat ini
  4. Speed - Menampilkan kecepatan jatuh saat ini
  5. Next Piece Preview - Preview tetromino berikutnya
3.3 Pause Screen


Tampilan:
  • Overlay semi-transparan hitam menutupi grid area
  • Text "PAUSED" di tengah dengan font besar berwarna putih
Cara Mengaktifkan:
  • Tekan ESC untuk pause/resume
  • Tekan ENTER untuk resume (saat pause)
  • Timer game berhenti saat pause
3.4 Game Over Screen



Tampilan:
- Dialog popup JOptionPane
- Menampilkan: "Game Over. Score: [skor akhir]\nReturn to menu?"

Alur:
1. Jika skor masuk highscore (top 5):
   - Muncul dialog input untuk memasukkan nama pemain
   - Simpan ke `highscore.txt`

2. Dialog konfirmasi:
   - Yes: Kembali ke Main Menu
   - No: Keluar aplikasi

3.5 High Score Screen


Tampilan:
  • Dialog JOptionPane
  • Format isi:
  HIGH SCORES
  1. [Nama] - [Skor]
  2. [Nama] - [Skor]
  3. [Nama] - [Skor]
  4. [Nama] - [Skor]
  5. [Nama] - [Skor]
Setiap entri menampilkan nomor urut, nama pemain, dan skor

Kondisi Khusus:
  • Jika belum ada highscore: "No highscores yet."
  • Maksimal 5 entri, diurutkan dari tertinggi ke terendah
Mekanisme Load:
  1. Baca file baris per baris
  2. Parse setiap baris (split by comma)
  3. Convert skor dari string ke integer
  4. Sort descending (tertinggi ke terendah)
  5. Ambil top 5 entries saja
Mekanisme Save:
  1. Tulis semua entry ke file
  2. Format CSV: nama,skor
  3. Satu entry per baris
  4. File ditimpa setiap kali save (overwrite)
Auto-create:
  • File dibuat otomatis jika belum ada
  • Terjadi saat pertama kali ada highscore yang disimpan
Error Handling:
  • File tidak ada: return list kosong (tidak error)
  • Parse error: skip baris yang error
  • IOException: print error ke console
3.6 Controls Screen


Tampilan:
  • Dialog JOptionPane
  • Berisi fungsi-fungsi untuk memainkan permainan sebagai berikut:
Tombol Panah Kiri (←)
  • Fungsi: Geser tetromino 1 kolom ke kiri
  • Dapat ditekan berulang untuk geser lebih jauh
Tombol Panah Kanan (→)
  • Fungsi: Geser tetromino 1 kolom ke kanan
  • Dapat ditekan berulang untuk geser lebih jauh
Tombol Panah Atas (↑)
  • Fungsi: Rotasi tetromino 90 derajat searah jarum jam
  • Dilengkapi wall kick system untuk rotasi di dekat dinding
Tombol Panah Bawah (↓)
  • Fungsi: Soft Drop - mempercepat jatuh tetromino
  • Berguna untuk mempercepat permainan tanpa langsung drop
Tombol Space
  • Fungsi: Hard Drop - menjatuhkan tetromino langsung ke bawah
  • Piece langsung terkunci di posisi terendah
Tombol ESC
  • Fungsi: Pause/Resume game
  • Game berhenti total saat pause
Tombol Enter
  • Fungsi: Resume game saat sedang pause
  • Alternatif dari tombol ESC
3.7 Tetronimo
Program mendukung 7 bentuk standar Tetris:

1. I-Shape (Stick)
  • Bentuk: 4 block horizontal/vertikal
  • Matrix: [[1,1,1,1]]
  • Dapat dirotasi menjadi horizontal atau vertikal
  • Ideal untuk clear 4 lines sekaligus (Tetris)
2. O-Shape (Square)
  • Bentuk: 2x2 block persegi
  • Matrix: [[1,1],[1,1]]
  • Tidak dapat dirotasi (bentuk tetap)
  • Stabil dan mudah ditempatkan
3. T-Shape
  • Bentuk: Seperti huruf T
  • Matrix: [[0,1,0],[1,1,1]]
  • Dapat dirotasi 4 arah
  • Serbaguna untuk berbagai posisi
4. L-Shape
  • Bentuk: Seperti huruf L
  • Matrix: [[1,0,0],[1,1,1]]
  • Dapat dirotasi 4 arah
  • Cocok untuk mengisi sudut kiri
5. J-Shape (Reverse L)
  • Bentuk: Seperti huruf L terbalik
  • Matrix: [[0,0,1],[1,1,1]]
  • Dapat dirotasi 4 arah
  • Cocok untuk mengisi sudut kanan
6. S-Shape
  • Bentuk: Seperti huruf S
  • Matrix: [[0,1,1],[1,1,0]]
  • Dapat dirotasi horizontal/vertikal
  • Membuat bentuk zigzag
7. Z-Shape (Reverse S)
  • Bentuk: Seperti huruf Z
  • Matrix: [[1,1,0],[0,1,1]]
  • Dapat dirotasi horizontal/vertikal
  • Membuat bentuk zigzag terbalik
Catatan:
  • Setiap tetromino mendapat warna random dari 7 warna yang tersedia
  • Posisi spawn: kolom 3, baris 0 (tengah atas grid)
  • Shape O tidak dapat dirotasi karena bentuknya simetris
3.8 Color Palette
7 warna berbeda untuk setiap tetromino (dipilih secara random):
  1. Cyan (Biru Muda)
  2. Yellow (Kuning)
  3. Purple (Ungu)
  4. Orange (Oranye)
  5. Blue (Biru)
  6. Green (Hijau)
  7. Red (Merah)
3.9 Aturan dan Sistem Poin

Aturan Dasar:
  1. Tetromino jatuh dari atas ke bawah secara otomatis
  2. Pemain harus mengatur posisi dan rotasi sebelum piece menyentuh dasar
  3. Saat baris terisi penuh, baris tersebut akan hilang
  4. Game berakhir jika piece baru tidak bisa spawn (grid penuh)
Sistem Poin:
Base Score (setiap piece yang diletakkan) +10 poin

Bonus Clear Lines:
  • 1 baris: +110 poin (base 10 + bonus 100)
  • 2 baris: +210 poin (base 10 + bonus 200)
  • 3 baris: +310 poin (base 10 + bonus 300)
  • 4 baris sekaligus (TETRIS): +410 poin (base 10 + bonus 400)
Strategi Poin Maksimal:
  • Usahakan clear 4 baris sekaligus untuk bonus tertinggi
  • Gunakan I-Shape untuk membuat Tetris
  • Hindari clear 1 baris saja jika memungkinkan
3.10 Sistem Level
Perhitungan Level:
Level ditentukan berdasarkan total skor
  • Level = (Skor ÷ 300) + 1
  • Setiap 300 poin, level naik 1 tingkat dengan mengurangi kecepatan turun blok sebesar 40ms
Progression Level:
  • 0-299 poin = Level 1
  • 300-599 poin = Level 2
  • 600-899 poin = Level 3
  • 900-1199 poin = Level 4
  • 1200-1499 poin = Level 5
  • Dan seterusnya
Pengaruh Level terhadap Kecepatan:
  • Level 1: Tetromino jatuh paling lambat (delay 500ms)
  • Level 2: Delay berkurang menjadi 460ms
  • Level 3: Delay 420ms
  • Level 4: Delay 380ms
  • Dan seterusnya
Tantangan setiap level:
  • Level 1-3: Cocok untuk pemula, kecepatan santai
  • Level 4-6: Kecepatan sedang, mulai menantang
  • Level 7-10: Kecepatan tinggi, butuh refleks cepat
  • Level 11+: Kecepatan maksimum, sangat menantang

4. Penjelasan Kode per Kelas

4.1 Tetris.java
Fungsi: Entry point program
  • Menjalankan aplikasi pada Event Dispatch Thread (EDT)
  • Membuat instance MainMenu sebagai tampilan awal
  • Menggunakan SwingUtilities untuk thread-safe GUI
4.2 MainMenu.java
Fungsi: Menu utama aplikasi
  • Menggunakan GridBagLayout untuk layout vertikal
  • 4 button utama dengan ActionListener masing-masing
  • Integrasi dengan HighscoreManager untuk menampilkan highscore
  • Window tercentral di layar
4.3 GameWindow.java
Fungsi: Container window untuk game panel
  • JFrame dengan size fixed (tidak resizable)
  • Menempatkan GamePanel sebagai content
  • Auto-center di layar
  • Dispose on close (kembali ke menu)
4.4 GamePanel.java
Fungsi: Panel utama game dengan logika permainan
  • Implementasi ActionListener (untuk Timer)
  • Implementasi KeyListener (untuk input keyboard)
  • Mengatur game state (score, lines, level, pause)
  • Rendering semua elemen visual
  • Game loop dengan Timer
Method Penting:
  • actionPerformed(): Game loop tick
  • paintComponent(): Rendering grafis
  • keyPressed(): Handle input
  • drawGhost(): Render ghost piece
  • drawNext(): Render next piece preview
  • togglePause(): Pause/resume game
4.5 Board.java
Fungsi: Representasi grid 10×20
  • Array 2D dari Color untuk menyimpan state tiap cell
  • Validasi posisi piece
  • Lock piece ke grid
  • Clear full rows dengan shifting
Method Penting:
  • validSpace(Tetromino): Cek collision
  • lockPiece(Tetromino): Lock piece to grid
  • clearFullRows(): Clear dan return jumlah rows cleared
4.6 Tetromino.java
Fungsi: Representasi piece tetris
  • Menyimpan shape matrix, posisi, warna
  • Method rotate untuk rotasi 90 derajat
  • Method cloneAt untuk kalkulasi ghost
4.7 ShapeType.java
Fungsi: Enum untuk 7 tipe tetromino
  • I, O, T, L, J, S, Z
  • Digunakan untuk menghasilkan bentuk dari matrix
4.8 ColorPalette.java
Fungsi: Konstanta warna
  • Array 7 warna untuk random assignment
  • Menyediakan warna yang konsisten dan menarik

4.9 HighscoreManager.java
Fungsi: Mengatur sistem highscore
  • Load/save dari/ke file
  • Cek apakah score masuk top 5
  • Menambahkan new score dan sort
  • Menunjukkan dialog highscore
Method Penting:
  • load(): Load dari file
  • save(): Save ke file
  • isHighscore(): Check jika masuk top 5
  • addScore(): Add dan sort
  • showHighscores(): Display dialog

5. Kesimpulan

Program Tetris ini merupakan implementasi lengkap game Tetris klasik dengan fitur-fitur modern seperti:

Fitur Utama:
  1. 7 Tetromino shapes dengan rotasi dan wall kick
  2. Ghost piece untuk melihatposisi jatuh
  3. Level progression dengan peningkatan kecepatan
  4. Scoring system dengan bonus clear multiple lines
  5. Highscore persistence dengan file I/O
  6. Fitur pause untuk kontrol game
  7. Visual feedback yang jelas (colors, borders, overlay)
  8. User-friendly menu system
Teknologi:
  • Java Swing untuk GUI
  • Event-driven programming (Timer, KeyListener)
  • File I/O untuk persistence
  • Konsep OOP (encapsulation, inheritance, polymorphism)
Struktur Kode:
  • Modular dengan separation of concerns
  • 9 kelas dengan responsibility yang jelas
  • Clean code dengan naming yang deskriptif
  • Error handling untuk file I/O
Program ini siap dimainkan dan memberikan pengalaman bermain Tetris yang menyenangkan dengan semua mekanik standar yang diharapkan dari game Tetris klasik.

Komentar

Postingan populer dari blog ini

Pertemuan 4: Membuat Clock Display