Tabel 3.8. Nilai yang disimpan serta proses
undo
dan
redo
pada gerakan
slide
Nilai
Nilai 1 n1 : posisi kolom dari bola yang digeser Nilai 2 n2 : posisi baris dari bola yang digeser
Nilai 3 n3 : posisi baris dari celah sebelum bola digeser Nilai 4 n4 : memiliki tipe data
boolean
yang menyatakan apakah bola yang berada dalam celah akan muncul setelah
gerakan ini dilakukan
Undo
Apabila n4 menyimpan nilai
true
, maka bola yang terletak pada kolom n1 dan terletak pada baris n2 akan ditekan masuk ke
dalam cakram Menggeser bola pada kolom n1 dari baris n3 menuju baris n2
Redo
Menggeser bola pada kolom n1 dari baris n2 menuju baris n3 Bola yang berada di dalam cakram akan muncul apabila n4
menyimpan nilai
true
3.5. AI
Algoritma yang digunakan dalam permainan
Babylon Tower
adalah algoritma
column by column
dan
depth-first search
. Algoritma
column by column
terdiri dari tiga tahapan utama. Tahap pertama adalah tahap
sorting
yang bekerja dengan cara mengelompokkan bola-bola dengan warna yang sejenis pada kolom yang sama. Tahap
sorting
dikombinasikan dengan algoritma
depth-first search
yang berfungsi untuk mencegah bertemunya jalan buntu selama proses pengelompokkan dijalankan. Tahap
kedua adalah tahap
swapping
yang bekerja dengan cara menukar posisi bola-bola pada setiap kolom hingga bola-bola pada setiap kolom terurut berdasarkan tingkat
kecerahan warna bola. Selama tahap
swapping
dijalankan, warna bola pada dua baris teratas tidak harus terurut berdasarkan tingkat kecerahannya. Tahap ketiga adalah
tahap
parity
yang bertujuan untuk menukar posisi bola pada dua baris teratas yang belum terurut berdasarkan tingkat kecerahan warnanya.
Sebelum algoritma mulai dijalankan, akan ditentukan terlebih dahulu warna bola yang menempati masing-masing kolom. Mula-mula ditetapkan terlebih dahulu
warna bola mulai dari kolom pertama hingga kolom terakhir secara berurutan, yaitu merah, cokelat, hitam, kuning, biru dan hijau. Kemudian akan diperiksa apakah bola
yang berada pada cakram paling bawah kolom pertama memiliki warna yang sama dengan warna yang ditetapkan untuk kolom pertama. Apabila tidak sama, maka warna
Universitas Sumatera Utara
kolom pertama akan ditukar dengan warna kolom lain yang sama dengan warna bola tersebut. Sebagai contoh, warna bola pada cakram paling bawah kolom pertama
adalah biru. Biru merupakan warna yang telah ditetapkan untuk kolom kelima, sehingga warna pada kolom pertama dan kelima akan ditukar. Dengan demikian,
warna bola yang ditetapkan mulai dari kolom pertama hingga kolom terakhir secara berurutan menjadi biru, cokelat, hitam, kuning, merah dan hijau. Selanjutnya bola
yang berada pada baris terbawah kolom pertama akan ditekan masuk sehingga menghasilkan
gap
pada kolom bola tersebut. Selanjutnya algoritma
column by column
dapat mulai dijalankan.
3.5.1. Sorting dan depth-first search
Tahap
sorting
akan mengelompokkan bola-bola dengan warna yang sejenis pada kolom yang sama tanpa perlu memperhatikan urutan tingkat kecerahan warna setiap
bola dalam satu kolom. Dalam tahap ini, akan digunakan fungsi rekursif untuk melakukan pencarian secara berulang terhadap bola dari kolom lain yang memiliki
warna yang sejenis dengan warna yang telah ditetapkan untuk kolom yang sedang memiliki
gap
. Setelah ditemukan bola yang diinginkan, maka beberapa langkah prosedural akan dieksekusi untuk memindahkan posisi bola yang dicari menuju kolom
yang memiliki warna sejenis, sehingga posisi
gap
akan berpindah menuju kolom yang lain. Proses ini akan dilakukan secara berulang hingga setiap kolom ditempati bola-
bola dengan warna yang sejenis. Selama tahap
sorting
, perlu diperiksa apakah langkah yang diambil akan menghasilkan jalan buntu. Jalan buntu yang dimaksud adalah mengeluarkan bola yang
berada di dalam
disc
sebelum semua bola berada pada kolom yang benar. Dengan mengeluarkan bola tersebut, maka tidak terdapat lagi celah, sehingga bola tidak dapat
dipindahkan ke posisi lain sebelum bola ditekan masuk kembali ke dalam
disc
. Untuk menghindari hal tersebut, maka dibutuhkan algoritma
depth-first search
yang berfungsi untuk mengambil langkah mundur ketika permainan menemui jalan buntu,
kemudian mencari langkah lain yang dapat diambil. Adapun
pseudocode
yang digunakan dalam tahap ini adalah sebagai berikut:
bool StartSorting gap_column { flag = false
Universitas Sumatera Utara
if sorting complete { return true
} else if no gap { return false
} else { for each column other than gap_column {
for each ball in column { if ball_color == gap_column_color {
if ball_row 2 { active_disc = ball_row - 1
} else { active_disc = ball_row + 1
} if active_disc = gap_row {
move ball to gap flag = StartSortingcolumn
} }
} }
} if flag {
undo move }
return flag }
Berikut adalah penjelasan untuk
pseudocode
dari tahap
sorting
. Tahap
sorting
dimulai dengan parameter 0, yang menyatakan celah berada pada kolom pertama. Untuk selanjutnya, kolom pertama akan dinyatakan dengan nilai 0 hingga kolom
keenam dinyatakan dengan nilai 5. Begitu pula untuk cakram pada baris teratas akan dinyatakan dengan nilai 0 hingga cakram pada baris terbawah dinyatakan dengan nilai
5. Selanjutnya didefinisikan sebuah variabel
flag
dengan tipe data
boolean
yang berfungsi untuk menyatakan apakah algortima yang dijalankan menemui jalan buntu
atau tidak. Ketika didefinisikan, variabel
flag
menyimpan nilai
false
yang menyatakan belum ditemukannya langkah yang bisa diambil. Ketika ditemukan langkah yang
mungkin diambil, nilai dari variabel
flag
akan diubah menjadi
true
. Algoritma akan dilanjutkan dengan melakukan pengecekan apakah setiap bola
telah berada pada kolom yang benar sesuai dengan jenis warnanya. Apabila setiap bola telah berada pada kolom yang benar, maka akan langsung mengembalikan nilai
true
. Apabila belum, maka akan diperiksa apakah masih terdapat bola yang berada di dalam
Babylon Tower
. Jika tidak terdapat bola di dalam
Babylon Tower
, maka hal ini menyatakan bahwa tidak terdapat celah pada
Babylon Tower
yang artinya permainan
Universitas Sumatera Utara
telah menemui jalan buntu, sehingga akan langsung mengembalikan nilai
false
. Apabila permainan tidak menemui jalan buntu, maka akan dilanjutkan dengan
mencari bola pada kolom lain yang memiliki warna yang sesuai dengan warna pada kolom yang memiliki celah sesuai dengan nilai parameter yang diterima yang
menyatakan posisi kolom yang memiliki celah. Proses pencarian bola pada kolom lain dilakukan dengan perulangan untuk
setiap kolom selain kolom yang memiliki celah. Apabila kolom yang memiliki celah adalah kolom 0, maka kolom 0 tidak disertakan dalam pencarian, sehingga pencarian
dimulai dari kolom 1 hingga kolom 5. Pada setiap kolom juga dilakukan perulangan untuk memeriksa setiap bola yang terdapat pada setiap kolom dimulai dari bola pada
baris 0 hingga baris 5. Apabila warna bola yang diperiksa sama dengan warna yang ditetapkan untuk kolom yang memiliki celah, maka akan dijalankan beberapa langkah
prosedural untuk memindahkan posisi bola yang dicari menuju kolom yang memiliki warna yang sesuai dengan warna bola yang dicari.
Langkah-langkah untuk memindahkan bola dimulai dengan mendefinisikan variabel
gap_row
yang berfungsi untuk menyimpan nilai yang menyatakan posisi baris yang memiliki celah. Selanjutnya akan didefinisikan variabel
active_disc
untuk menyimpan nilai yang menyatakan posisi baris yang ditargetkan untuk ditempati oleh
celah. Nilai pada
active_disc
tergantung kepada posisi baris dari bola yang ingin dipindahkan. Apabila bola yang ingin dipindahkan berada pada baris yang lebih besar
dari 2, maka nilai pada
active_disc
adalah posisi baris bola yang ingin dipindahkan dikurangi 1. Dengan kata lain, posisi celah digeser hingga berada tepat satu baris di
atas posisi baris bola yang ingin dipindahkan. Apabila bola yang ingin dipindahkan berada pada baris yang lebih kecil dari 3, maka nilai pada
active_disc
adalah posisi baris bola yang ingin dipindahkan ditambah 1, yang artinya posisi celah digeser
hingga berada tepat satu baris di bawah posisi baris bola yang ingin dipindahkan. Setelah nilai
active_disc
ditentukan, maka akan diperiksa apakah posisi celah sama dengan nilai
active_disc
. Jika berbeda, maka celah akan digeser sehingga menempati baris yang sama dengan nilai
active_disc
. Selanjutnya cakram pada posisi
active_disc
akan diputar supaya celah berada pada kolom yang sama dengan posisi kolom bola yang ingin dipindahkan. Kemudian bola yang ingin dipindahkan digeser
menuju celah yang berada pada kolom yang sama. Pada akhirnya cakram pada posisi
Universitas Sumatera Utara
active_disc
akan diputar kembali supaya bola yang ingin dipindahkan berada pada kolom yang benar.
Setelah bola selesai dipindahkan, akan dijalankan lagi
method StartSorting
secara rekursif dengan parameter berupa posisi celah yang baru setelah bola dipindahkan.
Method
tersebut hanya tidak akan dijalankan apabila tahap
sorting
telah selesai atau algoritma menemui jalan buntu. Apabila variabel
flag
bernilai
false
menemui jalan buntu, maka akan diambil langkah mundur terhadap langkah-langkah yang terakhir kali dilakukan dan mencari bola lain yang dapat dipindahkan.
3.5.2. Swapping
Tahap
swapping
akan dieksekusi setelah tahap
sorting
selesai dilakukan. Tahap ini bertujuan untuk menukar posisi bola-bola pada setiap kolom hingga bola-bola pada
setiap kolom terurut berdasarkan tingkat kecerahan warna bola. Selama proses ini, kedua baris teratas tidak harus dalam keadaan terurut. Proses tersebut dianggap selesai
apabila tingkat kecerahan warna bola pada baris ketiga dari atas hingga baris terbawah telah terurut berdasarkan tingkat kecerahan untuk masing-masing kolom.
Adapun
pseudocode
yang digunakan dalam tahap ini adalah sebagai berikut:
void StartSwapping { for each column other than gap_column {
if Swapping1_Not_Completedcolumn { for each row {
while ball_row
– row 1 or ball_row
– row -1 { if ball_row
– row 1 { row_1 = ball_row
– 1 row_2 = ball_row
– 2 } else {
row_1 = ball_row + 1 row_2 = ball_row + 2
} if gap_row = row_1 {
Slide gap_column from row_1 to gap_row }
swap ball }
} }
if Swapping2_Not_Completedcolumn { for each row from 5 to 2 {
if row
– ball_brightness 0 {
Universitas Sumatera Utara
row_1 = row – 1
row_2 = row – 2
Slide gap_column from row_1 to row_2 Swap row_1 with row_2
} else if row – ball_brightness 0 {
row_1 = row + 1 row_2 = row + 2
Slide gap_column from row_1 to row_2 swap ball
} }
} }
}
Tahap
swapping
akan dimulai dengan melakukan perulangan terhadap setiap kolom selain kolom yang memuat celah. Untuk setiap kolom akan dilakukan
swapping
pertama, yaitu menukar posisi bola pada setiap kolom hingga selisih antara posisi sebuah bola dengan posisi yang seharusnya tidak lebih dari 1. Selama selisih
antara posisi bola dengan posisi seharusnya lebih dari 1, maka posisi bola akan dipindahkan menuju posisi yang lebih dekat dengan posisi seharusnya.
Untuk memindahkan bola menuju posisi yang lebih dekat dengan posisi seharusnya, perlu didefinisikan terlebih dahulu variabel
ball_row
yang menyimpan posisi baris bola yang sedang diperiksa tingkat kecerahan warnanya serta variabel
gap_row
yang menyimpan posisi baris yang memuat celah. Selanjutnya perlu didefinisikan pula variabel
row_1
dan
row_2
yang berfungsi untuk menyimpan posisi baris yang terlibat selama langkah-langkah dalam proses
swapping
dijalankan. Langkah-langkah yang dijalankan selama proses
swapping
adalah memutar cakram
row_1
dari posisi kolom yang memuat celah
gap_column
menuju posisi kolom dimana bola yang ingin dipindahkan berada
target_column
. Selanjutnya geser bola yang ingin dipindahkan menuju celah yang terdapat pada cakram
row_1
, dan putar kembali cakram
row_1
dari
target_column
menuju
gap_column
. Kemudian geser bola pada
target_column
dari cakram
row_2
menuju cakram yang memuat celah sehingga celah berpindah ke posisi
row_2
sebelumnya. Putar cakram
row_2
dari
target_column
menuju
gap_column
, sehingga terdapat celah pada
gap_column
. Geser bola yang ingin dipindahkan pada
gap_column
dari
row_1
menuju
row_2
, kemudian putar kembali cakram
row_2
dari
gap_column
menuju
target_column
.
Universitas Sumatera Utara
Sebagai contoh sebuah bola dengan tingkat kecerahan 1 berada pada baris ke 4, maka bola tersebut harus dipindahkan menuju baris di atasnya. Dalam contoh ini,
row_1
akan bernilai 3 dan
row_2
akan bernilai 2. Setelah langkah swapping dilakukan maka bola tersebut akan berpindah dari baris ke 4 menuju baris ke 2. Dengan
demikian, dalam tahap
swapping
bola hanya dapat dipindahkan tepat dua baris di atas atau di bawah posisi bola itu sendiri.
Setelah tahap
swapping
pertama selesai dilakukan, maka akan dilanjutkan dengan tahap
swapping
kedua yang bertujuan untuk menempatkan bola-bola dengan tingkat kecerahan 2 sampai 5 pada baris yang benar. Langkah-langkah untuk
memindahkan posisi bola tetap sama dengan langkah-langkah yang digunakan pada tahap
swapping
pertama. Setelah setiap kolom selesai melakukan tahap
swapping
, maka yang tersisa adalah kolom yang memuat celah, karena selama tahap
swapping
posisi bola-bola pada kolom tersebut tidak diperhatikan. Oleh karena itu, bola yang berada di dalam
kolom tersebut perlu dikeluarkan kembali dan bola pada kolom lain yang telah selesai melakukan
swapping
akan ditekan masuk ke dalam untuk menghasilkan celah pada kolom lain tersebut. Selanjutnya akan dilakukan langkah-langkah
swapping
sekali lagi untuk kolom yang tersisa.
3.5.3. Parity
Tahap
parity
merupakan tahap terakhir dari algoritma
column by column
yang akan dijalankan apabila bola pada dua baris teratas belum semuanya terurut. Dua bola
teratas tidak selalu terurut selama menjalankan tahap
swapping
karena pada tahap
swapping
, posisi sebuah bola hanya dapat ditukar dengan posisi bola lain yang berjarak dua baris dengannya. Tahap
swapping
tidak dapat menukar secara langsung posisi sebuah bola dengan posisi bola lain yang berada tepat satu baris di atas atau di
bawahnya. Dengan demikian, tahap
swapping
yang telah dijalankan mungkin saja menyisakan dua bola pada dua baris teratas yang belum terurut. Oleh karena itu,
diperlukan tahap
parity
untuk menukar posisi dua bola pada dua baris teratas yang belum terurut.
Universitas Sumatera Utara
Syarat yang harus dipenuhi untuk menjalankan tahap
parity
adalah harus terdapat pasangan kolom yang belum terurut karena sekali tahap parity dijalankan,
akan menghasilkan sepasang kolom yang telah terurut. Jadi sebelum tahap
parity
dijalankan, perlu dihitung terlebih dahulu jumlah kolom yang belum terurut. Apabila jumlahnya ganjil, maka akan ada sebuah kolom yang tidak memiliki pasangan kolom
lain untuk diurutkan bersama, sehingga perlu dilakukan langkah lain untuk mengurutkan salah satu kolom supaya jumlah kolom yang belum terurut menjadi
genap. Langkah yang dimaksud adalah memutar cakram pada baris 0 sejauh 60°, menekan masuk bola pada kolom 0, diikuti dengan mengulangi tahap
sorting
dengan parameter 0. Tahap
sorting
yang dilakukan sebelum tahap
parity
tidak memerlukan jumlah langkah sebanyak yang dilakukan saat tahap sorting pertama kali dilakukan
karena bola yang belum berada pada kolom yang benar hanya berada pada baris teratas. Setelah tahap
sorting
tersebut dilakukan, maka kolom yang belum terurut pasti berjumlah genap sehingga tahap
parity
dapat dijalankan. Adapun
pseudocode
yang digunakan dalam tahap ini adalah sebagai berikut:
void StartParity { for each column {
column_1 = -1 column_2 = -1
if ball_0_brightness == 1 { if column_1 == -1 {
column_1 = column } else if column_2 == -1 {
column_2 = column }
} }
last_row_rotated = false if inner_gap_column_0 = column_1 and
inner_gap_column_0 = column_2 { pushed_column = inner_gap_column_0
} else if inner_gap_column_1 = column_1 and inner_gap_column_1 = column_2 {
pushed_column = inner_gap_column_1 } else {
last_row_rotated = true Rotate row_5 around 60°
pushed_column = inner_gap_column_0 }
do parity steps if last_row_rotated {
Rotate row_5 around 300° }
Universitas Sumatera Utara
if unsorted_column 0 { StartParity
} }
Tahap
parity
akan dijalankan pada setiap pasangan kolom yang belum terurut dengan melibatkan sebuah kolom lain. Pertama-tama akan ditentukan dua kolom yang
belum terurut dengan melakukan perulangan pada setiap kolom. Kedua kolom yang belum terurut masing-masing akan disimpan dalam variabel
column_1
dan
column_2
. Selanjutnya akan didefinisikan variabel
last_row_rotated
dengan tipe data
boolean
dan mula-mula bernilai
false
. Variabel tersebut nantinya akan digunakan untuk menyatakan apakah cakram pada baris terbawah diputar sebelum langkah-langkah
tahap
parity
dilakukan. Kemudian akan ditentukan kolom ketiga yang terlibat dalam tahap
parity
yang merupakan salah satu kolom
inner gap
kolom dimana bola pada baris terbawahnya dapat ditekan masuk. Kolom ketiga yang ditentukan akan
disimpan dalam variabel
pushed_column
. Untuk menentukannya perlu dipastikan bahwa kolom ketiga tidak boleh sama dengan salah satu di antara dua kolom yang
hendak diurutkan. Apabila kolom yang hendak diurutkan sama dengan kolom
inner gap
, maka cakram terbawah perlu diputar sejauh 60° sehingga posisi kolom
inner gap
juga ikut berubah, serta nilai variabel
last_row_rotated
diubah menjadi
true
. Dengan demikian, posisi kolom
inner gap
tersebut dapat digunakan sebagai kolom ketiga yang terlibat dalam tahap
parity
. Selanjutnya langkah-langkah prosedural dari tahap
parity
akan dijalankan untuk memperoleh sepasang kolom yang telah terurut. Setelah langkah-langkah
tersebut selesai dilakukan, akan diperiksa nilai pada variabel
last_row_rotated
. Jika variabel tersebut bernilai
true
, maka cakram terbawah perlu diputar kembali ke posisi semula yaitu diputar sejauh 300°. Selanjutnya akan dihitung jumlah kolom yang
belum terurut. Apabila masih terdapat kolom yang belum terurut, maka tahap
parity
akan dijalankan lagi secara rekursif.
Universitas Sumatera Utara
BAB 4 IMPLEMENTASI DAN PENGUJIAN
Bab ini membahas tentang implementasi algoritma
column by column
dan
depth-first search
pada permainan
Babylon Tower
berdasarkan rancangan aplikasi yang telah dibahas pada bab 3. Bab ini juga membahas hasil yang diperoleh dari pengujian
terhadap implementasi yang telah dilakukan terhadap aplikasi yang dibuat.
4.1. Implementasi