• Tidak ada hasil yang ditemukan

ANALISIS DAN PERANCANGAN

3.4. Game Mechanic

Setiap aplikasi permainan memiliki aturan-aturan serta metode-metode yang dirancang untuk berinteraksi dengan keadaan-keadaan yang terjadi di dalam aplikasi tersebut. Sekumpulan aturan dan metode tersebut untuk selanjutnya disebut sebagai game mechanic. Permainan Babylon Tower dibuat menggunakan software Unity dengan output berupa aplikasi untuk platform Android. Oleh karena itu, input untuk aplikasi ini berupa sentuhan jari serta arah gerakan jari yang menyentuh layar Android. Untuk itulah, perlu dirancang game mechanic untuk dapat membaca beberapa jenis sentuhan jari pada layar smartphone Android serta object yang disentuh. Selain itu, game mechanic yang dibangun juga dapat menentukan jenis gerakan yang dilakukan terhadap Babylon Tower berdasarkan input berupa sentuhan yang diterima dari user.

3.4.1. Touch Handling

Touch handling merupakan bagian dari game mechanic yang berfungsi untuk mengatur setiap input berupa sentuhan yang diterima dari user. Posisi layar yang disentuh, arah gerakan jari yang menyentuh layar serta jauh perpindahan jari yang menyentuh layar turut menentukan jenis gerakan yang dilakukan terhadap Babylon Tower.

Pseudocode yang digunakan dalam mengatur input berupa sentuhan adalah sebagai berikut:

if (touch down) {

if (touch something) { is_rotating = true

selected_disc = disc row touched selected_ball = ball touched } else {

is_camera_rotating = true }

touch_reference = touch position }

if (touch) {

touch_offset = touch position – touch_reference

if (is_rotating) {

total_rotation += rotate selected_disc based on touch_offset rotate each balls in selected_disc

32

}

if (is_camera_rotating) {

rotate camera based on touch_offset }

touch_reference = touch position } if (touch up) { if (is_rotating) { is_rotating = false rotation_value = Calculate_Rotation(total_rotation) if (rotation_value == 0) { if (selected_ball != null) {

if (selected_disc == 5 && no gap) { if (can be pushed) {

add push move to list }

} else {

if (can be slided) { add slide move to list }

} } } else {

add rotate move to list } total_rotation = 0 selected_ball = null } if (is_camera_rotating) { is_camera_rotating = false } }

Ketika jari menyentuh layar, akan dideteksi apakah terdapat object yang disentuh oleh jari. Apabila ada, akan disimpan nilai true pada variabel is_rotating yang menyatakan bahwa bagian Babylon Tower yang disentuh akan diputar sesuai dengan gerakan jari pada langkah selanjutnya. Kemudian pada variabel selected_disc dan selected_ball masing-masing akan disimpan nilai yang menyatakan posisi baris cakram yang disentuh serta bola yang disentuh. Apabila tidak ada object yang disentuh, akan disimpan nilai true pada variabel is_camera_rotating yang menyatakan sudut pandang Babylon Tower akan diputar sesuai dengan gerakan jari pada langkah selanjutnya. Sudut padang tersebut dibatasi supaya hanya dapat diputar terhadap sumbu-Y. Setelah menentukan ada tidaknya object yang disentuh oleh jari, posisi jari yang menyentuh layar akan disimpan dalam variabel touch_reference.

Selanjutnya akan dideteksi pula arah gerakan serta jauh perpindahan jari yang sedang menyentuh layar. Jauh perpindahan jari yang menyentuh layar akan disimpan dalam variabel touch_offset yang dihitung berdasarkan posisi jari yang menyentuh layar terhadap posisi yang sebelumnya tersimpan dalam variabel touch_reference. Apabila variabel is_rotating bernilai true, nilai yang tersimpan dalam variabel total_rotation akan diperbaharui berdasarkan jauh perpindahan sentuhan jari yang tersimpan dalam variabel touch_offset. Variabel total_rotation menyimpan nilai yang menyatakan jumlah sudut rotasi yang telah dilakukan yang dihitung sejak jari tangan mulai menyentuh layar hingga meninggalkan layar. Selanjutnya setiap bola yang terdapat pada baris yang disentuh (selected_disc) juga ikut diputar sesuai dengan nilai pada variabel touch_offset. Apabila variabel is_camera_rotating bernilai true, sudut pandang Babylon Tower akan diputar sesuai dengan nilai pada variabel touch_offset.

Ketika jari meninggalkan layar, akan diproses gerakan yang dihasilkan selama jari user menyentuh layar. Apabila variabel is_rotating bernilai true, maka nilai variabel tersebut akan diubah kembali menjadi false. Selanjutnya akan didefinisikan variabel rotation_value yang akan menyimpan jumlah kolom yang dilalui berdasarkan jumlah sudut rotasi yang tersimpan dalam variabel total_rotation. Apabila variabel rotation_value bernilai 0 (posisi kolom tidak berpindah), bola yang disentuh berada pada baris terbawah (baris 5), tidak terdapat celah pada Babylon Tower, serta bola yang disentuh dapat ditekan masuk, maka bola akan ditekan masuk ke dalam. Setelah bola ditekan masuk, maka akan menghasilkan celah yang mengakibatkan bola-bola yang berada di atasnya tergeser ke bawah. Gerakan tersebut akan disimpan ke dalam list. Sebagai contoh dapat dilihat pada gambar 3.7 yang menunjukkan bola merah pada posisi paling bawah sebelum dan sesudah ditekan masuk ke dalam cakram. Setelah ditekan bola-bola yang berada di atasnya akan tergeser ke bawah sehingga celah berada pada cakram paling atas.

34

Gambar 3.7. Tampilan scene sebelum dan sesudah bola merah pada posisi paling bawah ditekan masuk ke dalam cakram

Apabila bola yang disentuh bukan berada pada baris terbawah serta terdapat celah pada posisi kolom bola yang disentuh, maka bola akan digeser menuju posisi celah yang terdapat pada kolom yang sama. Gerakan tersebut juga akan disimpan ke dalam list. Sebagai contoh dapat dilihat pada gambar 3.8 yang menunjukkan bola merah pada baris keempat dari atas sebelum dan sesudah digeser menuju celah yang ada di atasnya.

Gambar 3.8. Tampilan scene sebelum dan sesudah bola merah pada baris keempat dari atas digeser menuju celah yang ada di posisi paling atas

Apabila variabel rotation_value bukan bernilai 0, maka hanya akan disimpan gerakan yang dilakukan ke dalam list karena gerakan memutar cakram telah dilakukan selama user menggeser jarinya yang sedang menyentuh layar.

Ketika jari user yang menyentuh object meninggalkan layar, object-object yang diputar akan diposisikan ke posisi kolom yang terdekat berdasarkan jumlah sudut rotasi yang tersimpan dalam variabel total_rotation. Sebagai contoh dapat dilihat pada gambar 3.9 yang menunjukkan tampilan Babylon Tower ketika user sedang menyentuh cakram atau bola pada baris keempat dari atas dan menggerakkan jarinya ke kanan atau kiri. Saat jari user meninggalkan layar, maka cakram beserta bola-bolanya akan diposisikan ke kolom terdekat berdasarkan jumlah sudut rotasi yang dilakukan oleh jari user.

Gambar 3.9. Tampilan scene ketika jari user sedang memutar salah satu cakram dan tampilan scene setelah jari user meninggalkan layar.

3.4.2. Moves Handling

Setiap gerakan yang telah dilakukan oleh user akan diperiksa apakah Babylon Tower telah terselesaikan atau belum. Setiap gerakan tersebut juga akan disimpan dalam sebuah list, sehingga permainan dapat di-undo maupun di-redo.

36

Gerakan-gerakan dasar yang dapat dilakukan terhadap Babylon Tower antara lain:

- Rotate : memutar salah satu cakram sejauh nilai tertentu - Push : menekan masuk bola ke dalam cakram

- Slide : menggeser bola pada salah satu kolom menuju celah yang ada - Pop : mengeluarkan kembali bola yang berada di dalam cakram

Setiap gerakan-gerakan dasar tersebut dilakukan, nilai yang tersimpan dalam object-object yang terpengaruh beserta tampilan visualnya di scene akan di-update. Setiap gerakan yang dilakukan oleh user juga akan disimpan ke dalam sebuah list, yaitu moves list. Terdapat tiga jenis gerakan yang dapat disimpan dalam moves list, yaitu rotate, push dan slide. Gerakan pop tidak perlu disimpan dalam list karena gerakan tersebut akan otomatis dilakukan ketika gerakan yang lain menghasilkan celah dimana terdapat bola yang berada di balik celah tersebut.

Setiap nilai yang tersimpan dalam sebuah gerakan harus mencakup seluruh data yang diperlukan untuk mengeksekusi gerakan tersebut yang tersimpan dalam moves list. Selain itu perlu diperhatikan juga nilai apa yang dibutuhkan ketika gerakan yang telah tersimpan akan dipanggil kembali untuk melakukan proses undo maupun redo. Gerakan yang dilakukan ketika melakukan proses redo sama dengan gerakan yang dilakukan oleh user, tetapi untuk melakukan proses undo terdapat sedikit perbedaan.

Untuk gerakan rotate, cakram akan diputar sejauh nilai tertentu searah jarum jam. Ketika melakukan proses undo, cakram akan diputar sejauh nilai tertentu berlawanan arah jarum jam. Nilai yang perlu disimpan serta proses undo dan redo pada gerakan rotate dapat dilihat pada tabel 3.6.

Tabel 3.6. Nilai yang disimpan serta proses undo dan redo pada gerakan rotate

Nilai

Nilai 1 (n1) : posisi baris cakram yang diputar Nilai 2 (n2) : jauh putaran cakram

Undo Memutar cakram yang terdapat pada baris n1 sejauh n2

berlawanan arah jarum jam

Redo Memutar cakram yang terdapat pada baris n1 sejauh n2 searah

Untuk gerakan push, ketika gerakan ini dilakukan, bola akan ditekan masuk ke dalam cakram, kemudian semua bola yang berada di atasnya pada posisi kolom yang sama akan digeser ke bawah menutupi celah yang dihasilkan oleh bola yang ditekan. Untuk proses undo, mula-mula gerakan yang harus dilakukan adalah membalikkan gerakan yang terakhir kali dilakukan yaitu menggeser semua bola pada satu kolom menuju celah yang terdapat pada baris paling bawah. Kebalikan dari gerakan tersebut adalah menggeser kembali semua bola pada kolom tersebut menuju celah yang terdapat pada baris paling atas. Kemudian bola yang berada di balik celah yang terdapat pada baris paling bawah akan keluar kembali. Nilai yang perlu disimpan serta proses undo dan redo pada gerakan push dapat dilihat pada tabel 3.7.

Tabel 3.7. Nilai yang disimpan serta proses undo dan redo pada gerakan push

Nilai

Nilai 1 (n1) : posisi kolom dari bola yang ditekan

Nilai 2 (n2) : posisi baris dari celah yang akan dihasilkan setelah bola ditekan

Undo

Meggeser bola pada kolom n1 dari baris paling bawah menuju baris n2

Mengeluarkan bola yang berada di balik celah yang baru dihasilkan

Redo

Menekan masuk bola pada kolom n1 pada baris paling bawah Menggeser bola dari baris n2 menuju celah yang baru

dihasilkan.

Untuk gerakan slide, ketika gerakan ini dilakukan, bola akan digeser dari posisi baris tertentu menuju posisi celah yang paling dekat sehingga posisi celah akan berpindah menuju posisi awal bola yang digeser. Setelah bola digeser, perlu diperiksa apakah terdapat bola yang berada di balik celah yang baru dihasilkan. Bila ada, maka bola yang berada di dalam cakram akan muncul keluar menutupi celah tersebut. Untuk proses undo, apabila gerakan terakhir adalah memunculkan bola yang berada di dalam cakram, maka kebalikan dari gerakan tersebut adalah menekan masuk bola tersebut supaya kembali ke dalam cakram. Selanjutnya dapat dilakukan gerakan menggeser bola untuk mengembalikan bola-bola ke posisi semula. Nilai yang perlu disimpan serta proses undo dan redo pada gerakan slide dapat dilihat pada tabel 3.8.

38

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

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

40

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 = StartSorting(column) } } } } } 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

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

42

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_Completed(column)) { 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_Completed(column)) { for (each row from 5 to 2) {

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

Dokumen terkait