• Tidak ada hasil yang ditemukan

Algoritma Backtracking (Kasus 8 Ratu)

N/A
N/A
Protected

Academic year: 2021

Membagikan "Algoritma Backtracking (Kasus 8 Ratu)"

Copied!
30
0
0

Teks penuh

(1)

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

(2)

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.

(3)

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.

(4)

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.

(5)

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 8

(6)

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

(7)

••

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

falsefalse

while 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 then

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

(8)

Tampilan awal program

Tampilan awal program

BAB II

BAB II

APLIKASI

APLIKASI

Kasus Kasus

Persoalan 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

(9)

Ketika program dimainkan Ketika program dimainkan

Ketika user menekan tombol Solve Ketika user menekan tombol Solve

(10)

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

(11)

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

(12)

/** /** * * 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);

(13)

/** /**

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

(14)

} }

} }

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

} }

(15)

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

(16)

} } } } } } } } return false; return false; } } } }

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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.

(22)

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

(23)

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).

(24)

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).

(25)

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).

(26)

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

(27)

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

(28)

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.

(29)

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

(30)

} } }

}

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.

Referensi

Dokumen terkait

Berdasarkan penelitian yang telah dilakukan dapat disimpulkan bahwa katalis Ni/MgO dalam pelarut air memiliki aktivitas terhadap reaksi kondensasi furfural dengan aseton

Dengan berlakunya Peraturan Walikota ini, maka Peraturan Walikota Bogor Nomor 30 Tahun 2013 tentang Standar Biaya Penghasilan, Tunjangan Kesejahteraan dan Belanja

RANCANG BANGUN APLIKASI PELAYANAN CUSTOMER PADA SENGKALING FOOD

Hasil analisis menunjukkan kualitas massa batuan dan tingkat kestabilan lereng berdasarkan nilai SMR untuk scanline I, VII dan IX sangat baik dengan kondisi

dilakukan simulasi tentang lensa kuadrupol sebagai lensa pernfokus berkas ion pada implantor ion. Pada simulasi tersebut telah dipeia.iari etek tegangan

Untuk mengatasi agar kayu yang berkualitas rendah juga mempunyai nilai seni tinggi, maka pada penelitian ini telah dilakukan pewarnaan permukaan kayu akasia

(3) Pengurus Kabupaten/Kabupaten Administrasi/Kota/Kota Administrasi bertanggung jawab atas terlaksananya segala ketentuan dalam Kode Etik Guru Indonesia, Ikrar Guru

Lembaga tersebut dinamakan KPU (Komisi Pemilihan Umum). KPU ini yang akan menerima dan menyeleksi bakal-bakal calon pemimpin sebelum ditetapkan sebagai calon. KPU pula