AI Penerapan Algoritma Column by Column dan Depth-First Search dalam Permainan Babylon Tower

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