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