• Tidak ada hasil yang ditemukan

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

N/A
N/A
Protected

Academic year: 2016

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

Copied!
73
0
0

Teks penuh

(1)

PENERAPAN ALGORITMA COLUMN BY COLUMN DAN DEPTH-FIRST SEARCH DALAM PERMAINAN

BABYLON TOWER

SKRIPSI

HARRY 111402046

PROGRAM STUDI S1 TEKNOLOGI INFORMASI

FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI UNIVERSITAS SUMATERA UTARA

(2)

PENERAPAN ALGORITMA COLUMN BY COLUMN DAN DEPTH-FIRST SEARCH DALAM PERMAINAN

BABYLON TOWER

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat memperoleh ijazah Sarjana Teknologi Informasi

HARRY 111402046

PROGRAM STUDI S1 TEKNOLOGI INFORMASI

FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI UNIVERSITAS SUMATERA UTARA

(3)

PERSETUJUAN

Judul : PENERAPAN ALGORITMA COLUMN BY COLUMN

DAN DEPTH-FIRST SEARCH DALAM PERMAINAN BABYLON TOWER

Kategori : SKRIPSI

Nama : HARRY

Nomor Induk Mahasiswa : 111402046

Program Studi : S1 TEKNOLOGI INFORMASI

Departemen : TEKNOLOGI INFORMASI

Fakultas : ILMU KOMPUTER DAN TEKNOLOGI INFORMASI

UNIVERSITAS SUMATERA UTARA Komisi Pembimbing :

Pembimbing 2 Pembimbing 1

Romi Fadillah Rahmat, B.Comp.Sc M.Sc Prof. Dr. Opim Salim Sitompul, M.Sc NIP. 19860303 201012 1 004 NIP. 19610817 198701 1 001

Diketahui/disetujui oleh

Program Studi S1 Teknologi Informasi Ketua,

(4)

iii

PERNYATAAN

PENERAPAN ALGORITMA COLUMN BY COLUMN DAN DEPTH-FIRST SEARCH DALAM PERMAINAN

BABYLON TOWER

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil karya saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing telah disebutkan sumbernya.

Medan, 17 Desember 2015

(5)

UCAPAN TERIMA KASIH

Puji dan syukur penulis sampaikah kehadirat Tuhan Yang Maha Esa yang telah memberikan rahmat serta restu-Nya sehingga penulis dapat menyelesaikan skripsi ini sebagai syarat untuk memperoleh gelar Sarjana Teknologi Informasi.

Pertama, penulis ingin mengucapkan terima kasih kepada Bapak Prof. Dr. Opim Salim Sitompul, M.Sc selaku pembimbing pertama dan Bapak Romi Fadillah Rahmat, B.Comp.Sc. M.Sc selaku pembimbing kedua yang telah membimbing penulis dalam penelitian serta penulisan skripsi ini. Tanpa inspirasi serta motivasi yang diberikan dari kedua pembimbing, tentunya penulis tidak akan dapat menyelesaikan skripsi ini. Penulis juga mengucapkan terima kasih kepada Bapak Dedy Arisandi, ST. M.Kom sebagai dosen pembanding pertama dan Bapak Dr. Sawaluddin, M.IT sebagai dosen pembanding kedua yang telah memberikan masukan serta kritik yang bermanfaat dalam penulisan skripsi ini. Ucapan terima kasih juga ditjukan kepada semua dosen serta semua pegawai pada program studi S1 Teknologi Informasi, yang telah membantu serta membimbing penulis selama proses perkuliahan.

Penulis tentunya tidak lupa berterima kasih kepada kedua orang tua penulis, Alm. Bapak Hermanto Tahir, serta Ibu Narina Salimin yang telah membesarkan penulis dengan sabar dan penuh cinta. Terima kasih juga penulis ucapkan kepada adik penulis, Roderick, yang selalu memberikan dukungan kepada penulis. Penulis juga berterima kasih kepada seluruh anggota keluarga penulis yang namanya tidak dapat disebutkan satu persatu.

(6)

v

ABSTRAK

Babylon Tower merupakan permainan puzzle tiga dimensi yang terdiri dari enam buah cakram yang disusun menumpuk ke atas. Setiap cakram terdiri dari enam kolom bola kecil di sepanjang sisinya dengan enam jenis warna yang berbeda. Babylon Tower dapat dimainkan dengan cara diputar dan digeser. Tujuan dari permainan Babylon Tower adalah mengurutkan setiap bola dengan warna yang sama pada kolom yang sama serta mengurutkan setiap kolom berdasarkan tingkat kecerahan warna bola. Terdapat dua metode yang dapat digunakan untuk menemukan solusi permainan Babylon Tower, yaitu disc by disc dan column by column. Metode yang diajukan pada penelitian ini adalah algoritma column by column dan depth-first search. Pada penelitian ini ditunjukkan bahwa metode yang diajukan mampu menemukan langkah demi langkah untuk mencapai solusi dari permainan Babylon Tower.

(7)

IMPLEMENTATION OF COLUMN BY COLUMN AND DEPTH-FIRST

SEARCH ALGORITHM IN THE GAME

OF BABYLON TOWER

ABSTRACT

Babylon Tower is a three-dimensional puzzle which consists of six discs that are arranged piled up. Each discs consists of six columns of small balls along the side in six kinds of different colors. Babylon Tower can be played by rotating and sliding it. The goal of the game of Babylon Tower is to sort each ball of the same color on the same column and sort the balls in each column based on the brightness of the color of the ball. There are two methods that can be used to find a solution of the game of Babylon Tower, namely disc by disc and column by column. The methods proposed in this research are column by column and depth-first search. In this research, it is shown that the proposed methods are capable of finding step by step to reach a solution of the game of Babylon Tower.

(8)

vii

DAFTAR ISI

Hal.

Persetujuan ii

Pernyataan iii

Ucapan Terima Kasih iv

Abstrak v

Abstract vi

Daftar Isi vii

Daftar Tabel x

Daftar Gambar xi

BAB 1 Pendahuluan 1

1.1. Latar Belakang 1

1.2. Rumusan Masalah 2

1.3. Batasan Masalah 3

1.4. Tujuan Penelitian 3

1.5. Manfaat Penelitian 3

1.6. Metodologi Penelitian 4

1.7. Sistematika Penulisan 5

BAB 2 Landasan Teori 6

2.1. Babylon Tower 6

2.2. Game Architecture 8

2.3. Struktur Data dan Algoritma dalam Game 9

2.3.1. Struktur Data dan Algoritma 10

2.3.2. Struktur Data dalam Game 10

2.4. Path Finding 11

2.4.1.Game Tree 12

(9)

2.5. Blind Search 14

2.5.1. Breadth-First Search 15

2.5.2. Depth-First Search 16

2.6. Kecerdasan Buatan dalam Game 18

2.7. Penelitian Terdahulu 19

BAB 3 Analisis dan Perancangan 21

3.1. Arsitektur Umum 21

3.2. Modelling 23

3.2.1. Model Cakram 23

3.2.2. Model Bola 25

3.2.3. Model Babylon Tower 26

3.3. Struktur Data 27

3.3.1. Ball 27

3.3.2. Disc 28

3.3.3. Inner Gap 29

3.3.4. Babylon Tower 29

3.4. Game Mechanic 31

3.4.1. Touch Handling 31

3.4.2. Moves Handling 35

3.5. AI 38

3.5.1. Sorting dengan depth-first search 39

3.5.2. Swapping 42

3.5.3. Parity 44

BAB 4 Implementasi dan Pengujian 47

4.1. Implementasi 47

4.1.1. Spesifikasi perangkat keras 47

4.1.2. Spesifikasi perangkat lunak 48

4.1.3. Eksekusi aplikasi 48

(10)

ix

4.2.1. Hasil dari Tahap Sorting 53

4.2.2. Hasil dari Tahap Swapping 53

4.2.3. Hasil dari Tahap Parity 54

4.2.4. Hasil Pengujian 55

BAB 5 Kesimpulan dan Saran 56

5.1. Kesimpulan 56

5.2. Saran 56

(11)

DAFTAR TABEL

Hal.

Tabel 3.1. Daftar variabel pada class Ball 27

Tabel 3.2. Nama-nama warna bola dalam array 28

Tabel 3.3. Daftar variabel pada class Disc 29

Tabel 3.4. Daftar variabel pada class Babylon Tower 30 Tabel 3.5. Daftar method pada class Babylon Tower 30 Tabel 3.6. Nilai yang disimpan serta proses undo dan redo pada gerakan rotate 36 Tabel 3.7. Nilai yang disimpan serta proses undo dan redo pada gerakan push 37 Tabel 3.8. Nilai yang disimpan serta proses undo dan redo pada gerakan slide 38 Tabel 4.1. Hasil pengujian terhadap banyak langkah yang dibutuhkan untuk

(12)

xi

DAFTAR GAMBAR

Hal. Gambar 2.1. Game tree pada Tic-Tac-Toe (Millington & Funge, 2009) 12 Gambar 2.2. Search tree pada permainan Babylon Tower 13 Gambar 2.3. Breadth-first search pada permainan Babylon Tower 15 Gambar 2.4. Depth-first search pada permainan Babylon Tower 17

Gambar 3.1. Arsitektur Umum 22

Gambar 3.2. Model cakram (disc) pada posisi paling atas 24 Gambar 3.3. Model cakram (disc) pada posisi paling bawah 24 Gambar 3.4. Model cakram (disc) yang posisinya diapit oleh dua cakram yang

lain 25

Gambar 3.5. Tiga puluh enam buah bola yang digunakan dalam BabylonTower 25

Gambar 3.6. BabylonTower dalam Model 3D 26

Gambar 3.7. Tampilan scene sebelum dan sesudah bola merah pada posisi paling

bawah ditekan masuk ke dalam cakram 34

Gambar 3.8. Tampilan scene sebelum dan sesudah bola merah pada baris keempat dari atas digeser menuju celah yang ada di posisi paling atas 34 Gambar 3.9. Tampilan scene ketika jari user sedang memutar salah satu cakram

dan tampilan scene setelah jari user meninggalkan layar 35

Gambar 4.1. Tampilan MainMenu 49

Gambar 4.2. Tampilan GameScene 50

(13)

ABSTRAK

Babylon Tower merupakan permainan puzzle tiga dimensi yang terdiri dari enam buah cakram yang disusun menumpuk ke atas. Setiap cakram terdiri dari enam kolom bola kecil di sepanjang sisinya dengan enam jenis warna yang berbeda. Babylon Tower dapat dimainkan dengan cara diputar dan digeser. Tujuan dari permainan Babylon Tower adalah mengurutkan setiap bola dengan warna yang sama pada kolom yang sama serta mengurutkan setiap kolom berdasarkan tingkat kecerahan warna bola. Terdapat dua metode yang dapat digunakan untuk menemukan solusi permainan Babylon Tower, yaitu disc by disc dan column by column. Metode yang diajukan pada penelitian ini adalah algoritma column by column dan depth-first search. Pada penelitian ini ditunjukkan bahwa metode yang diajukan mampu menemukan langkah demi langkah untuk mencapai solusi dari permainan Babylon Tower.

(14)

vi

IMPLEMENTATION OF COLUMN BY COLUMN AND DEPTH-FIRST

SEARCH ALGORITHM IN THE GAME

OF BABYLON TOWER

ABSTRACT

Babylon Tower is a three-dimensional puzzle which consists of six discs that are arranged piled up. Each discs consists of six columns of small balls along the side in six kinds of different colors. Babylon Tower can be played by rotating and sliding it. The goal of the game of Babylon Tower is to sort each ball of the same color on the same column and sort the balls in each column based on the brightness of the color of the ball. There are two methods that can be used to find a solution of the game of Babylon Tower, namely disc by disc and column by column. The methods proposed in this research are column by column and depth-first search. In this research, it is shown that the proposed methods are capable of finding step by step to reach a solution of the game of Babylon Tower.

(15)

BAB 1

PENDAHULUAN

1.1. Latar Belakang

Babylon Tower merupakan salah satu permainan puzzle tiga dimensi yang diciptakan oleh Endre Pap dan dipatenkan pada tahun 1982. Babylon Tower dapat dimainkan dengan cara diputar dan digeser, sehingga Babylon Tower memiliki jumlah kemungkinan posisi bola yang sangat besar serta jumlah cara penyelesaian yang sangat besar pula (Scherpuis, 2015).

Terdapat dua jenis metode yang dapat digunakan untuk menyelesaikan Babylon Tower, yaitu disc by disc dan column by column (Scherpuis, 2015). Column by column merupakan metode yang lebih umum digunakan dalam menyelesaikan Babylon Tower karena lebih mudah dipelajari oleh pemain pemula. Column by column dilakukan dengan mengelompokkan terlebih dahulu bola-bola dengan warna yang sejenis dalam setiap kolom yang sama, kemudian mengurutkannya berdasarkan tingkat kecerahan warna setiap bola. Namun pada kenyataanya, algoritma column by column tidak selalu memberikan solusi pada Babylon Tower yang berada dalam keadaan acak. Kadang-kadang algoritma column by column dapat menemui jalan buntu sehingga pemain perlu mempertimbangkan langkah lain yang lebih baik diambil untuk menghindari jalan buntu tersebut. Oleh karena itu, penulis tertarik untuk mengembangkan algoritma column by column yang dapat diterapkan dalam permainan Babylon Tower supaya dapat selalu menemukan solusi.

(16)

2

terdiri dari dua tahap, yaitu menentukan cell-cell yang akan diwarnai melalui beberapa aturan logika kemudian algoritma depth-first search akan dijalankan untuk menyelesaikan cell-cell yang tersisa. Penelitian terhadap Japanese puzzle juga pernah dilakukan oleh Stefani et al. (2012) dengan menggunakan metode rule-based dan algoritma best-first search. Panov & Koceski (2014) menggunakan pendekatan heuristik yang diterapkan dalam permainan Kakuro. Algoritma yang digunakan dalam penelitian tersebut adalah Self-Adapting Harmony Search (SAHS). Algoritma SAHS dapat ditingkatkan apabila dilakukan tahap perhitungan terlebih dahulu untuk menentukan kombinasi penjumlahan bilangan yang dapat menghasilkan bilangan yang diinginkan. Abdel-Raouf et al. (2014) menggunakan algoritma chaotic harmony search untuk mengembangkan algoritma flower pollination yang diterapkan dalam permainan Sudoku. Dari hasil penelitian ini, algoritma tersebut mampu menemukan jalan yang lebih baik untuk menyelesaikan soal Sudoku.

Babylon Tower dapat diselesaikan dengan mengkombinasikan algoritma column by column dengan algoritma pencarian lainnya. Oleh karena itu, pada penelitian ini akan dirancang aplikasi permainan Babylon Tower yang diimplementasikan dengan algoritma column by column dan depth-first search untuk menyelesaikan permainan Babylon Tower.

1.2. Rumusan Masalah

(17)

penelitian terhadap algoritma yang dapat diterapkan untuk mengatasi masalah yang dihadapi dalam permainan Babylon Tower.

1.3. Batasan Masalah

Beberapa batasan masalah pada tugas akhir ini adalah sebagai berikut:

1. Permainan ini hanya dapat dimainkan oleh satu orang pemain (single player). 2. Babylon Tower yang digunakan berukuran 6 x 6.

3. Babylon Tower akan diacak oleh program sebelum dimainkan.

4. Babylon Tower dapat dijalankan oleh user atau dijalankan oleh AI untuk menemukan solusi.

1.4. Tujuan Penelitian

Tujuan penelitian ini adalah untuk menerapkan algoritma column by column dan depth-first search untuk mengurutkan setiap bola dengan warna yang sama pada kolom yang sama serta mengurutkan setiap kolom berdasarkan tingkat kecerahan warna bola pada setiap kolom Babylon Tower.

1.5. Manfaat Penelitian

Manfaat dari penelitian ini adalah:

1. Sebagai sarana untuk mempelajari cara menyelesaikan permainan Babylon Tower. 2. Untuk menambah ilmu pengetahuan penulis tentang algoritma column by column

dan depth-first search yang diterapkan dalam permainan Babylon Tower.

(18)

4

1.6. Metodologi Penelitian

Tahapan-tahapan yang akan dilakukan pada pelaksanaan penelitian adalah sebagai berikut:

1. Studi Literatur

Studi Literatur dilakukan dalam rangka pengumpulan bahan referensi mengenai permainan Babylon Tower, game architecture, struktur data dan algoritma dalam game, path finding, blind search, dan kecerdasan buatan dalam game.

2. Analisis Permasalahan

Pada tahap ini dilakukan analisis terhadap bahan referensi yang telah dikumpulkan pada tahap sebelumnya untuk mendapatkan pemahaman mengenai algoritma yang diterapkan dalam permainan Babylon Tower, yakni algoritma column by column dan depth-first search.

3. Implementasi

Pada tahap ini dilakukan perancangan terhadap game mechanic yang digunakan dalam permaian Babylon Tower serta dilakukan implementasi algoritma column by column dan depth-first search dalam mengatasi masalah dalam permainan Babylon Tower.

4. Evaluasi dan Analisis Hasil

Pada tahap ini dilakukan evaluasi serta analisis terhadap hasil yang didapatkan melalui implementasi algoritma column by column dan depth-first search dalam mengatasi masalah dalam permainan Babylon Tower.

5. Dokumentasi dan Pelaporan

(19)

1.7. Sistematika Penulisan

Sistematika penulisan pada skripsi ini terdiri dari lima bab yaitu sebagai berikut:

Bab 1: Pendahuluan

Bab ini berisi latar belakang, rumusan masalah, batasan masalah, tujuan penelitian, manfaat penelitian, metodologi penelitian, serta sistematika penelitian.

Bab 2: Landasan Teori

Bab ini berisi kumpulan teori-teori yang berkaitan dengan penelitian tugas akhir ini. Teori-teori yang berhubungan dengan permainan Babylon Tower, game architecture, struktur data dan algoritma dalam game, path finding, blind search, serta kecerdasan buatan dalam game akan dibahas pada bab ini.

Bab 3: Analisis dan Perancangan

Bab ini membahas analisis dan penerapan algoritma column by column dan depth-first search untuk mengatasi masalah-masalah dalam permainan Babylon Tower. Pada bab ini akan dijabarkan arsitektur umum yang digunakan.

Bab 4: Implementasi dan Pengujian

Bab ini berisi pembahasan tentang implementasi dari analisis dan perancangan yang telah dijabarkan pada bab 3. Selain itu, hasil yang didapatkan dari pengujian yang dilakukan terhadap implementasi yang dilakukan juga dijabarkan pada bab ini.

Bab 5: Kesimpulan dan Saran

(20)

BAB 2

LANDASAN TEORI

Bab ini membahas tentang teori penunjang serta penelitian sebelumnya yang berhubungan dengan permainan Babylon Tower serta algoritma-algoritma yang dapat diterapkan untuk mengatasi permasalahan dalam permainan puzzle.

2.1. Babylon Tower

Babylon Tower merupakan sliding piece puzzle yang terdiri dari enam buah cakram yang disusun menumpuk ke atas menyerupai menara, dimana setiap cakramnya dapat diputar terhadap poros tengahnya. Di sepanjang sisi setiap cakram terdapat enam kolom bola kecil dengan enam jenis warna yang berbeda. Tingkat kecerahan warna bola pada setiap kolom semakin berkurang dari bawah ke atas, dimana bola-bola yang paling cerah terletak pada cakram terbawah dan bola-bola yang paling pucat terletak pada cakram teratas. Pada cakram terbawah terdapat sebuah pegas yang memungkinkan salah satu dari dua bola yang terletak saling berseberangan untuk ditekan masuk ke dalam cakram menghasilkan sebuah celah yang dapat ditempati oleh sebuah bola yang lain. Celah yang terdapat pada suatu kolom memungkinkan bola-bola yang terdapat pada kolom tersebut dapat digeser naik atau turun ke cakram yang lain, sehingga celah tersebut juga berpindah ke cakram yang lain. Dengan memutar cakram, bola-bola serta celah yang terdapat pada cakram tersebut berpindah ke kolom yang lain. Salah satu metode yang dapat digunakan untuk menyelesaikan Babylon Tower adalah column by column (Scherpuis, 2015).

Berikut ini adalah langkah-langkah untuk menyelesaikan Babylon Tower menggunakan algoritma column by column:

a. Posisikan setiap bola sehingga pada setiap kolom hanya terdapat bola-bola dengan warna yang sejenis.

i. Tentukan warna bola untuk setiap kolom.

(21)

iii. Cari sebuah bola dari kolom lain yang memiliki warna yang dibutuhkan oleh kolom yang memuat celah.

iv. Geser bola-bola pada kolom yang memuat celah hingga posisi cakram yang memuat celah tepat berada di atas atau di bawah cakram yang memuat bola yang dibutuhkan.

v. Putar cakram yang memuat celah hingga celah tersebut tepat berada di atas atau di bawah posisi bola yang dibutuhkan.

vi. Geser bola yang dibutuhkan ke atas atau ke bawah menutupi celah tersebut. vii. Putar cakram yang memuat bola yang dibutuhkan kembali ke posisi semula,

sehingga bola yang dibutuhkan berada pada kolom sesuai dengan warna yang ditentukan.

viii. Ulangi langkah (ii) sampai (vii) hingga setiap kolom hanya memiliki bola-bola dengan warna yang sejenis.

b. Urutkan posisi bola dari bawah ke atas sesuai dengan tingkat kecerahan warna bola pada setiap kolom, kecuali untuk dua cakram teratas.

i. Tentukan salah satu kolom yang akan diurutkan terlebih dahulu.

ii. Tekan salah satu bola ke dalam cakram untuk membuat sebuah celah pada kolom yang tidak sedang diurutkan.

iii. Tentukan salah satu bola yang belum terurut dan hendak diurutkan.

iv. Geser bola-bola pada kolom yang memuat celah hingga posisi cakram yang memuat celah tepat berada di atas atau di bawah cakram yang memuat bola yang ingin diurutkan.

v. Putar cakram yang memuat celah hingga celah tersebut tepat berada di atas atau di bawah posisi bola yang ingin diurutkan.

vi. Geser bola yang ingin diurutkan ke atas atau ke bawah menutupi celah tersebut.

vii. Putar cakram yang memuat bola yang ingin diurutkan kembali ke posisi semula, sehingga bola tersebut berada dalam urutan yang sesuai.

viii. Ulangi langkah (iii) sampai (vii) untuk mengurutkan empat bola pada empat cakram terbawah. Sedangkan dua bola pada dua cakram teratas boleh dalam keadaan teurut atau tidak.

ix. Keluarkan kembali bola yang ditekan ke dalam cakram.

(22)

8

c. Tukar posisi dua bola yang belum terurut pada dua cakram teratas. i. Hitung jumlah kolom yang belum terurut pada dua bola teratasnya.

ii. Apabila jumlahnya ganjil, putar cakram yang paling atas sejauh 60 derajat. Kemudian ulangi langkah-langkah pada tahap (a) untuk mengembalikan posisi bola pada kolom yang benar.

iii. Apabila jumlahnya sudah genap, tentukan dua kolom yang posisi bolanya ingin ditukar, dan buat sebuah celah pada kolom yang lain.

iv. Lakukan langkah-langkah sesuai dengan diagram berikut untuk menukar posisi dua bola yang belum terurut pada dua cakram teratas.

Diagram tersebut menggambarkan posisi bola pada dua cakram teratas dari tiga kolom yang terlibat, yaitu dua kolom yang posisi bolanya ingin ditukar serta satu kolom lain yang memuat celah. A, a dan B, b masing-masing menyatakan warna bola dimana huruf yang sama menyatakan jenis warna yang sama dengan tingkat kecerahan yang berbeda. Huruf kapital menyatakan warna yang paling pucat. Sedangkan huruf Z menyatakan warna bola dari kolom lain yang memuat celah dan spasi menyatakan sebuah celah. Perlu diperhatikan pula bahwa ketiga kolom tersebut tidak harus terletak berdampingan. Langkah tersebut tetap dapat dilakukan apabila terdapat kolom lain di antara kolom-kolom yang terlibat.

v. Ulangi langkah (iii) sampai (iv) hingga semua posisi bola terurut.

2.2. Game Architecture

(23)

waktu dalam game. Sebagai kesimpulan, game merupakan aplikasi interaktif yang bergantung terhadap waktu, terdiri dari simulator dunia virtual yang mengolah data real-time, menampilkan hasilnya secara visual, serta mengontrol mekanisme sehingga pemain dapat berinteraksi dengan dunia game (Sanchez & Dalmau, 2004).

Setiap real-time software terdiri dari tiga jenis proses yang berjalan dalam waktu yang bersamaan. Yang pertama adalah keadaan (state) dari dunia game yang harus dikomputasi secara konstan. Yang kedua adalah interaksi yang dilakukan oleh pemain terhadap dunia game. Yang ketiga adalah state yang dihasilkan harus dapat disampaikan sebagai output kepada pemain, output dapat berupa tampilan, audio, maupun bentuk output lainnya yang memungkinkan (Sanchez & Dalmau, 2004).

Dalam graphical user interface (GUI) yang sering ditemukan pada sistem operasi Windows atau Macintosh, sebagian besar isi tampilannya bersifat statis. Hanya bagian kecil dari window yang tampilannya secara aktif berubah-ubah pada waktu tertentu. Karena hal tersebut, GUI ditampilkan pada layar dengan teknik yang disebut rectangle invalidation, dimana hanya sebagian kecil dari layar yang isinya berubah yang perlu diubah tampilannya. Game 2D pada awalnya menggunakan teknik yang serupa untuk meminimalisir jumlah pixel yang perlu ditampilkan.

Namun, tampilan grafis pada game 3D real-time diimplementasi dengan cara yang sama sekali berbeda. Seluruh isi yang ditampilkan pada layar akan berubah secara terus menerus ketika pemain bergerak dalam lingkungan 3D, sehingga konsep rectangle invalidation tidak dapat lagi diterapkan. Sebagai gantinya, sebuah ilusi dari gerakan dapat dihasilkan dengan cara yang hampir sama dengan cara menghasilkan ilusi gerakan pada sebuah film, yaitu dengan menampilkan kepada penonton rangkaian gambar diam yang bergantian secara cepat dan berurutan. Untuk menghasilkan tampilan gambar diam yang bergantian secara cepat, dibutuhkan sebuah loop. Dalam real-time software, hal tersebut disebut juga sebagai render loop (Gregory, 2009).

2.3. Struktur Data dan Algoritma dalam Game

(24)

10

melaksanakan tugasnya. Dalam video game modern, data tersebut digunakan untuk menciptakan pengalaman interaktif yang kompleks dimana pemain dapat mengalami berbagai jenis pengalaman yang berbeda (Sherrod, 2007).

2.3.1. Struktur Data dan Algoritma

Sebuah struktur data menyatakan bagaimana data disusun dalam memori dan dapat dioperasikan menggunakan berbagai jenis algoritma. Salah satu struktur data paling dasar yang digunakan secara umum dalam pemrograman adalah array. Sebuah array termasuk struktur data karena menyatakan bagaimana data disusun dalam memori dan dapat dioperasikan dengan berbagai jenis algoritma, seperti insertion, deletion, searching, sorting terhadap array.

Struktur data juga dapat dipandang sebagai sebuah struktur yang merepresentasikan berbagai jenis objek nyata. Struktur data juga dapat berupa sekumpulan objek yang berisi objek-objek lainnya. Sedangkan algoritma merupakan barisan kode program yang memanipulasi data dalam struktur data (Sherrod, 2007).

2.3.2. Struktur Data dalam Game

Struktur data membentuk fondasi dari berbagai jenis teknik yang diterapkan dalam video game modern dan merupakan elemen penting untuk menciptakan berbagai jenis pengalaman bermain yang diharapkan oleh pemain. Struktur data sendiri merupakan susunan dari data di dalam memori, tetapi ketika dikombinasikan dengan algortima-algoritma tertentu, data tersebut dapat diproses serta digunakan secara efisien dan efektif. Struktur data dan algoritma dalam pengembangan game sering digunakan untuk mempercepat proses yang terjadi terhadap data yang dibutuhkan dalam game (Sherrod, 2007).

(25)

menyimpan sekumpulan elemen yang tidak akan berubah selama siklus hidup game. Selanjutnya terdapat linked list yang merupakan pengembangan dari static array, dimana terdapat beberapa kelebihan yang memungkinkan ukuran list untuk bertambah maupun berkurang secara dinamis. Selain itu, terdapat pula tree yang merupakan struktur data yang terdiri dari sekumpulan node, dimana setiap node menyimpan informasi yang relevan serta memiliki pointer yang menghubungkan node yang satu dengan node lainnya dalam sebuah tree (Sanchez & Dalmau, 2004).

Running time dari sebuah algoritma atau operasi struktur data secara khusus bergantung pada sejumlah faktor. Apabila sebuah algoritma diterapkan dalam sebuah game, dapat dipelajari running time-nya dengan mengeksekusi game tersebut dengan input yang bervariasi dan mencatat lama waktu yang dibutuhkan dalam setiap eksekusi. Pengukuran seperti itu dapat dilakukan secara akurat dengan menggunakan fungsi perhitungan waktu eksekusi yang telah tersedia dalam sistem pada bahasa pemrograman atau sistem operasi dimana algoritma tersebut ditulis (Goodrich & Tamassia, 2015).

2.4. Path Finding

Untuk menyelesaikan suatu masalah ketika tidak terdapat algortima yang jelas untuk melakukan perhitungan terhadap solusi yang valid, maka dapat digunakan metode path finding. Terdapat dua jenis pendekatan path finding yang saling berhubungan yaitu game tree dan search tree. Kedua jenis pendekatan tersebut bergantung kepada struktur umum yang disebut state tree, dimana root node merepresentasikan keadaan (state) awal serta percabangannya merepresentasikan langkah-langkah yang memungkinkan yang mengubah state sebelumnya menjadi state yang baru (Heineman, et al, 2009).

(26)

12

2.4.1. Game Tree

Game tree digunakan dalam permaian yang terdiri dari dua orang pemain yang menentukan langkahnya secara bergantian serta berusaha untuk mengalahkan pemain lainnya. Terdapat banyak kemungkinan state yang dapat terjadi dimana salah satu pemain dapat memenangkan permainan. Selain itu terdapat juga beberapa kemungkinan state dimana permainan berakhir imbang atau tidak terdapat pemenang. Algoritma path finding akan memaksimalkan peluang seorang pemain untuk memenangkan permainan atau memaksa permainan untuk berakhir imbang (Heineman, et al, 2009).

Turn-based game adalah salah satu jenis game yang dapat direpresentasikan sebagai game tree, khusunya board game. Gambar 2.1 menunjukkan bagian dari game tree untuk game Tic-Tac-Toe. Setiap node merepresentasikan posisi papan dan setiap cabang merepresentasikan salah satu langkah yang mungkin diambil.

Gambar 2.1. Game tree pada Tic-Tac-Toe (Millington & Funge, 2009)

(27)

banyak sekali langkah berbeda yang mungkin diambil oleh setiap pemain. Beberapa posisi papan dapat mencapai kondisi dimana tidak terdapat lagi langkah yang memungkinkan. Kondisi ini disebut terminal position dan menyatakan akhir dari sebuah permainan (Millington & Funge, 2009).

2.4.2. Search Tree

Search tree digunakan dalam permainan dimana permain tunggal diberikan tugas untuk menyelesaikan permainan, dimulai dari keadaan awal yang diberikan, dengan serangkaian langkah yang dapat diambil. Dalam kebanyakan kasus, terdapat tepat satu goal state yang hendak dicapai.

Gambar 2.2. Search tree pada permainan Babylon Tower

(28)

14

Tujuan dari permainan Babylon Tower adalah untuk menentukan langkah dari keadaan awal Babylon Tower yang telah diacak untuk mencapai goal state. Search tree dari bagian permainan Babylon Tower dapat digambarkan seperti pada gambar 2.2. Dalam search tree, tidak terdapat pemain lawan yang mengambil langkah, tetapi search tree memiliki kemiripan dengan game tree. Search tree juga memiliki keadaan awal (initial state) serta serangkaian langkah yang mengubah state selama permainan berlangsung hingga ditemukan goal state (Heineman, et al, 2009).

2.5. Blind Search

Search merupakan hal yang umum dan sering ditemukan dalam kecerdasan buatan, yang merupakan model teoritis yang diterapkan dalam problem solving, aplikasi, dan bahasa pemrograman (Luger & Stubblefield, 2009).

Blind search disebut juga Uninformed search merupakan strategi pencarian solusi dimana dalam proses pencariannya, tidak terdapat informasi tambahan tentang keadaan yang akan terjadi selanjutnya dari suatu langkah yang diambil. Blind search hanya mampu men-generate langkah-langkah selanjutnya dan menentukan apakah solusi sudah tercapai atau belum dari suatu langkah yang diambil. Blind search tidak mampu menentukan langkah mana yang lebih menguntungkan atau lebih menjanjikan untuk mencapai solusi (Russell & Norvig, 2010). Beberapa algoritma pencarian yang termasuk dalam blind search antara lain breadth-first search, depth-first search, iterative deepening search dan sebagainya.

2.5.1 Breadth-First Search

(29)

Breadth-first search akan selalu menemukan solusi apabila pencarian dilakukan pada pohon pencarian yang memuat solusi pada salah satu node pada tingkat kedalaman d yang terbatas serta memiliki branching factor b yang terbatas. Ketika node yang memuat solusi di-generate untuk pertama kalinya, maka dapat dipastikan bahwa node tersebut merupakan solusi yang paling singkat. Hal ini dikarenakan semua node pada tingkat kedalaman yang lebih dangkal telah di-generate terlebih dahulu dan tidak menemui solusi yang diinginkan. Solusi yang ditemukan merupakan solusi yang optimal apabila biaya (cost) yang dibutuhkan tidak berkurang untuk melalui node pada kedalaman yang lebih dalam (Russell & Norvig, 2010). Contoh breadth-first search yang diterapkan pada permainan Babylon Tower dapat dilihat pada gambar 2.3.

Gambar 2.3. Breadth-first search pada permainan Babylon Tower

(30)

16

ketiga, dan seterusnya. Apabila solusi pencarian terdapat pada kedalaman d, maka dalam kondisi terburuk (worst case), dimana solusi terdapat pada node terakhir pada kedalaman d, jumlah node yang di-generate adalah

Jumlah memori yang dibutuhkan untuk menjalankan algoritma breadth-first search menjadi masalah yang lebih besar dibandingkan waktu yang diperlukan (Russel & Norvig, 2010). Jumlah memori yang dibutuhkan juga merupakan kelemahan yang paling besar dalam algoritma breadth-first search. Breadth-first search yang diterapkan dalam kebanyakan kasus akan menghabiskan memori yang tersedia dalam waktu yang singkat (Korf, 1985). Namun breadth-first search juga membutuhkan waktu yang cukup lama untuk melakukan pencarian karena lama waktu yang diperlukan untuk mencari semua node pada setiap tingkat kedalaman akan mengalami peningkatan secara eksponensial karena jumlah node yang juga meningkat secara eksponensial (Russell & Norvig, 2010).

2.5.2. Depth-First Search

Depth-first search mampu menghindari masalah keterbatasan memori yang terjadi pada algoritma breadth-first search (Korf, 1085). Depth-first search akan selalu melalui salah satu cabang dari pohon pencarian dan mengikutinya hingga menemui solusi. Apabila cabang yang dilalui tidak menemui solusi, maka pencarian akan mundur satu langkah dan dilanjutkan dengan cabang lainnya (Luger, 2009).

(31)
[image:31.595.136.497.81.642.2]

Gambar 2.4. Depth-first search pada permainan Babylon Tower

(32)

18

maksimum dari pohon pencarian. Nilai m bisa jauh lebih besar daripada nilai d (kedalaman minimum yang memuat solusi) atau tak terhingga apabila pohon pencarian tidak memiliki kedalaman yang terbatas (setiap node selalu memiliki successor).

Depth-first search memiliki kelebihan dibandingkan breadth-first search dalam hal penggunaan memori. Pohon pencarian pada depth-first search hanya perlu menyimpan jalur dari root menuju node pada kedalaman yang sedang dijelajahi serta node-node lain yang belum diekspansi pada kedalaman yang sama. Setiap node yang sudah pernah dijelajahi dapat langsung dihapus dari memori. Pada pohon pencarian dengan branching factor b dan kedalaman maksimum m, depth-first search memerlukan memori untuk menampung node sebanyak (Russell & Norvig, 2010).

2.6. Kecerdasan Buatan dalam Game

Salah satu tantangan terbesar dari kecerdasan buatan adalah untuk menciptakan general intelligence, sebuah agent yang mampu unggul dalam banyak bidang. Ruang lingkup kecerdasan buatan terutama bertujuan untuk menciptakan agent yang mampu membuat keputusan yang baik. Dalam konteks game, hal tersebut saling relevan, dimana pemain harus membuat banyak keputusan yang tepat untuk mencapai hasil yang diinginkan, seperti untuk mengalahkan lawan atau mendapatkan skor tertinggi (Levine, et al. 2013).

(33)

Goldeneye 007 [Rare Ltd., 1997] berhasil menunjukkan kepada gamer bahwa AI dapat meningkatkan pengalaman bermain yang ditawarkan dalam sebuah game. Goldeneye 007 menambahkan sebuah sistem simulasi yang disebut sense simulation system, yang memungkinkan karakter untuk merespon terhadap karakter-karakter lain di sekitarnya. Creatures [Cyberlife Technology Ltd., 1997] menerapkan AI yang sangat kompleks di dalam game-nya, yaitu menggunakan neural network untuk setiap karakternya.

Saat ini telah terdapat beraneka ragam jenis AI yang diterapkan dalam game. Jenis AI yang diterapkan dalam suatu game berbeda-beda tergantung pada genre game itu sendiri. Misalnya dalam game balapan, AI yang diterapkan mampu memperhitungkan jalur tersingkat yang mungkin dilalui dalam arena balap. Bahkan saat ini masih terdapat banyak genre game yang masih menggunakan AI yang sederhana seperti yang digunakan dalam Pac-Man karena memang itulah AI yang paling sesuai untuk game tersebut.

AI dalam kebanyakan game saat ini dialamatkan pada tiga kebutuhan dasar sebagai berikut:

i. kemampuan untuk menggerakan karakter.

ii. kemampuan untuk membuat keputusan, seperti langkah mana yang akan diambil.

iii. kemampuan untuk berpikir secara taktis dan strategis. (Millington & Funge, 2009).

2.7. Penelitian Terdahulu

(34)

20

Jing et al. (2009) melakukan penelitian terhadap metode yang dapat diterapkan dalam permainan Japanese puzzle atau dikenal juga sebagai nonogram. Untuk menyelesaikan Japanese puzzle secara manual, tahap pertama dapat dilakukan secara logika dengan menentukan cell yang akan diwarnai. Kemudian, sisanya dapat diselesaikan melalui tebakan atau dengan menguji satu-persatu cell mana saja yang perlu diwarnai. Metode yang dapat diterapkan dalam Japanese puzzle tersebut terdiri dari dua tahap. Pada tahap pertama, beberapa aturan logika akan dijalankan untuk menentukan cell-cell yang akan diwarnai. Pada tahap kedua, algoritma depth-first search akan dijalankan untuk menyelesaikan cell-cell yang tersisa. Penelitian terhadap Japanese puzzle juga pernah dilakukan oleh Stefani et al. (2012) dengan menggunakan metode rule-based dan algoritma best-first search. Dari hasil penelitian tersebut, semakin besar ukuran puzzle yang digunakan, maka semakin lama pula waktu yang dibutuhkan untuk menyelesaikan puzzle tersebut.

Panov & Koceski (2014) menggunakan pendekatan heuristik yang diterapkan dalam permainan Kakuro. Algoritma yang digunakan dalam penelitian ini adalah Self-Adapting Harmony Search (SAHS). Hasil penelitian ini menunjukkan bahwa SAHS mampu menemukan bilangan-bilangan yang dapat ditempatkan pada posisi yang benar pada puzzle Kakuro dengan penggunaan waktu yang efisien. Algoritma SAHS dapat ditingkatkan apabila dilakukan tahap perhitungan terlebih dahulu untuk menentukan kombinasi penjumlahan bilangan yang dapat menghasilkan bilangan yang diinginkan.

(35)

BAB 3

ANALISIS DAN PERANCANGAN

Bab ini membahas tentang penerapan algoritma column by column dan depth-first search untuk mengatasi permasalahsan dalam permainan Babylon Tower. Pada bab ini dijabarkan juga arsitektur umum yang digunakan.

3.1. Arsitektur Umum

(36)

22

[image:36.595.109.528.187.674.2]

Metode yang diajukan pada penelitian ini dapat dilihat pada gambar 3.1 yang menunjukkan arsitektur umum dari rangkaian langkah yang dilakukan untuk merancang serta menerapkan algoritma column by column dan depth-first search dalam permainan Babylon Tower.

(37)

3.2. Modelling

Model 3D yang dibangun adalah bagian-bagian yang terdapat pada permainan Babylon Tower, yang terdiri dari enam buah cakram (disc) dan 36 buah bola. Model 3D tersebut dibangun menggunakan software Blender dan selanjutnya di-import ke dalam softwareUnity.

3.2.1. Model Cakram

Sebuah Babylon Tower terdiri dari enam buah cakram (disc), dimana empat buah cakram yang posisinya diapit oleh dua cakram yang lain memiliki bentuk yang sama. Oleh karena itu, terdapat tiga jenis model cakram yang perlu dibangun dari software Blender yaitu model cakram yang terletak pada posisi paling atas, model cakram yang terletak pada posisi paling bawah, serta model cakram yang posisinya diapit oleh dua cakram yang lain.

Model cakram yang terletak pada posisi paling atas dibangun dari sebuah model tabung dengan ukuran diameter 1,9 satuan dan tinggi 0,8 satuan. Bagian atas dari model tabung tersebut dibentuk sedikit melengkung. Selanjutnya ditambahkan enam buah celah pada sekeliling model tabung tersebut dengan jarak antar celah yang berdekatan selalu sama yaitu 60° terhadap sumbu-Y dari pusat tabung. Ukuran celah yang dibuat disesuaikan dengan ukuran model bola yang akan dibuat supaya setiap celah tersebut dapat ditempati oleh sebuah bola. Celah dibuat terbuka pada bagian bawahnya supaya bola yang berada pada celah tersebut dapat bergeser menuju cakram di bawahnya, sedangkan bagian atas celah dibuat tertutup dengan bentuk setengah lingkaran. Model cakram untuk posisi paling atas dapat dilihat pada gambar 3.2.

(38)

24

[image:38.595.221.410.172.313.2]

berseberangan. Salah satu di antara dua bola yang terletak pada celah yang terhubung dengan lubang dapat ditekan masuk menuju ke dalam tengah-tengah lubang. Model cakram untuk posisi paling bawah dapat dilihat pada gambar 3.3.

Gambar 3.2. Model cakram (disc) pada posisi paling atas

Gambar 3.3. Model cakram (disc) pada posisi paling bawah

[image:38.595.216.419.366.508.2]
(39)
[image:39.595.213.422.84.220.2]

Gambar 3.4. Model cakram (disc) yang posisinya diapit oleh dua cakram yang

lain

3.2.2. Model Bola

Dalam sebuah Babylon Tower, terdapat 36 buah bola yang terdiri dari enam jenis warna berbeda (hitam, kuning, merah, hijau, cokelat, biru). Setiap jenis warna terdiri dari enam buah bola dengan tingkat kecerahan yang berbeda-beda, dimulai dari warna bola yang paling cerah hingga yang paling pucat.

[image:39.595.203.430.526.657.2]

Model bola juga dibuat menggunakan software Blender dengan ukuran diameter 0,5 satuan. Dalam software Unity, setiap model bola diatur warnanya sesuai dengan kebutuhan. Ketiga pulah enam buah bola yang digunakan dapat dilihat pada gambar 3.5.

(40)

26

3.2.3. Model Babylon Tower

Dalam software Unity, model-model yang telah dibangun disusun sedemikian rupa sehingga menempati posisinya masing-masing seperti yang dapat dilihat pada gambar 3.6. Model cakram pada posisi paling bawah diletakkan pada koordinat pusat (ketiga sumbu koordinat XYZ bernilai 0). Model cakram yang terletak tepat diatas cakram terbawah diletakkan pada koordinat dengan sumbu-Y yang bernilai 0,5 lebih besar dari cakram di bawahnya, sedangkan koordinat sumbu-X dan sumbu-Z tetap bernilai 0. Untuk model cakram selanjutnya juga diletakkan dengan aturan yang sama hingga model cakram teratas diletakkan pada koordinat dengan sumbu-Y yang bernilai 2,5.

Gambar 3.6. Babylon Tower dalam Model 3D

[image:40.595.202.431.317.516.2]
(41)

3.3. Struktur Data

Aplikasi permainan Babylon Tower yang dibangun mampu merepresentasikan setiap elemen object yang terdapat dalam Babylon Tower disertai dengan fungsi-fungsi dasarnya. Selain itu, aplikasi yang dibangun juga mampu mendeteksi input berupa sentuhan pada layar smartphone dari user serta menentukan gerakan yang dihasilkan dari input tersebut.

Untuk merepresentasikan setiap object yang terdapat dalam permainan Babylon Tower secara jelas, maka perlu dibuat class untuk setiap jenis object yang ada. Secara umum, jenis object yang digunakan dapat dikelompokkan menjadi dua kelompok besar yaitu disc dan ball. Selain itu, perlu juga dibuat sebuah class untuk menampung informasi tentang posisi bola yang terdapat di dalam Babylon Tower, yaitu inner gap. Pada akhirnya, diperlukan sebuah class yang berfungsi untuk menampung sekaligus mengatur setiap object yang terdapat dalam sebuah Babylon Tower.

3.3.1. Ball

[image:41.595.108.527.575.704.2]

Ball merupakan elemen terkecil dalam sebuah Babylon Tower sekaligus elemen yang dapat menempati posisi yang sangat beragam. Pada class Ball, terdapat beberapa variabel yang dapat dilihat pada tabel 3.1.

Tabel 3.1. Daftar variabel pada classBall

Nama

variabel Tipe data Kegunaan

gameObject GameObject Menyimpan model 3D dan posisi bola

color int Menyimpan sebuah bilangan yang menyatakan warna bola

brightness int

Menyimpan sebuah bilangan yang menyatakan tingkat kecerahan dari

warna bola

(42)

28

[image:42.595.132.500.183.350.2]

Selain itu, pada classBall juga terdapat sebuah variabel static dengan tipe data array dari string yang menyimpan nama-nama warna bola. Daftar index array beserta warna bolanya dapat dilihat pada tabel 3.2.

Tabel 3.2. Nama-nama warna bola dalam array

Index Color Name

0 Red

1 Brown

2 Black

3 Yellow

4 Blue

5 Green

Method-method yang terdapat dalam class Ball berfungsi untuk mengakses data yang tersimpan dalam setiap variabel yang terdapat dalam class Ball oleh class yang lain.

3.3.2. Disc

Disc menempati posisi baris yang tidak berubah dalam sebuah Babylon Tower, yang artinya setiap disc tidak dapat berpindah posisi dari baris atas ke baris bawah maupun sebaliknya. Setiap disc menyimpan daftar enam buah object ball yang sedang berada pada disc tersebut. Pada class Disc, terdapat beberapa variabel yang dapat dilihat pada tabel 3.3. Nilai disc berkisar dari 0 sampai 5, dimana 0 menyatakan disc berada pada posisi paling atas dan 5 menyatakan disc berada pada posisi paling bawah.

(43)
[image:43.595.112.523.95.261.2]

Tabel 3.3. Daftar variabel pada class Disc

Nama

variabel Tipe data Kegunaan

gameObject GameObject Menyimpan model 3D dan posisi disc

balls Ball[] Menyimpan semua object ball yang terdapat pada disc

row int

Menyimpan sebuah bilangan yang menyatakan posisi baris yang ditempati

oleh disc. Baris terbawah diwakili dengan nilai 0 hingga baris teratas

diwakili dengan nilai 5

3.3.3. Inner Gap

Inner Gap berfungsi untuk menyimpan informasi tentang ball yang sedang berada di dalam Babylon Tower. Dalam classInner Gap, terdapat variabel yang berfungsi untuk menyimpan object ball yang sedang berada di dalam Babylon Tower. Selain itu, terdapat pula variabel yang berfungsi untuk menyimpan bilangan yang menyatakan posisi kolom dari bola yang berada di dalam Babylon Tower.

Pada class Inner Gap juga terdapat method yang berfungsi untuk memindahkan posisi bola ketika disc yang berada pada posisi paling bawah diputar. Selain itu, terdapat pula method-method yang berfungsi untuk mengakses serta menyalin data yang tersimpan dalam setiap variabel dalam class Inner Gap oleh class yang lain.

3.3.4. Babylon Tower

(44)
[image:44.595.102.527.149.241.2]

30

Tabel 3.4. Daftar variabel pada class Babylon Tower

Nama variabel

Tipe data Kegunaan

discs Disc[] Menyimpan semua object disc yang terdapat pada Babylon Tower

innerGaps InnerGap[] Menyimpan semua object ball yang ditekan ke dalam Babylon Tower

Pada class Babylon Tower terdapat method yang berfungsi untuk memutar disc, menekan masuk bola ke dalam disc yang berada pada posisi paling bawah, mengeluarkan kembali bola yang telah ditekan ke dalam Babylon Tower, menggeser bola-bola pada kolom yang sama, serta mengacak posisi bola ketika Babylon Tower pertama kali di-generate. Method-method yang terdapat dalam class Babylon Tower dapat dilihat pada tabel 3.5.

Tabel 3.5. Daftar method pada class Babylon Tower

Nama

method Kegunaan

Rotate Memutar salah satu disc yang dipilih serta setiap bola yang berada

di dalamnya

Push Menekan masuk bola yang dapat ditekan masuk ke dalam disc

Pop Mengeluarkan kembali bola yang telah ditekan masuk sebelumnya

Slide Menggeser posisi bola-bola pada kolom yang sama yang memiliki

celah untuk digeser

Randomize Mengacak posisi bola pada Babylon Tower

[image:44.595.105.528.426.594.2]
(45)

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

(46)

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 }

}

(47)

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.

(48)

34

[image:48.595.186.447.83.280.2]

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

[image:48.595.181.454.501.694.2]
(49)

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.

[image:49.595.175.459.336.539.2]

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

(50)

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.

[image:50.595.114.524.633.738.2]

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

(51)
[image:51.595.107.526.333.508.2]

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.

(52)
[image:52.595.110.526.96.337.2]

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.

(53)

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

(54)

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.

(55)

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.

(56)

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

(57)

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.

(58)

44

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

(59)

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

Gambar

Gambar 2.1. Game tree pada Tic-Tac-Toe (Millington & Funge, 2009)
Gambar 2.2. Search tree pada permainan Babylon Tower
Gambar 2.3. Breadth-first search pada permainan Babylon Tower
Gambar 2.4. Depth-first search pada permainan Babylon Tower
+7

Referensi

Dokumen terkait

Fungsi ini termanifestasikan dalam bentuk kegiatan pengumpulan barang produksi untuk diangkut ke daerah lain, serta kegiatan pengangkutan orang yang akan bergerak ke

1 Data yang baru didapat terdiri dari catatan-catatan lapangan, yang diperoleh dari observasi, wawancara dan studi dokumen terkait dengan kebijakan pemerintah Kabupaten

Data yang dihasilkan dari studi ini memberikan informasi tentang dampak jangka pendek yang dialami oleh masyarakat dan upaya pemulihan di wilayah-wilayah yang

Matrik Renstra DISBUDPAR Kabupaten Probolinggo Tahun 2013 – 2018. sebagaimana tercantum dalam lampiran II merupakan bagian yang

The International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences, Volume XL-3/W3, 2015 ISPRS Geospatial Week 2015, 28 Sep – 03 Oct 2015, La

Demikian surat penugasan ini dikeluarkan untuk dapat dilaksanakan dengan baik dan penuh rasa tanggung jawab. ..., 29 April 2017

The GeoBigData'15 Workshop (2 October 2015), was organized by the ISPRS working group III/5 as an event of the ISPRS Geospatial Week 2015 (La Grande Motte, France, 28 September -

Tujuan dan Sasaran pembangunan adalah sebagaimana tabel di.