Algoritma Backtracking (Kasus 8 Ratu)
Algoritma Backtracking (Kasus 8 Ratu)
Disusun oleh :
Disusun oleh :
1.
1. ERLANGGA
ERLANGGA
(50406258)
(50406258)
2.
2. IDHAM
IDHAM JULHANDI
JULHANDI
(50406367)
(50406367)
3.
3. R.IBRAHIM
R.IBRAHIM SENOAJI
SENOAJI
(50406568)
(50406568)
4.
4. ROMMY
ROMMY KAMAL
KAMAL
(50406645)
(50406645)
5.
5. TAUFIQURAHMAN
TAUFIQURAHMAN
(50406709)
(50406709)
6.
6. FIRMAN
FIRMAN ISAI
ISAI
(50406296)
(50406296)
Kelas : 3IA12
Kelas : 3IA12
JURUSAN TEKNIK INFORMATIKA
JURUSAN TEKNIK INFORMATIKA
FAKULTAS TEKNOLOGI INDUSTRI
FAKULTAS TEKNOLOGI INDUSTRI
UNIVERSITAS GUNADARMA
UNIVERSITAS GUNADARMA
BAB I
BAB I
MATERI
MATERI
Dasar Teori
Dasar Teori
Runut balik (
Runut balik (
backtracking
backtracking
) merupakan algoritma yang berbasis pada DFS (
) merupakan algoritma yang berbasis pada DFS (
Depth First
Depth First
Search
Search
) untuk mencari solusi persoalan secara lebih optimal. Runut balik merupakan perbaikan
) untuk mencari solusi persoalan secara lebih optimal. Runut balik merupakan perbaikan
dari algoritma
dari algoritma
brute-force
brute-force
, secara sistematis mencari solusi persoalan di antara semua
, secara sistematis mencari solusi persoalan di antara semua
kemungkinan solusi yang ada. Perbedaan utamanya adalah pada konsep dasarnya, yauti pada
kemungkinan solusi yang ada. Perbedaan utamanya adalah pada konsep dasarnya, yauti pada
backtracking
backtracking
semua solusi dibuat dalam bentuk pohon solusi (tree), dan kemudian pohon
semua solusi dibuat dalam bentuk pohon solusi (tree), dan kemudian pohon
tersebut akan ditelusuri secara DFS sehingga ditemukan solusi terbaik yang diinginkan.
tersebut akan ditelusuri secara DFS sehingga ditemukan solusi terbaik yang diinginkan.
Dengan metode runut-balik, kita tidak perlu memeriksa semua kemungkinan solusi yang
Dengan metode runut-balik, kita tidak perlu memeriksa semua kemungkinan solusi yang
ada. Hanya pencarian yang mengarah ke solusi saja yang selalu dipertimabangkan. Akibatnya,
ada. Hanya pencarian yang mengarah ke solusi saja yang selalu dipertimabangkan. Akibatnya,
waktu pencarian dapat dihemat. Saat ini algoritma runut balik balik diterapkan untuk permainan
waktu pencarian dapat dihemat. Saat ini algoritma runut balik balik diterapkan untuk permainan
games (seperti permainan
games (seperti permainan
tic-tac-toe
tic-tac-toe
, menemukan jalan keluar dalam sebuah labirin, catur, dan
, menemukan jalan keluar dalam sebuah labirin, catur, dan
lain-lain) dan masalah-masalah pada bidang kecerdasan buatan (
lain-lain) dan masalah-masalah pada bidang kecerdasan buatan (
artificial intelligence
artificial intelligence
).
).
Misalkan
Misalkan pohon di
pohon di atas
atas menggambarkan solusi
menggambarkan solusi dari
dari suatu persoalan.
suatu persoalan. Jika
Jika kita
kita ingin
ingin
mencari
mencari solusi dari A
solusi dari A ke E, maka
ke E, maka jalur yang harus ditempuh
jalur yang harus ditempuh adalah (A-B-E). Demikian
adalah (A-B-E). Demikian juga
juga
untuk
untuk solusi-solusi
solusi-solusi yang
yang lain.
lain. Algoritma
Algoritma Backtracking
Backtracking akan memeriksa
akan memeriksa jalur secara
jalur secara DFS, yait
DFS, yaitu
u
dari
dari solusi
solusi terdalam
terdalam pertama
pertama yang
yang ditemui
ditemui yaitu
yaitu solusi
solusi E.
E. Jika
Jika ternyata
ternyata E
E bukanlah
bukanlah solusi
solusi
yang
yang diharapkan,
diharapkan, maka
maka pencarian
pencarian akan
akan dilanjutkan
dilanjutkan ke
ke F.
F. Jalur y
Jalur yang
ang harus dilalui
harus dilalui untuk
untuk bisa
bisa
mencapai
mencapai E
E adalah
adalah (A-B-E)
(A-B-E) dan
dan untuk
untuk mencapai
mencapai F
F adalah
adalah (A-B-F).
(A-B-F). Kedua
Kedua solusi
solusi tersebut
tersebut
memiliki
memiliki jalur
jalur awal
awal yang sama,
yang sama, yaitu (A-B).
yaitu (A-B). Jadi,
Jadi, daripada
daripada memeriksa
memeriksa ulang jalur
ulang jalur dari
dari A
A
kemudian
kemudian B,
B, maka
maka jalur
jalur (A-B)
(A-B) disimpan
disimpan dulu
dulu dan
dan langsung
langsung memeriksa
memeriksa solusi F.
solusi F. Untuk
Untuk kasus
kasus
pohon
pohon yang l
yang lebih
ebih rumit,
rumit, cara
cara ini
ini dianggap
dianggap lebih
lebih efisien
efisien daripada
daripada jika
jika menggunakan
menggunakan
algoritma Brute-Force.
Algoritma
Algoritma Backtracking
Backtracking digunakan
digunakan untuk
untuk membuat
membuat Artificial
Artificial Intelligence
Intelligence pada
pada board
board
games seperti catur, othello, dan checker. Dengan algoritma ini dapat dibuat pohon solusi
games seperti catur, othello, dan checker. Dengan algoritma ini dapat dibuat pohon solusi
sampai
sampai dengan
dengan kedalaman
kedalaman tertentu
tertentu dari
dari current
current status,
status, dan
dan dipilih
dipilih solusi
solusi yang
yang dapat
dapat membantu
membantu
user
user menemukan
menemukan langkah-langkah
langkah-langkah yang
yang nantinya
nantinya akan
akan menghasilkan
menghasilkan pohon
pohon solusi
solusi yang
yang
menguntungkan bagi user. Cara ini
menguntungkan bagi user. Cara ini dipakai sebagai Artificial Intelligence y
dipakai sebagai Artificial Intelligence yang digunakan untuk
ang digunakan untuk
menyelesaikan
menyelesaikan dynamic
dynamic problem.
problem. Beberapa
Beberapa contoh
contoh penggunaan
penggunaan dari
dari algoritma
algoritma Backtrack
Backtrack dari
dari
suatu masalah statik adalah untuk memecahkan masalah N-Queen problem dan Maze
suatu masalah statik adalah untuk memecahkan masalah N-Queen problem dan Maze
Solver.
Solver.
Pengguna
Pengguna N-Queen problem
N-Queen problem adalah permasalah
adalah permasalahan di
an di mana user
mana user harus
harus mencari cara
mencari cara
bagaimana
bagaimana meletakkan bidak
meletakkan bidak Queen catur
Queen catur sebanyak n
sebanyak n buah
buah pada Bidang
pada Bidang catur
catur atau
atau pada
pada
Bidang berukuran nxn sedemikian rupa sehingga tidak ada satu bidakpun yang dapat
Bidang berukuran nxn sedemikian rupa sehingga tidak ada satu bidakpun yang dapat
memakan
memakan bidak
bidak lainnya
lainnya hanya
hanya dengan1 langkah
dengan1 langkah (1
(1 gerakan). Meskipun
gerakan). Meskipun ada
ada kemungkinan
kemungkinan
terdapat
terdapat lebih dari
lebih dari satu
satu cara untuk
cara untuk mendapatkan
mendapatkan solusinya, tetapi
solusinya, tetapi tidak per
tidak perlu dilakukan
lu dilakukan
proses
proses pencarian untuk
pencarian untuk mendapatkan semu
mendapatkan semua solusin
a solusinya.Untuk beberapa
ya.Untuk beberapa kasus
kasus tertentu
tertentu perlu
perlu
dilakukan
dilakukan pencarian
pencarian terhadap
terhadap semua
semua solusi
solusi sehingga
sehingga dapat
dapat dipilih
dipilih satu
satu solusi
solusi terbaik.
terbaik.
Implementasi
Implementasi Backtrack
Backtracking
ing
Algoritma Backtrackin
Algoritma Backtracking
g akan
akan mencoba
mencoba menelsuri
menelsuri semua
semua solusi
solusi yang mungkin,
yang mungkin,
sehingga
sehingga pertama-tama
pertama-tama harus dibuat
harus dibuat algoritma das
algoritma dasar
ar yang
yang dapat melaku
dapat melakukan pencarian
kan pencarian
terhadap semua kemungkinan solusi. Lalu, algoritma tersebut diperbaiki dan dikembangkan
terhadap semua kemungkinan solusi. Lalu, algoritma tersebut diperbaiki dan dikembangkan
sehingga
sehingga cara
cara pencarian
pencarian solusinya
solusinya lebih
lebih efisien,
efisien, efektif,
efektif, dan
dan sistematis.
sistematis. Algoritma
Algoritma tersebut
tersebut
dibuat
dibuat untuk
untuk menelusuri
menelusuri kemungkinan
kemungkinan solusi
solusi pada
pada suatu
suatu pohon
pohon solusi
solusi abstrak.
abstrak. Algoritma
Algoritma
Backtracking dianggap
Backtracking dianggap sebagai
sebagai perbaikan dari
perbaikan dari algoritma Brute-Force
algoritma Brute-Force karena pada
karena pada
Backtracking
Backtracking penelusuran
penelusuran terhadap
terhadap cabang-cabang dapat
cabang-cabang dapat dihentikan
dihentikan jika
jika pada
pada suatu
suatu titik
titik
cabang
cabang tertentu
tertentu diketahui
diketahui bahwa
bahwa penelusuran
penelusuran tersebut
tersebut tidak
tidak akan
akan mencapai
mencapai solusi
solusi yang
yang
diinginkan. Dengan demikian, kompleksitas program dapat dikurangi.
Saat
Saat dilakukan
dilakukan penelusuran
penelusuran terhadap
terhadap B,
B, dipastikan
dipastikan bahwa
bahwa jalur
jalur tersebut
tersebut tidak
tidak akan
akan
menghasilkan
menghasilkan solusi
solusi yang
yang diinginkan.
diinginkan. Maka
Maka program lang
program langsung
sung menghentikan
menghentikan proses
proses pencarian
pencarian
dan kemudian langsung dilanjutkan ke
dan kemudian langsung dilanjutkan ke jalur
jalur C. Penelusuran terhadap jalur (A-B-E) dan (A-B-F)
C. Penelusuran terhadap jalur (A-B-E) dan (A-B-F)
pun
pun dihentikan.
dihentikan. Hal
Hal itu
itu membuat
membuat kompleksitas
kompleksitas waktu
waktu yang
yang diperlukan
diperlukan juga
juga berkurang,
berkurang,
sehingga
sehingga dapat
dapat menghemat
menghemat waktu
waktu yang
yang diperlukan.
diperlukan. Semakin
Semakin cepat
cepat terdeteksi
terdeteksi bahwa
bahwa jalur
jalur
yang
yang ditempuh
ditempuh tidak
tidak akan
akan menghasilkan
menghasilkan solusi
solusi optimal,
optimal, maka
maka program
program akan
akan bekerja
bekerja dengan
dengan
lebih efisien.
lebih efisien.
Dalam
Dalam Backtrack,
Backtrack, jika
jika kita
kita ingin
ingin kembali
kembali pada
pada kondisi sebelumnya,
kondisi sebelumnya, kita
kita harus
harus
menyimpan
menyimpan hasil perhitungan
hasil perhitungan dari kondisi
dari kondisi awal
awal sampai dengan
sampai dengan kondisi
kondisi tersebut.
tersebut. Pada
Pada bahasa
bahasa
pemrograman yang telah bisa menangani fungsi-fungsi atau prosedur-prosedur rekursif,
pemrograman yang telah bisa menangani fungsi-fungsi atau prosedur-prosedur rekursif,
penyimpanan dapat lebih mudah dilakukan. Manajemen memori dilakukan sepenuhnya oleh
penyimpanan dapat lebih mudah dilakukan. Manajemen memori dilakukan sepenuhnya oleh
compiler.
compiler. Pada
Pada bahasa
bahasa pemrograman
pemrograman lainnya,
lainnya, algoritma
algoritma Backtrack
Backtrack masih
masih dapat
dapat
diimplementasikan meskipun manajemen memori harus dilakukan oleh programmer.
diimplementasikan meskipun manajemen memori harus dilakukan oleh programmer.
Manajemen memori yang baik adalah dengan menggunakan pointer atau dynamic array,
Manajemen memori yang baik adalah dengan menggunakan pointer atau dynamic array,
karena
karena kedalaman
kedalaman pohon
pohon solusi
solusi yang
yang harus
harus ditelusuri
ditelusuri biasanya
biasanya bervariasi
bervariasi dan
dan tidak
tidak dapat
dapat
ditentukan.
Algoritma Runut-balik untuk Persoalan 8-Ratu
Algoritma Runut-balik untuk Persoalan 8-Ratu
(a)
(a) Versi iteratif
Versi iteratif
••
Dua buah ratu terletak pada baris yang sama, berarti
Dua buah ratu terletak pada baris yang sama, berarti
i = k
i = k
••
Dua buah ratu terletak pada kolom yang sama, berarti
Dua buah ratu terletak pada kolom yang sama, berarti
j=l
j=l
••
Dua buah ratu terletak pada diagonal yang sama, berarti
Dua buah ratu terletak pada diagonal yang sama, berarti
i-j=k-l atau
i-j=k-l atau
i+j=k+l
i+j=k+l
⇔
⇔
i-k=j-l atau k-i=j-l
i-k=j-l atau k-i=j-l
⇔
⇔
j-l
j-l
=
=
i-k
i-k
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8Skema iterative
Skema iterative
(b)
(b) Versi rekursif
Versi rekursif
Algoritma:
Algoritma:
••
Inisialisasi x[1], x[2], …, x[N] dengan 0
Inisialisasi x[1], x[2], …, x[N] dengan 0
for i
for i
←
←
N to n do
N to n do
x[i]
x[i]
←
←
0
0
endfor
endfor
procedure N_RATU_I(input N:integer) procedure N_RATU_I(input N:integer)
{ Mencetak semua solusi penempatan N buah ratu pada { Mencetak semua solusi penempatan N buah ratu pada
petak papan catur N x N tanpa melanggar kendala; versi iteratif petak papan catur N x N tanpa melanggar kendala; versi iteratif
Masukan: N = jumlah ratu Masukan: N = jumlah ratu
Keluaran: semua solusi x = (x[1], x[2], …, x[N]) dicetak ke Keluaran: semua solusi x = (x[1], x[2], …, x[N]) dicetak ke layar. layar. } } Deklarasi Deklarasi k : integer k : integer Algoritma: Algoritma: k
k←←11 {mulai pada baris catur ke-1}{mulai pada baris catur ke-1}
x[1]
x[1]←←00 {inisialisasi kolom dengan 0}{inisialisasi kolom dengan 0}
while k > 0 do while k > 0 do
x[k]
x[k]←←x[k]+1x[k]+1 {pindahkan ratu ke kolom berikutnya}{pindahkan ratu ke kolom berikutnya}
while (x[k]
while (x[k] ≤≤ N) and (not TEMPAT(k)) doN) and (not TEMPAT(k)) do
{periksa apakah ratu dapat ditempatkan pada kolom x[k]} {periksa apakah ratu dapat ditempatkan pada kolom x[k]}
x[k]:=x[k] + 1 x[k]:=x[k] + 1 endwhile endwhile {x[k] > n or TEMPAT(k) } {x[k] > n or TEMPAT(k) } if x[k]
if x[k]≤≤ n thenn then { kolom penempatan ratu ditemukan }{ kolom penempatan ratu ditemukan }
if k=N then
if k=N then { apakah solusi sudah lengkap?}{ apakah solusi sudah lengkap?}
CetakSolusi(x,N)
CetakSolusi(x,N) { cetak solosi}{ cetak solosi}
else else k
k←←k+1k+1 {pergi ke baris berikutnya}{pergi ke baris berikutnya}
x[k]
x[k]←←00 {inisialisasi kolom dengan 0}{inisialisasi kolom dengan 0}
endif endif else else k
k←←k-1k-1 { runut-balik ke baris sebelumnya}{ runut-balik ke baris sebelumnya}
endif endif endwhile endwhile { k = 0 } { k = 0 }
••
Panggil prosedur N_RATU_R(1)
Panggil prosedur N_RATU_R(1)
procedure N_RATU_R(input k:integer) procedure N_RATU_R(input k:integer)
{ Menempatkan ratu pada baris ke-k pada petak papan catur N x N { Menempatkan ratu pada baris ke-k pada petak papan catur N x N
tanpa melanggar kendala; versi rekursif tanpa melanggar kendala; versi rekursif
Masukan: N = jumlah ratu Masukan: N = jumlah ratu
Keluaran: semua solusi x = (x[1], x[2], …, x[N]) dicetak ke layar. Keluaran: semua solusi x = (x[1], x[2], …, x[N]) dicetak ke layar. } } Deklarasi Deklarasi stop : boolean stop : boolean Algoritma: Algoritma: stop
stop
←
←
falsefalsewhile not stop do while not stop do
x[k]
x[k]
←
←
x[k]+1x[k]+1 { pindahkan ratu ke kolom berikutnya }{ pindahkan ratu ke kolom berikutnya } while (x[k]while (x[k]
≤≤
n) and (not TEMPAT(k)) don) and (not TEMPAT(k)) do{ periksa apakah ratu dapat ditempatkan pada kolom x[k] } { periksa apakah ratu dapat ditempatkan pada kolom x[k] }
x[k] x[k]
←
←
x[k]+1x[k]+1 endwhile endwhile { x[k] > n or TEMPAT(k) } { x[k] > n or TEMPAT(k) } if x[k]if x[k]
≤≤
N thenN then { kolom penempatan ratu ditemukan }{ kolom penempatan ratu ditemukan } if k=N thenif k=N then { apakah solusi sudah lengkap? }{ apakah solusi sudah lengkap? } CetakSolusi(x,N)
CetakSolusi(x,N) { cetak solusi }{ cetak solusi } else
else
N_RATU_R(k+1) N_RATU_R(k+1) else
else { x[k] > N { x[k] > N gagal, semua kolom sudah dicoba }gagal, semua kolom sudah dicoba } stop
stop
←
←
truetrue x[k] x[k]←
←
00 endif endif endwhile endwhile {stop} {stop}Tampilan awal program
Tampilan awal program
BAB II
BAB II
APLIKASI
APLIKASI
Kasus KasusPersoalan 8 Ratu, diberikan sebuah bidang yang berukuran 8x8
Persoalan 8 Ratu, diberikan sebuah bidang yang berukuran 8x8 dan delapan buah ratu, dimana 8dan delapan buah ratu, dimana 8 ratu harus ditempatkan pada petak-petak b idang catur sedemikian hingga tidak ada ratu
ratu harus ditempatkan pada petak-petak b idang catur sedemikian hingga tidak ada ratu lain yanglain yang menempati posisi ratu pada baris yang sama, atau pada satu kolom yang
menempati posisi ratu pada baris yang sama, atau pada satu kolom yang sama, atau pada satu diagonalsama, atau pada satu diagonal yang sama.
yang sama.
Screen Shoot
Ketika program dimainkan Ketika program dimainkan
Ketika user menekan tombol Solve Ketika user menekan tombol Solve
Source code
Source code
File
FileBidang.javaBidang.java import java.awt.*; import java.awt.*; import
import java.awt.evjava.awt.event.*;ent.*;
public class Bidang extends Canvas implements MouseListener public class Bidang extends Canvas implements MouseListener {
{
int[][] kotak = new
int[][] kotak = new int[8][8];int[8][8]; int
int lebar,tinggilebar,tinggi;;
Graphics grafik = this.getGraphics(); //menggambar objek grafik Graphics grafik = this.getGraphics(); //menggambar objek grafik
public Bidang()
public Bidang() //konstruktor//konstruktor { { addMouseListener(this); addMouseListener(this); initBidang(); initBidang(); } } public void i
public void i nitBidangnitBidang()() {
{
//pertama
//pertama, beri harga , beri harga awal dahulu pada setiap kotakawal dahulu pada setiap kotak for(int i=0;i<8;i++) for(int i=0;i<8;i++) for(int j=0;j<8;j++) for(int j=0;j<8;j++) kotak[i][j]=0; kotak[i][j]=0; } }
public void paint(Graphics g) public void paint(Graphics g) {
{
g = grafik; g = grafik;
//membagi kotak kemudian memberi garis //membagi kotak kemudian memberi garis lebar =
lebar = getBounds()getBounds().width/8;.width/8;
/** /**
getBounds getBounds
public Rectangle getBounds() public Rectangle getBounds()
Gets the bounds of this component in the form of a Rectangle object. Gets the bounds of this component in the form of a Rectangle object.
bounds specify this component's width, height, and location relative to its parent. bounds specify this component's width, height, and location relative to its parent. Returns:
Returns:
a rectangle indicating this
a rectangle indicating this component's boundscomponent's bounds See Also:
See Also:
setBounds(in
setBounds(int, int, t, int, int, int)int, int) **/ **/ tinggi = getBounds().height/8; tinggi = getBounds().height/8; for(int i=0;i<8;i++) for(int i=0;i<8;i++) for(int j=0;j<8;j++) for(int j=0;j<8;j++) beriGaris(i,j); beriGaris(i,j); } }
private void beriGaris(int x,int y) private void beriGaris(int x,int y) { { int dark = 0; int dark = 0; grafik.setColor(Color.black); grafik.setColor(Color.black); grafik.drawRect(x*lebar,y*tinggi,lebar,tinggi); grafik.drawRect(x*lebar,y*tinggi,lebar,tinggi);
/** /** * * drawRect drawRect
public void drawRect(int x, public void drawRect(int x, int y, int y, int width, int width, int height) int height)
Draws the outline of the specified rectangle. The left and right edges of the rectangle are Draws the outline of the specified rectangle. The left and right edges of the rectangle are at x and x + width. The top and bottom edges are at y and y + height. The rectangle is drawn at x and x + width. The top and bottom edges are at y and y + height. The rectangle is drawn using the graphics context's current color.
using the graphics context's current color. Parameters:
Parameters:
x - the x coordinate of the rectangle to be drawn. x - the x coordinate of the rectangle to be drawn. y - the y coordinate of the rectangle to be drawn. y - the y coordinate of the rectangle to be drawn. width - the width of the rectangle to be drawn. width - the width of the rectangle to be drawn. height - the height of the rectangle to be drawn. height - the height of the rectangle to be drawn. * * **/ **/ if((x+y)%2==0) if((x+y)%2==0) dark=20;//
dark=20;//default abu-abu, jika default abu-abu, jika kotak genap kotak genap warnanya putih. (0+230=abu-abu, 20+230=putih).warnanya putih. (0+230=abu-abu, 20+230=putih).
switch(kotak[x][y]) switch(kotak[x][y]) {
{
case 0:grafik.setColor(new Color(230+dark,230+dark,230+dark));break;//tampilan awal dan clear case 0:grafik.setColor(new Color(230+dark,230+dark,230+dark));break;//tampilan awal dan clear case 1:grafik.setColor(new Color(160+dark,110+dark,110+dark));break;
case 1:grafik.setColor(new Color(160+dark,110+dark,110+dark));break; //posisi ratu secara horizontal,vertikal,serong
//posisi ratu secara horizontal,vertikal,serong
case 2:grafik.setColor(new Color(0,0,0));break;//hitam (letak ratu) case 2:grafik.setColor(new Color(0,0,0));break;//hitam (letak ratu) }
}
grafik.fillRect(x*lebar+1,y*tinggi+1,lebar-1,tinggi-1); grafik.fillRect(x*lebar+1,y*tinggi+1,lebar-1,tinggi-1);
/** /**
public abstract void fillRect(int x, public abstract void fillRect(int x, int y, int y, int width, int width, int height) int height)
Fills the specified rectangle. The left and right edges of the rectangle are at x and x + Fills the specified rectangle. The left and right edges of the rectangle are at x and x + width - 1. The top and
width - 1. The top and bottom edges are at y and bottom edges are at y and y + height - 1. The y + height - 1. The resulting rectanglresulting rectangle coverse covers an area width pixels wide by height pixels tall. The rectangle is filled using the graphics an area width pixels wide by height pixels tall. The rectangle is filled using the graphics context's current color.
context's current color. * * **/ **/ } }
public void mouseExited(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseE
public void mouseReleased(MouseEvent e) vent e) {}{} public void mouseClicked(MouseEv
public void mouseClicked(MouseEvent e) ent e) {}{} public void mouseEntered(MouseEv
public void mouseEntered(MouseEvent e) ent e) {}{}
public void m
public void m ousePressousePressed(MouseEvent me)ed(MouseEvent me) {
{
int x =
int x = me.getX()/lme.getX()/lebar;ebar; int y
int y = me.getY()/tinggi;= me.getY()/tinggi;
if(cek(x,y)) if(cek(x,y)) { { if (kotak[x][y]==0) if (kotak[x][y]==0) taruhRatu(x,y,true); taruhRatu(x,y,true);
//pertama kali ratu diletakkan, semua kordianat bernilai 0. //pertama kali ratu diletakkan, semua kordianat bernilai 0. else if
else if (kotak[x][y](kotak[x][y]==2)==2) taruhRatu(x,y,false); taruhRatu(x,y,false);
} }
} }
private void taruhRatu(int x,int y,boolean taruh) private void taruhRatu(int x,int y,boolean taruh)
{ { grafik=this.getGraphics(); grafik=this.getGraphics(); if(taruh) if(taruh) kotak[x][y]=2; kotak[x][y]=2; else else kotak[x][y]=0; kotak[x][y]=0; for(int i=0;i<8;i++) for(int i=0;i<8;i++) { {
if(i!=y) pindah(x,i,taruh);//secara vertikal if(i!=y) pindah(x,i,taruh);//secara vertikal
if(i!=x) pindah(i,y,taruh);//secara horizontal if(i!=x) pindah(i,y,taruh);//secara horizontal
} }
for(int
for(int i=1;cek(x+ii=1;cek(x+i,y+i);i++),y+i);i++)
pindah(x+i
pindah(x+i,y+i,taruh);,y+i,taruh);//serong //serong kanan kanan bawahbawah
for(int i=1;cek(x+i
for(int i=1;cek(x+i,y-i);i++)//y bernilai min (-), semakin ke ,y-i);i++)//y bernilai min (-), semakin ke atasatas
pindah(x+i
pindah(x+i,y-i,taruh);,y-i,taruh);//serong //serong kanan kanan atasatas
for(int i=1;cek(x-i,y+i);i++)//x bernilai min(-), semakin ke bawah for(int i=1;cek(x-i,y+i);i++)//x bernilai min(-), semakin ke bawah
pindah(x-i,y+i,taruh);//serong kiri bawah pindah(x-i,y+i,taruh);//serong kiri bawah
for(int i=1;cek(x-i,y-i);i++)// x dan y bernilai min, semakin ke kiri atas for(int i=1;cek(x-i,y-i);i++)// x dan y bernilai min, semakin ke kiri atas
pindah(x-i,y-i,taruh);//serong kiri atas pindah(x-i,y-i,taruh);//serong kiri atas
beriGaris(x,y); beriGaris(x,y);
} }
private void pindah(int x,int y,boolean taruh) private void pindah(int x,int y,boolean taruh) {
{
if(taruh &&
if(taruh && kotak[x][y]=kotak[x][y]==0)=0)
kotak[x][y]=1;// jika kotak hitam tersebut di klik lagi ubah flagnya. kotak[x][y]=1;// jika kotak hitam tersebut di klik lagi ubah flagnya. else if(!taruh && kotak[x][y]==1)
else if(!taruh && kotak[x][y]==1) kotak[x][y]=0; kotak[x][y]=0; beriGaris(x,y); beriGaris(x,y); } }
private boolean cek(int x, int y) private boolean cek(int x, int y) {
{
return (x>=0 && x<8 && y>=0 && y<8); return (x>=0 && x<8 && y>=0 && y<8); }
}
public boolean solve(int y) { public boolean solve(int y) { int i,j; int i,j; boolean r = false; boolean r = false; for (i=0;i<8;i++) { for (i=0;i<8;i++) { if (kotak[i][y] == 0) { if (kotak[i][y] == 0) { taruhRatu(i,y,true); taruhRatu(i,y,true); if (y == 7) { if (y == 7) { return true; return true; } else { } else { if (solve(y+1)) { if (solve(y+1)) { return true; return true; } else { } else { taruhRatu(i,y,false); taruhRatu(i,y,false);
} } } } } } } } return false; return false; } } } }
File
FileRatuApplet.javaRatuApplet.java
import
import java.appletjava.applet.Applet;.Applet; import java.awt.*;
import java.awt.*; import
import java.awt.evjava.awt.event.*;ent.*;
public class RatuApplet extends Applet implements ActionListener public class RatuApplet extends Applet implements ActionListener {
{
Button refresh =
Button refresh = new Button("Refresh");new Button("Refresh"); Button
Button solve = nesolve = new Button("Sow Button("Solve");lve"); Bidang Bidang = new
Bidang Bidang = new Bidang();Bidang();
public void init() public void init() {
{
setLayout(
setLayout(new new BorderLayout(BorderLayout());)); add("Center",Bidang);
add("Center",Bidang);
Panel panel = new Panel(); Panel panel = new Panel();
add("South",panel);//kemungkinan besar, defaultnya BorderLayout add("South",panel);//kemungkinan besar, defaultnya BorderLayout panel.setLayout(new GridLayout(1,5)); panel.setLayout(new GridLayout(1,5)); panel.add(new Label("")); panel.add(new Label("")); panel.add(refresh); panel.add(refresh); panel.add(new Label("")); panel.add(new Label("")); panel.add(solve); panel.add(solve); panel.add(new Label("")); panel.add(new Label("")); refresh.addActionListener(this); refresh.addActionListener(this); solve.addActionListener(this); solve.addActionListener(this); } }
public void
public void actionPerformedactionPerformed(ActionEve(ActionEvent nt ae)ae) { { if(ae.getSource()==refresh) if(ae.getSource()==refresh) { { Bidang.initBidang(); Bidang.initBidang(); Bidang.pai
Bidang.paint(Bidang.gent(Bidang.getGraphics());tGraphics()); }else if (ae.getSource() == solve) {
}else if (ae.getSource() == solve) { Bidang.initBidang(); Bidang.initBidang(); Bidang.pai
Bidang.paint(Bidang.gent(Bidang.getGraphics());tGraphics()); Bidang.solve(0); Bidang.solve(0); } } } } } }
Logika program
Logika program
File
FileBidang.javaBidang.java
Pada program ini kita menggunakan 2 paket yaitu
Pada program ini kita menggunakan 2 paket yaitu paket “java.awt.*” dan “java.awt.event.*”,paket “java.awt.*” dan “java.awt.event.*”, paket java.awt digunakan untuk membuat tampilan dan menggambar grafik serta gambar, sedangkan paket java.awt digunakan untuk membuat tampilan dan menggambar grafik serta gambar, sedangkan java.awt.event.* digunakan untuk menangani penanganan kejadian.
java.awt.event.* digunakan untuk menangani penanganan kejadian.
Pada class Bidang yang
di-Pada class Bidang yang di-extendsextendsdari kelas Canvas dan medari kelas Canvas dan mengimplementasikan dari interfacengimplementasikan dari interface MouseListener. Interface MouseListener sendiri berguna untuk menerima inputan dari mouse ( MouseListener. Interface MouseListener sendiri berguna untuk menerima inputan dari mouse ( press, press, release, click, enter, and exit
release, click, enter, and exit ). Untuk membuat ). Untuk membuat 16 kotak maka kita menggunakan 16 kotak maka kita menggunakan array 2 dimensi atauarray 2 dimensi atau matriks dengan dimensi 8x8, selanjutnya untuk variabel lebar dan tinggi kita
matriks dengan dimensi 8x8, selanjutnya untuk variabel lebar dan tinggi kita deklarasikan bertipedeklarasikan bertipe integer. Method
integer. MethodgetGraphics()getGraphics()sendiri berguna untuk menggambar objek grafik dimana objeknyasendiri berguna untuk menggambar objek grafik dimana objeknya diambil dari kelas grafik itu sendiri dengan menghubungkan ke variabel grafik. Method Bidang() sebagai diambil dari kelas grafik itu sendiri dengan menghubungkan ke variabel grafik. Method Bidang() sebagai konstruktor, terdapat 2
konstruktor, terdapat 2 method yaitu addMouseListener(this) dan initBidang(). Pada konstruktormethod yaitu addMouseListener(this) dan initBidang(). Pada konstruktor tersebut memanggil method initBidang().
tersebut memanggil method initBidang(). import java.awt.*;
import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
public class Bidang extends Canvas implements MouseListener public class Bidang extends Canvas implements MouseListener {
{
int[][] kotak = new int[8][8]; int[][] kotak = new int[8][8]; int lebar,tinggi;
int lebar,tinggi;
Graphics grafik = this.getGraphics(); Graphics grafik = this.getGraphics(); public Bidang()
public Bidang() //konstrukto//konstruktorr { { addMouseListener(this); addMouseListener(this); initBidang(); initBidang(); } }
Pada method initBidang(), berguna untuk memberi harga awal pada setiap kotak dengan nilai 0. Pada method initBidang(), berguna untuk memberi harga awal pada setiap kotak dengan nilai 0. Karena menggunakan array 2 dimensi maka kita menggunakan 2
Karena menggunakan array 2 dimensi maka kita menggunakan 2 perulangan yang berguna sebagai batasperulangan yang berguna sebagai batas elemen yang diwakili
elemen yang diwakili variabel variabel i dan j.i dan j.
Method paint
Method paint digunakan untuk digunakan untuk membagi kotak yang telah kita bmembagi kotak yang telah kita buat dengan parameter melaluiuat dengan parameter melalui method grafik. Kita membagi
method grafik. Kita membagi kotak dengan statement getBounds menukotak dengan statement getBounds menurut lebar dan tingginyarut lebar dan tingginya sebanyak 8 kotak.
sebanyak 8 kotak. Kemudian kita berikan garis pada kotak yang telah kita bagi denKemudian kita berikan garis pada kotak yang telah kita bagi dengan memanggilgan memanggil method beriGaris(i,j).
method beriGaris(i,j).
public void initBidang() public void initBidang()
{ {
//pertama, beri harga awal dahulu pada setiap kotak //pertama, beri harga awal dahulu pada setiap kotak
for(int i=0;i<8;i++) for(int i=0;i<8;i++) for(int j=0;j<8;j++) for(int j=0;j<8;j++) kotak[i][j]=0; kotak[i][j]=0; } }
public void paint(Graphics g) public void paint(Graphics g)
{ {
g = grafik; g = grafik;
//membagi kotak kemudian memberi garis //membagi kotak kemudian memberi garis
lebar =
lebar = getBounds().getBounds().width/8;width/8;
tinggi =
tinggi = getBounds()getBounds().height/8;.height/8;
for(int i=0;i<8;i++) for(int i=0;i<8;i++) for(int j=0;j<8;j++) for(int j=0;j<8;j++) beriGaris(i,j); beriGaris(i,j); } }
private void beriGaris(int x,int y) private void beriGaris(int x,int y)
{ { int dark = 0; int dark = 0; grafik.setColor(Color.black); grafik.setColor(Color.black); grafik.drawRect(x*lebar,y*tinggi,lebar,tinggi); grafik.drawRect(x*lebar,y*tinggi,lebar,tinggi);
//public void drawRect(int x,int y,int width,int height) //public void drawRect(int x,int y,int width,int height) if((x+y)%2==0) if((x+y)%2==0) dark=20; dark=20; switch(kotak[x][y]) switch(kotak[x][y]) { {
case 0:grafik.setColor(new Color(230+dark,230+dark,230+dark));break; case 0:grafik.setColor(new Color(230+dark,230+dark,230+dark));break; case 1:grafik.setColor(new Color(160+dark,110+dark,110+dark));break; case 1:grafik.setColor(new Color(160+dark,110+dark,110+dark));break; case
case 2:grafik.set2:grafik.setColor(new Color(new Color(0,0,Color(0,0,0));break;0));break; }
}
grafik.fillRect(x*lebar+1,y*tinggi+1,lebar-1,tinggi-1); //beri warna grafik.fillRect(x*lebar+1,y*tinggi+1,lebar-1,tinggi-1); //beri warna }
}
Pada method beriGaris ini, kita akan memberikan garis untuk
Pada method beriGaris ini, kita akan memberikan garis untuk kotak yang telah kita bagi padakotak yang telah kita bagi pada method paint. Pertama, kita deklarasikan variabel dark sebagai integer
method paint. Pertama, kita deklarasikan variabel dark sebagai integer dengan nilai awal 0(nol). Setelahdengan nilai awal 0(nol). Setelah itu, kita panggil method setColor dari class grafik y
itu, kita panggil method setColor dari class grafik y ang fungsinya untuk memberikan warna yaituang fungsinya untuk memberikan warna yaitu black
black (hitam). Kemudian kita juga memanggil method drawRect untuk menggambar garis t(hitam). Kemudian kita juga memanggil method drawRect untuk menggambar garis t epi (epi (outline)outline) dari persegi panjang.
dari persegi panjang. Untuk perubahan warna, kita tentukan dengan statement kondisi if sUntuk perubahan warna, kita tentukan dengan statement kondisi if sesuai letakesuai letak koordinat kotak. Jika x(lebar) + y(tinggi) mod 2 hasilnya adalah 0(nol), maka nilai dari variabel dark akan koordinat kotak. Jika x(lebar) + y(tinggi) mod 2 hasilnya adalah 0(nol), maka nilai dari variabel dark akan menjadi 20.
menjadi 20.
Kemudian kita tentukan kondisi dengan statement
Kemudian kita tentukan kondisi dengan statement switch- caseswitch- case. Apabila terjadi case 0(nol),. Apabila terjadi case 0(nol), warnanya akan kita set dengan warna baru me
warnanya akan kita set dengan warna baru me nggunakan RGB dengan ketentuannggunakan RGB dengan ketentuanRed Red :230+dark,:230+dark, Green
Green:230+dark dan:230+dark danBlueBlue:230+dark. Apabila terjadi case 1(satu), warnanya akan kita set :230+dark. Apabila terjadi case 1(satu), warnanya akan kita set dengan warnadengan warna baru menggunakan RGB dengan ketentuan R:160+dark, G
baru menggunakan RGB dengan ketentuan R:160+dark, G:110+dark dan B:110+dark. Dan apabila terjadi:110+dark dan B:110+dark. Dan apabila terjadi case 2(dua), warnanya kita set denga war
case 2(dua), warnanya kita set denga war na baru menggunakan RGB dengan ketentuan R:0, G:0 na baru menggunakan RGB dengan ketentuan R:0, G:0 dandan B:0.(warnanya menjadi hitam). Kita akan mengisi warna sesuai dengan case tersebut dengan met B:0.(warnanya menjadi hitam). Kita akan mengisi warna sesuai dengan case tersebut dengan met hodhod fillRect.
public void mouseExited(MouseEve
public void mouseExited(MouseEvent e) nt e) {}{} public void mouseReleased(MouseE
public void mouseReleased(MouseEvent e) vent e) {}{} public void mouseClicked(MouseEv
public void mouseClicked(MouseEvent e) ent e) {}{} public void mouseEntered(MouseEv
public void mouseEntered(MouseEvent e) ent e) {}{} public void m
public void m ousePressousePressed(MouseEvent me)ed(MouseEvent me) {
{
int x =
int x = me.getX()/lme.getX()/lebar;ebar; int y
int y = me.getY()/tinggi;= me.getY()/tinggi;
if(cek(x,y)) if(cek(x,y)) { { if (kotak[x][y]==0) if (kotak[x][y]==0) taruhRatu(x,y,true); taruhRatu(x,y,true); else if
else if (kotak[x][y](kotak[x][y]==2)==2) taruhRatu(x,y,false); taruhRatu(x,y,false); } } } }
Pada bagian ini, terdapat banyak event-event yang berhubungan dengan mouse. Karena Pada bagian ini, terdapat banyak event-event yang berhubungan dengan mouse. Karena program ini kita menggunakan event mousePressed, maka kita
program ini kita menggunakan event mousePressed, maka kita dapat mengkosongkan event-event yangdapat mengkosongkan event-event yang tidak digunakan. Jika tidak ditulis, ketika
tidak digunakan. Jika tidak ditulis, ketika akan melakukanakan melakukancompilecompileprogram akan menampilkan pesanprogram akan menampilkan pesan error
error . Pada event mousePressed, jika kita menekan tombol mouse pada suatu . Pada event mousePressed, jika kita menekan tombol mouse pada suatu kotak, maka titikkotak, maka titik koordinat kotak tersebut akan dimasukkan ke dalam variabel, x untuk lebar
koordinat kotak tersebut akan dimasukkan ke dalam variabel, x untuk lebar dan y untuk tinggi. Untukdan y untuk tinggi. Untuk kordinat x didapat dari letak ratu diletakkan (dengan memanggil method getX()) dibagi dengan variabel kordinat x didapat dari letak ratu diletakkan (dengan memanggil method getX()) dibagi dengan variabel lebar dari method paint(). Sedangkan kordinat y didapat dari letak rat
lebar dari method paint(). Sedangkan kordinat y didapat dari letak rat u dibagi dengan variabel tinggi dariu dibagi dengan variabel tinggi dari method paint().
method paint().
Kemudian, kita akan mengecek letak
Kemudian, kita akan mengecek letak koordinat kotak dengan memanggil method cekkoordinat kotak dengan memanggil method cek menggunakan statement
menggunakan statementif if . Method . Method cek() sendiri berguna cek() sendiri berguna untuk memeriksa apakah posisi untuk memeriksa apakah posisi mouse ketikamouse ketika ratu diletakkan berada dalam keseluruhan
ratu diletakkan berada dalam keseluruhaninterfaceinterfaceprogram, jika program, jika masih masih berada dalam berada dalam keseluruhankeseluruhan interface program maka program akan m
interface program maka program akan mengembalikan nilaiengembalikan nilaitruetrue, jika tidak program tidak akan, jika tidak program tidak akan memberikan nilai balik. Jika method cek memberikan nilai
memberikan nilai balik. Jika method cek memberikan nilaitruetrue, maka akan dilakukan seleksi kondisi, maka akan dilakukan seleksi kondisi dengan statement if lagi. Apabila nilai dari kotak sama dengan 0(nol), kita masukkan nilai dari x dengan statement if lagi. Apabila nilai dari kotak sama dengan 0(nol), kita masukkan nilai dari x dan ydan y beserta hasil Boolean ‘true’ pada method taruhRatu, tet
beserta hasil Boolean ‘true’ pada method taruhRatu, tet api apabila nilai dari kotak sama dengan 2(dua)api apabila nilai dari kotak sama dengan 2(dua) maka kita masukkan nilai dari x dan y beserta
private void taruhRatu(int x,int y,boolean taruh) private void taruhRatu(int x,int y,boolean taruh) { { grafik=this.getGraphics(); grafik=this.getGraphics(); if(taruh) if(taruh) kotak[x][y]=2; kotak[x][y]=2; else else kotak[x][y]=0; kotak[x][y]=0; for(int i=0;i<8;i++) for(int i=0;i<8;i++) { {
if(i!=y) pindah(x,i,taruh); //vertikal if(i!=y) pindah(x,i,taruh); //vertikal if(i!=x) pindah(i,y,taruh);
if(i!=x) pindah(i,y,taruh); //horizontal//horizontal }
}
for(int
for(int i=1;cek(x+ii=1;cek(x+i,y+i);i++),y+i);i++)
pindah(x+i,y+i,taruh); //serong kanan bawah pindah(x+i,y+i,taruh); //serong kanan bawah
for(int i=1;cek(x+i,y-i);i++) //y bernilai min (-), semakin ke atas. for(int i=1;cek(x+i,y-i);i++) //y bernilai min (-), semakin ke atas.
pindah(x+i
pindah(x+i,y-i,taruh); //serong kanan ,y-i,taruh); //serong kanan atasatas
for(int i=1;cek(x-i,y+i);i++)//x bernilai min(-), semakin ke bawah for(int i=1;cek(x-i,y+i);i++)//x bernilai min(-), semakin ke bawah
pindah(x-i
pindah(x-i,y+i,taruh); //serong kiri ,y+i,taruh); //serong kiri bawahbawah
for(int i=1;cek(x-i,y-i);i++)// x dan y bernilai min, semakin ke kiri atas for(int i=1;cek(x-i,y-i);i++)// x dan y bernilai min, semakin ke kiri atas
pindah(x-i
pindah(x-i,y-i,taruh); //serong kiri ,y-i,taruh); //serong kiri atasatas beriGaris(x,y);
beriGaris(x,y); }
}
Method taruhRatu ini berguna untuk meletakkan “ratu” ke t
Method taruhRatu ini berguna untuk meletakkan “ratu” ke t empat yang memungkinkan untukempat yang memungkinkan untuk diletakkan. Sebelumnya, kita akan memanggil fungsi grafik yang telah dibuat. Kemudian, kita lakukan diletakkan. Sebelumnya, kita akan memanggil fungsi grafik yang telah dibuat. Kemudian, kita lakukan seleksi kondisi. Apabila nilai dari variable taruh (yang di-input dari method mousePressed) “true”, maka, seleksi kondisi. Apabila nilai dari variable taruh (yang di-input dari method mousePressed) “true”, maka, kita tentukan nilai dari kotak menjadi 2(dua) dan apabila nilainya “false”, maka nilai dari variable kotak kita tentukan nilai dari kotak menjadi 2(dua) dan apabila nilainya “false”, maka nilai dari variable kotak kita ubah menjadi 0(nol).
Untuk dapat mengetahui posisi ratu secara vertikal atau horizontal agar
Untuk dapat mengetahui posisi ratu secara vertikal atau horizontal agar tidak dapat diletakkantidak dapat diletakkan oleh ratu lainnya, maka kita lakukan perulangan untuk variabel i. Untuk posisi secara vertikal,
oleh ratu lainnya, maka kita lakukan perulangan untuk variabel i. Untuk posisi secara vertikal, Jika nilaiJika nilai dari variable i tidak sama dengan y, maka kita
dari variable i tidak sama dengan y, maka kita masukkan nilai x, i dan hasil Boolean untuk variable taruhmasukkan nilai x, i dan hasil Boolean untuk variable taruh pada method pindah.
pada method pindah.
Kita asumsikan kita meletakkan ratu pada posisi (0,0), maka nilai dari variabel x=
Kita asumsikan kita meletakkan ratu pada posisi (0,0), maka nilai dari variabel x= 0, y=0, dan0, y=0, dan taruh bernilai
taruh bernilaitruetrue. Karena variabel i sama dengan y maka pro. Karena variabel i sama dengan y maka program tidak akan menyimpan posisigram tidak akan menyimpan posisi tersebut secara vertikal. Ketika
tersebut secara vertikal. Ketika i=1, karena variabel i tidak sama dengan y maka i=1, karena variabel i tidak sama dengan y maka program akanprogram akan menyimpan posisi tersebut secara vertikal pada kotak (0,1) begitu
menyimpan posisi tersebut secara vertikal pada kotak (0,1) begitu seterusnya sampai pada kotak (0,7).seterusnya sampai pada kotak (0,7).
Lalu untuk posisi secara horizontal, jika nilai i juga t
Lalu untuk posisi secara horizontal, jika nilai i juga t idak sama dengan x, kita masukkan nilai i, yidak sama dengan x, kita masukkan nilai i, y dan hasil Boolean untuk variable taruh pada method pindah. Jika variabel taruh bernilai
dan hasil Boolean untuk variable taruh pada method pindah. Jika variabel taruh bernilai false false, maka ratu, maka ratu tidak dapat diletakkan secara horizontal. Sama halnya pada posisi secara vertikal, kita
tidak dapat diletakkan secara horizontal. Sama halnya pada posisi secara vertikal, kita asumsikan kitaasumsikan kita meletakkan ratu pada posisi (0,0). Ketika pada posisi (0,0) program tidak akan
meletakkan ratu pada posisi (0,0). Ketika pada posisi (0,0) program tidak akan menyimpan posisimenyimpan posisi tersebut secara horizontal. Ketika i=1,
tersebut secara horizontal. Ketika i=1, karena variabel i tidak sama dengan x maka program karena variabel i tidak sama dengan x maka program akanakan menyimpan posisi tersebut pada kotak (1,0) begitu seterusnya sampai pada kotak(7,0) agar tidak menyimpan posisi tersebut pada kotak (1,0) begitu seterusnya sampai pada kotak(7,0) agar tidak ditempati oleh ratu
ditempati oleh ratu lainnya.lainnya.
Untuk bisa menaruh ratu di semua tempat,
Untuk bisa menaruh ratu di semua tempat, kita harus mengatur semua kotak agar bisa untukkita harus mengatur semua kotak agar bisa untuk menempatkan ratu, atau memindahkan ratu bila tidak bisa diletakkan. Untuk itu, kita adakan
menempatkan ratu, atau memindahkan ratu bila tidak bisa diletakkan. Untuk itu, kita adakan
perulangan – perulangan berikut: pada perulangan pertama, untuk menyimpan posisi ratu secara serong perulangan – perulangan berikut: pada perulangan pertama, untuk menyimpan posisi ratu secara serong kanan bawah agar tidak ditempati ratu lain,
kanan bawah agar tidak ditempati ratu lain, untuk variable x+i dan y+i dengan nilai awal i adaluntuk variable x+i dan y+i dengan nilai awal i adalah 1(satu)ah 1(satu) berlanjut selama masih bernilai “true” pada method cek, k
berlanjut selama masih bernilai “true” pada method cek, k ita masukkan nilai x+i, y+i dan hasil Booleanita masukkan nilai x+i, y+i dan hasil Boolean untuk variable taruh pada method pindah. Kita asumsikan kita meletakkan ratu pada posisi (0,0), ketika untuk variable taruh pada method pindah. Kita asumsikan kita meletakkan ratu pada posisi (0,0), ketika variabel i=1, maka variabel x=1, dan
variabel i=1, maka variabel x=1, dan y=1 (pindah(x+i,y+i,taruh)), karena variabel taruh bernilai 0 (y=1 (pindah(x+i,y+i,taruh)), karena variabel taruh bernilai 0 (truetrue)) maka posisi tersebut dapat disimpan. Begitu juga seterusnya pada posisi (2,2), (3,3), (4,4),
maka posisi tersebut dapat disimpan. Begitu juga seterusnya pada posisi (2,2), (3,3), (4,4), sampaisampai dengan posisi (8,8).
dengan posisi (8,8).
Kemudian pada perulangan kedua, yaitu secara serong kanan atas,
Kemudian pada perulangan kedua, yaitu secara serong kanan atas, untuk variable x+i dan y-iuntuk variable x+i dan y-i dengan nilai awal i adalah 1(satu) berlanjut selama masih bernilai “
dengan nilai awal i adalah 1(satu) berlanjut selama masih bernilai “truetrue” pada method cek(), kita” pada method cek(), kita
masukkan nilai x+i, y-i dan hasil Boolean untuk variable taruh pada method pindah. Kita asumsikan kita masukkan nilai x+i, y-i dan hasil Boolean untuk variable taruh pada method pindah. Kita asumsikan kita meletakkan ratu pada posisi (0,0) variabel i=1, maka variabel x=1,
meletakkan ratu pada posisi (0,0) variabel i=1, maka variabel x=1, dan y=-1 (pindah(x+i,y-i,taruh)),dan y=-1 (pindah(x+i,y-i,taruh)), karena variabel taruh bernilai 0 (
karena variabel taruh bernilai 0 (truetrue) maka posisi tersebut dapat disimpan, yaitu pada posisi (1,-1),) maka posisi tersebut dapat disimpan, yaitu pada posisi (1,-1), begitu seterusnya pada posisi (1,-2), (1,-3), sampai pada posisi (1,-7).
begitu seterusnya pada posisi (1,-2), (1,-3), sampai pada posisi (1,-7).
Pada perulangan ketiga, yaitu posisi serong kiri bawah, untuk variable x-i dan y+i
Pada perulangan ketiga, yaitu posisi serong kiri bawah, untuk variable x-i dan y+i dengan nilaidengan nilai awal i adalah 1(satu) berlanjut selama masih bernilai “
awal i adalah 1(satu) berlanjut selama masih bernilai “truetrue” pada method cek, kita masukkan nilai x-i, y+i” pada method cek, kita masukkan nilai x-i, y+i dan hasil Boolean untuk variable taruh pada method pindah. Sama halnya pada perulangan di atas, kita dan hasil Boolean untuk variable taruh pada method pindah. Sama halnya pada perulangan di atas, kita asumsikan kita meletakkan posisi ratu pada posisi (0,0) variabel i=1, maka variabel x=-1,
asumsikan kita meletakkan posisi ratu pada posisi (0,0) variabel i=1, maka variabel x=-1, dan y=1dan y=1 (pindah(x-i,y+i,taruh)), karena variabel taruh bernilai
(pindah(x-i,y+i,taruh)), karena variabel taruh bernilai truetruemaka pada posisi(-1,1) kita dapatmaka pada posisi(-1,1) kita dapat menyimpannya. Begitu juga halnya dengan posisi (-2,1),(-3,1) sampai dengan posisi (-7,1). menyimpannya. Begitu juga halnya dengan posisi (-2,1),(-3,1) sampai dengan posisi (-7,1).
Dan pada perulangan keempat, yaitu pada posisi serong kiri atas, untuk variable x-i dan y Dan pada perulangan keempat, yaitu pada posisi serong kiri atas, untuk variable x-i dan y -i-i dengan nilai awal i adalah 1(satu) berlanjut selama masih bernilai “
dengan nilai awal i adalah 1(satu) berlanjut selama masih bernilai “truetrue” pada method cek, kita” pada method cek, kita
masukkan nilai x-i, y-i dan hasil Boolean untuk variable taruh pada method pindah. Kita asumsikan kita masukkan nilai x-i, y-i dan hasil Boolean untuk variable taruh pada method pindah. Kita asumsikan kita meletakkan ratu pada posisi (0,0) variabel i=1, maka variabel x=
meletakkan ratu pada posisi (0,0) variabel i=1, maka variabel x= -1, dan y=-1 (pindah(x-i,y-i,taruh)),-1, dan y=-1 (pindah(x-i,y-i,taruh)), karena variabel taruh bernilai
karena variabel taruh bernilaitruetruemaka pada posisi (-1,-1) kita maka pada posisi (-1,-1) kita dapat menyimpannya. Sama halnyadapat menyimpannya. Sama halnya dengan posisi (-2,-2), (-3,-3) sampai dengan (-7,-7).
dengan posisi (-2,-2), (-3,-3) sampai dengan (-7,-7).
Setelah kita menyimpan posisi dari letak ratu agar
Setelah kita menyimpan posisi dari letak ratu agar tidak ditaruh ratu lain baik secara vertikal,tidak ditaruh ratu lain baik secara vertikal, horizontal, serong kiri atas dan bawah, dan serong
horizontal, serong kiri atas dan bawah, dan serong kanan atas dan bawah. Selanjutnya kita berikan gariskanan atas dan bawah. Selanjutnya kita berikan garis dengan memanggil method beriGaris(x,y) dengan parameter yang diwakili variabel x
dengan memanggil method beriGaris(x,y) dengan parameter yang diwakili variabel x dan y yangdan y yang merupakan posisi kordinat dari posisi letak ratu tersebut.
merupakan posisi kordinat dari posisi letak ratu tersebut.
private void pindah(int x,int y,boolean taruh) private void pindah(int x,int y,boolean taruh)
{ {
if(taruh &&
if(taruh && kotak[x][y]=kotak[x][y]==0)=0)
kotak[x][y]=1; kotak[x][y]=1;
else if(!taruh && kotak[x][y]==1) else if(!taruh && kotak[x][y]==1)
kotak[x][y]=0; kotak[x][y]=0; beriGaris(x,y); beriGaris(x,y); } }
Method pindah ini berfungsi untuk me
Method pindah ini berfungsi untuk menentukan dimana ratu bisa dipindahkan dan dimana ratunentukan dimana ratu bisa dipindahkan dan dimana ratu tidak bisa dipindahkan. Disini, kita lakukan seleksi
tidak bisa dipindahkan. Disini, kita lakukan seleksi kondisi. Apabila nilai dari variable taruh adalah “tkondisi. Apabila nilai dari variable taruh adalah “t rue”rue” dan nilai dari kotak adalah 0, kita ganti nilai dari kotak
dan nilai dari kotak adalah 0, kita ganti nilai dari kotak menjadi 1, tetapi apabila nilai dari variable taruhmenjadi 1, tetapi apabila nilai dari variable taruh adalah “false” dan nilai dari kotak adalah 1, kita ganti nilai dari kotak me
adalah “false” dan nilai dari kotak adalah 1, kita ganti nilai dari kotak me njadi 0. Selanjutnya, kita berikannjadi 0. Selanjutnya, kita berikan garis dengan method beriGaris(x,y).
private boolean cek(int x, int y) private boolean cek(int x, int y)
{ {
return (x>=0 && x<8 && y>=0 && y<8); return (x>=0 && x<8 && y>=0 && y<8);
} }
Method cek ini digunakan untuk mengecek apakah letak koordinat kotak masih berada Method cek ini digunakan untuk mengecek apakah letak koordinat kotak masih berada padapada interface
interfaceyang ditentukan (8x8). Method akan selalu menghasilkan nilai “yang ditentukan (8x8). Method akan selalu menghasilkan nilai “truetrue” selama nilai x lebih besar” selama nilai x lebih besar dari atau sama dengan 0 dan kurang dari
dari atau sama dengan 0 dan kurang dari 8 dan selama nilai y lebih besar dari atau sama 8 dan selama nilai y lebih besar dari atau sama dengan 0 dandengan 0 dan kurang dari 8. kurang dari 8. 2 2 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
public boolean solve(int y) { public boolean solve(int y) { int i,j; int i,j; boolean r = false; boolean r = false; for (i=0;i<8;i++) { for (i=0;i<8;i++) { if (kotak[i][y] == 0) { if (kotak[i][y] == 0) { taruhRatu(i,y,true); taruhRatu(i,y,true); if (y == 7) { if (y == 7) {
return true; // binggo!!! return true; // binggo!!! } else {
} else {
if (solve(y+1)) { if (solve(y+1)) {
return true; // binggo !!! return true; // binggo !!! } else {
} else {
taruhRatu(i,y,false); // ambil ratu taruhRatu(i,y,false); // ambil ratu } } } } } } } } return false; return false; } } } }
Method ini berfungsi untuk menghasilkan output yang benar dan optimal secara otomatis. Method ini berfungsi untuk menghasilkan output yang benar dan optimal secara otomatis. Pertama, kita deklarasikan variable i dan j se
Pertama, kita deklarasikan variable i dan j se bagai integer dan variable r sebagai Boolean dengan nilaibagai integer dan variable r sebagai Boolean dengan nilai awal “false”. Setelah itu, melalui perulangan, kita akan mencoba untuk meletakkan r
awal “false”. Setelah itu, melalui perulangan, kita akan mencoba untuk meletakkan r atu di setiap baris.atu di setiap baris.
Jika nilai kotak [i][y]
Jika nilai kotak [i][y] sama dengan 0, kita panggil method taruhRatu dengan
sama dengan 0, kita panggil method taruhRatu dengan
memasukkan nilai i, y, dan hasil Boolean “true” untuk variable taruh. Jika
memasukkan nilai i, y, dan hasil Boolean “true” untuk variable taruh. Jika y sama dengan 7, kita
y sama dengan 7, kita
kembalikan nilai “true” yang
kembalikan nilai “true” yang berarti masalah telah terpecahkan. Apabila nilai y
berarti masalah telah terpecahkan. Apabila nilai y belum mencapai
belum mencapai
7, jika nilai dari
7, jika nilai dari solve(y+1) bernilai “true” kita kembalikan nilai “true”
solve(y+1) bernilai “true” kita kembalikan nilai “true” yang juga berarti masalah
yang juga berarti masalah
telah terpecahkan.
telah terpecahkan.
Tetapi, jika nilai kotak [i][y]
Tetapi, jika nilai kotak [i][y] tidak sama dengan 0, kita panggil method taruhRatu dengan
tidak sama dengan 0, kita panggil method taruhRatu dengan
memasukkan nilai i,y, dan hasil Boolean “false” untuk variable taruh yang juga berarti tidak bisa
memasukkan nilai i,y, dan hasil Boolean “false” untuk variable taruh yang juga berarti tidak bisa
menaruh ratu. Kita kembalikan nilai
File
FileRatuApplet.javaRatuApplet.java
Karena pada program kali ini kita menggunakan Applet, maka
Karena pada program kali ini kita menggunakan Applet, maka perlu kita buat untuk menjalankanperlu kita buat untuk menjalankan program applet-nya. Berikut adalah
program applet-nya. Berikut adalahcodi codi ng dari Applet.ng dari Applet.
import
import java.appletjava.applet.Applet;.Applet;
import java.awt.*; import java.awt.*;
import
import java.awt.evjava.awt.event.*;ent.*;
Pertama – tama,kita akan memanggil
Pertama – tama,kita akan memanggil paket java.applet, java.awt dan java.awt.event. java.appletpaket java.applet, java.awt dan java.awt.event. java.applet digunakan untuk membuat applet agar program dapat berjalan pada HTML. Java.awt untuk membuat digunakan untuk membuat applet agar program dapat berjalan pada HTML. Java.awt untuk membuat tampilan dan membuat gambar dan java.awt.event digunakan sebagai penangan tombol.
tampilan dan membuat gambar dan java.awt.event digunakan sebagai penangan tombol.
public class RatuApplet extends Applet implements ActionListener public class RatuApplet extends Applet implements ActionListener
{ {
Button refresh =
Button refresh = new Button("Refresh");new Button("Refresh");
Bidang Bidang = new
Bidang Bidang = new Bidang();Bidang();
Button
Button solve = nesolve = new Button("Sow Button("Solve");lve");
Setelah itu, kita kan mendeklarasikan class yang digunakan pada applet. Nama class-nya adalah Setelah itu, kita kan mendeklarasikan class yang digunakan pada applet. Nama class-nya adalah RatuApplet yang merupakan turunan dari class Applet yang telah ada sebelumnya pada paket j
RatuApplet yang merupakan turunan dari class Applet yang telah ada sebelumnya pada paket j ava. Kitaava. Kita juga menggunakan interface ActionListener pada button yang akan kita
juga menggunakan interface ActionListener pada button yang akan kita buat nanti untuk menentukanbuat nanti untuk menentukan apa yang akan terjadi ketika button ditekan. Setelah itu, kita membuat
apa yang akan terjadi ketika button ditekan. Setelah itu, kita membuat Button refresh yang terhubungButton refresh yang terhubung dengan variable objek refresh. Setelah itu,
dengan variable objek refresh. Setelah itu, kita akan memanggil class Bidang yang ada pada programkita akan memanggil class Bidang yang ada pada program Bidang.Setelah itu, kita juga membuat button solve yang te
Bidang.Setelah itu, kita juga membuat button solve yang te rhubung dengan variable objek solve.rhubung dengan variable objek solve.
public void init() public void init()
{ {
setLayout
setLayout(new (new BorderLayout()BorderLayout()););
add("Center",Bidang); add("Center",Bidang);
selanjutnya, kita membuat method init yang akan berjalan ketika progr
selanjutnya, kita membuat method init yang akan berjalan ketika progr am running. Pertama,am running. Pertama, kita set tata letak
kita set tata letak dengan tampilan BorderLayout() yang menempatkan komponen berdasarkan arahdengan tampilan BorderLayout() yang menempatkan komponen berdasarkan arah mata angin. Disini kita meletakkan class Bidang pada bagian tengah tampilan.
Panel panel = new Panel(); Panel panel = new Panel();
add("South",panel);//kemungkinan besar, defaultnya BorderLayout add("South",panel);//kemungkinan besar, defaultnya BorderLayout panel.setLayout(new GridLayout(1,5)); panel.setLayout(new GridLayout(1,5)); panel.add(new Label("")); panel.add(new Label("")); panel.add(refresh); panel.add(refresh); panel.add(new Label("")); panel.add(new Label("")); panel.add(solve); panel.add(solve); panel.add(new Label("")); panel.add(new Label("")); refresh.addActionListener(this); refresh.addActionListener(this); solve.addActionListener(this); solve.addActionListener(this); } }
Setelah itu, kita akan membuat panel baru
Setelah itu, kita akan membuat panel baru yang digunakan untuk tombol yang diletakkan diyang digunakan untuk tombol yang diletakkan di bagian bawah(
bagian bawah(southsouth) tampilan. Kemudian, kita tentukan tampilan ) tampilan. Kemudian, kita tentukan tampilan panel dengan class GridLayout (yangpanel dengan class GridLayout (yang telah ada pada java) pada satu baris untuk membuat 5 k
telah ada pada java) pada satu baris untuk membuat 5 k olomdengan ukuran yang sama yang akan kitaolomdengan ukuran yang sama yang akan kita pergunakan untuk meletakkan button. Pada kolom pertama, kita isi dengan label kosong. Pada kolom pergunakan untuk meletakkan button. Pada kolom pertama, kita isi dengan label kosong. Pada kolom kedua kita isi dengan button refresh. Pada kolom ketiga
kedua kita isi dengan button refresh. Pada kolom ketiga kita isi dengan label kosong, pada kolomkita isi dengan label kosong, pada kolom keempat kita isi dengan button solve dan pada kolom kelima kita
keempat kita isi dengan button solve dan pada kolom kelima kita isi dengan label kosong lagi. Setelahisi dengan label kosong lagi. Setelah membuat tampilan, kita aplikasikan method ActionListener sebagai penangan kejadian pada tombol membuat tampilan, kita aplikasikan method ActionListener sebagai penangan kejadian pada tombol refresh dan solve.
refresh dan solve.
public void
public void actionPerformedactionPerformed(ActionEve(ActionEvent nt ae)ae) { { if(ae.getSource()==refresh) if(ae.getSource()==refresh) { { Bidang.initBidang(); Bidang.initBidang(); Bidang.pai
Bidang.paint(Bidang.gent(Bidang.getGraphics());tGraphics()); }else if (ae.getSource() == solve) {
}else if (ae.getSource() == solve) { Bidang.initBidang(); Bidang.initBidang(); Bidang.pai
Bidang.paint(Bidang.gent(Bidang.getGraphics());tGraphics()); Bidang.solve(0);
Bidang.solve(0); }
} } }
}
Setelah itu, kita implementasikan method bernama actionPerformed (yang telah ada
Setelah itu, kita implementasikan method bernama actionPerformed (yang telah ada pada java)pada java) sebagai penentu kejadian ketika kedua tombol itu ditekan. Kemudian kita lakukan seleksi kondisi. Jika sebagai penentu kejadian ketika kedua tombol itu ditekan. Kemudian kita lakukan seleksi kondisi. Jika tombol yang ditekan adalah refresh, maka kita akan memanggil me
tombol yang ditekan adalah refresh, maka kita akan memanggil me thod initBidang dan paint dari Bidangthod initBidang dan paint dari Bidang yang juga berarti mulai dari awal. Tetapi j
yang juga berarti mulai dari awal. Tetapi j ika tombol yang ditekan adalah solve, kita akan memanggilika tombol yang ditekan adalah solve, kita akan memanggil method initBidang dan paint serta solve dari Bidang yang juga ber
method initBidang dan paint serta solve dari Bidang yang juga ber arti kita mulai dari awal dan akanarti kita mulai dari awal dan akan meletakkan ratu secara otomatis.