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