Final Project PBO (Sudoku Game)

Nathanael Valen Susilo
5025231099

Final Project PBO (G)

Sudoku



Deskripsi Aplikasi

Sudoku merupakan salah satu permainan klasik dimana pemain diberikan suatu papan permainan berukuran 9 x 9 kotak, yang dimana beberapa kotaknya sudah berisi suatu angka dengan rentang 1-9. Pemain diharuskan untuk menyelesaikan permainan dengan mengisi semua kotak dengan angka yang benar. Angka harus ditempatkan dengan pertimbangan bahwa tidak boleh ada angka yang sama dalam satu baris, satu kolom, dan juga suatu area 3 x 3 di papan.

Selain itu, pengimplementasian sudoku juga merupakan salah satu contoh problem yang diselesaikan dengan Constraint Satisfaction Problem (CSP). Mirip seperti 8-Queens problem, sudoku juga memiliki batasan-batasan dalam meletakkan angka ke dalam papan. Mungkin awalnya sudoku terlihat simpel, tetapi sebenarnya jika kita bandingkan dengan 8-Queens Problem, sudoku sebenarnya memiliki constraint yang lebih banyak karena adanya 9 angka yang berbeda tetapi harus mencakup semuanya dan tepat satu.

Di aplikasi sudoku ini, saya membuat fungsi dan pengaturan sederhana dimana aplikasi bisa membuat suatu papan sudoku secara acak nilainya dan pasti dapat diselesaikan. Kemudian untuk permainannya sendiri, terdapat 3 opsi kesulitan yang akan merubah batas waktu dalam permainan dan banyaknya kotak yang harus diisi oleh pemain. Untuk tombol fungsional, saya menyediakan 2 tombol, untuk menjalankan ataupun menghentikan permainan dan juga tombol untuk mengirim solusi yang pemain sudah dapatkan.


Prinsip Inheritance pada Aplikasi (1)

Pada Java, inheritance merupakan salah satu prinsip yang cukup sering digunakan pada Object Oriented Programming. Inheritance memungkin satu kelas memiliki child class / kelas anak yang mana dapat menggunakan method yang sudah didefinisikan sebelumnya di parent class / kelas induknya. Biasanya inheritance digunakan untuk mengklasifikasikan suatu objek yang bisa memiliki beragam variasi pada atribut dan perilakunya/method.

Sementara untuk aplikasi sudoku yang saya buat, mungkin bisa dilihat pada diagram kelas yang ada di bawah, pembentukkan kelas yang ada tidak secara langsung menerapkan prinsip inheritance. Kenapa tidak digunakan inheritance pada game sudoku ? Singkatnya karena game sudoku umumnya hanya perlu untuk membentuk puzzle sudoku secara acak yang dapat diselesaikan. Karena kompleksitas dari aplikasi terdapat pada penerapan algoritmanya bukan dari banyaknya objek yang membentuk aplikasi, maka tidak diperlukan inheritance pada pembentukkan kelas.

Walaupun demikian, sebenarnya secara tidak langsung ada penerapan prinsip inheritance pada aplikasi ini, yaitu pada kelas SudokuFrame. Kelas SudokuFrame merupakan kelas yang bertanggung jawab untuk menampilkan frame yang membentuk GUI aplikasi, sehingga memudahkan pemain dalam berinteraksi dengan game. Untuk membuat frame, kelas ini melakukan extend dari Jframe yang merupakan kelas fundamental di Java Swing untuk pembuatan frame di GUI. Bisa dibilang bahwa kelas Jframe menurunkan method yang sudah ada agar dapat digunakan pada kelas SudokuFrame. Contoh penggunannya bisa kita lihat seperti pada method : 

  • setTitle("Sudoku")
  • setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  • getContentPane().setLayout(null), dan sebagainya.

Fitur Aplikasi (2)

  1. Membuat dan menghasilkan suatu urutan papan sudoku yang dapat diselesaikan secara acak.
  2. Aplikasi dapat menyelesaikan dan memberikan solusi sudoku dengan algoritma backtracking.
  3. Adanya GUI agar memudahkan user dalam memainkan game sudoku.
  4. 3 opsi kesulitan untuk permainan sudoku (easy, medium, dan hard)
  5. Aplikasi mampu menampilkan solusi dari puzzle sudoku serta memperbaiki input dari user.

Manfaat / Kegunaan 

Bagi Pemain :

  1. Meningkatkan Kemampuan Berpikir Logis

  2. Meningkatkan Konsentrasi dan Fokus

  3. Melatih Penyelesaian Masalah

  4. Meningkatkan Memori Kerja

  5. Melatih Ketahanan Pikiran


Bagi Programmer :

  1. Latihan dalam Pembuatan Struktur Data

  2. Latihan Pemrograman Rekursif (Backtracking)

  3. Optimasi Algoritma

  4. Mengembangkan Keterampilan Debugging


Desain Aplikasi

Menu Awal 


Contoh Papan Akhir Permainan




Class Diagram (3)


Fungsionalitas Singkat dari Setiap Kelas


SudokuMain

Code : https://github.com/Kirytsu/PBO-G/blob/main/Sudoku/SudokuMain.java

Kelas ini hanya berfungsi untuk menjalankan aplikasi yang mana akan membuat dan menampilkan suatu frame baru dari kelas SudokuFrame.


SudokuFrame

Code : https://github.com/Kirytsu/PBO-G/blob/main/Sudoku/SudokuFrame.java

Kelas ini singkatnya berisi pengaturan-pengaturan untuk frame yang akan menampilkan informasi mengenai game. Saat dibentuk class baru, maka konstruktor akan langsung membuat frame yang mana elemen-elemennya saya bagi ke dalam 2 method: initializeGrid dan initializeControls. Sesuai namanya, kedua method tersebut masing-masing akan menampilkan elemen berupa tabel permainan yang berbentuk 9 x 9 grid, dan kontrol seperti opsi kesulitan dan tombol fungsional seperti start dan submit. Selain itu ada satu method lagi attachListeners yang berfungsi untuk menyambungkan event dari button ke method yang nantinya akan dibentuk di kelas SudokuEventHandler.


SudokuEventHandler


Kelas SudokuEventHandler menerima input dan perubahan yang terjadi pada frame kemudian menjalankan logika utama dalam permainan sudoku di aplikasi ini. Secara singkat, kelas ini mengurus tindakan apa yang akan dilakukan program saat pemain menekan tombol "Start". "Give Up!", atau "Submit". 

Tombol "Start" dan "Give Up!" sebenarnya merupakan satu tombol yang statenya bergantian. Jika pemain menekan tombol "Start", maka program akan mengecek difficulty yang dipilih dan mengenerate satu papan sudoku secara acak pada kelas SudokuGenerator, kemudian menampilkan kondisi papan yang mana akan ada beberapa kotak yang kosong dan harus diisi. Jika Pemain menekan tombol "Give Up", maka program akan menghentikan waktu permainan dan akan mengisi semua kotak pada papan sudoku dengan nilai solusinya.

Jika pemain menekan tombol "Submit", maka program akan menghentikan permainan dan akan mengecek keseluruhan papan dan membandingkan dengan solusi papan yang sudah dibuat di awal. Jika sesuai maka game akan menampilkan pesan "You Win!", jika tidak maka game akan menampilkan pesan "You Lose" dan akan memperbaiki papan sudoku dengan solusinya yang mana setiap kotak yang salah akan ditandai dengan font berwarna merah.

Tambahan : 
Agar program tahu kotak mana yang harus diisi oleh pemain, kotak tersebut akan diset nilainya menjadi 0 terlebih dahulu, sehingga kemudian papan sudoku yang telah ada harus disolve kembali oleh program sebelum dilakukan perbandingan dengan submission pemain.


SudokuGenerator


Kelas ini bertanggung jawab untuk membuat suatu papan sudoku yang diletakkan pada array 2 dimensi. State dari tiap blok atau kotak harus sesuai dengan aturan sudoku. Singkatnya, waktu dipanggil untuk men-generate suatu puzzle sudoku, program akan mengisi setiap nilai pada kotak 0 kemudian dilempar ke method solve pada Sudokusolver untuk diisikan angka yang sesuai dengan aturan sudoku. Kemudian dari kondisi puzzle yang disimpan, akan dilakukan beberapa kali permutasi, penukaran kolom dan baris hingga transpos agar menghasilkan suatu puzzle yang benar-benar acak.


SudokuSolver


Kelas SudokuSolver berguna untuk menyelesaikan puzzle sudoku yang sebelumnya sudah di-generate pada kelas SudokuGenerator. Untuk penyelesaian puzzle, program akan menggunakan algoritma backtracking untuk mengisi dan mengecek apakah angka yang ditempatkan valid sesuai aturan sudoku atau tidak. Dari keseluruhan permainan, kelas itu digunakan 2 kali yaitu pada saat pembuatan papan puzzle awal dan pada saat mengembalikan nilai pada papan puzzle karena diset 0 untuk menandakan kotak yang harus diisi oleh pemain.


Point


Kelas terakhir yaitu Point, merupakan kelas utilitas yang menyimpan nilai x dan y untuk grid atau kotak pada papan sudoku. Fungsinya adalah memudahkan kelas SudokuSolver dalam mengimplementasikan algoritma backtracking karena banyaknya grid yang harus dicek.

Pengetesan dan Demonstrasi






Komentar

Postingan populer dari blog ini

Tugas PBO Pertemuan 12

Tugas PBO Pertemuan 11

ETS PBO G