Jumat, 01 April 2016

Konsep Pembuatan Script Game Komputer

Script dan Skenario
Perkembangan teknologi komputer sangat mempengaruhi perkembangan yang ada dalam dunia game. Pembentukan karakter pada game semakin mendekati dengan keadaan sebenarnya pada dunia nyata. Ketika proses pembuatan game membutuhkan susunan yang lebih kompleks, timbullah kebutuhan untuk memisahkan konten (desain perilaku) dari mesin. Kehandalan seorang desainer game benar-benar dibutuhkan untuk merancang perilaku yang luas dari karakter. Banyak tersedia berbagai macam bentuk bahasa pemrograman yang ada. Tentunya dari kesemuanya itu memiliki kelebihan dan kekurangan masing-masing. Maka game developer harus benar-benar teliti dalam memilih bahasa dan menyusun script untuk membuat suatu game, agar nantinya game dapat berjalan lancar, tanpa bug, dan mampu menjalankan script dengan kebutuhan hardware seminimum mungkin.
Konsep Pembuatan Scripting pada game
·         Pemilihan Bahasa Pemrograman
Pemrograman suatu game bisa menggunakan berbagai macam jenis bahasa pemrograman. Diantaranya yang terkenal adalah C++, C dan Java.
Proses pembuatan game modern bisa memakan waktu 1-3 tahun untuk menyelesaikannya. Lamanya suatu pengembangan bergantung pada sejumlah faktor, seperti genre, skala, platform pengembangan dan jumlah aset.
Sebagai contoh, sebuah game puzzle yang sederhana dengan menggunakan grafik 2D akan jauh lebih sedikit memakan waktu untuk dikembangkan daripada game role-playing komputer 3D.
Walaupun terdapat banyak sekali pilihan bahasa pemrograman untuk membuat game, namun pada intinya bahasa tersebut harus memenuhi syarat sebagai berikut :
a)         Speed
Bahasa scripting untuk game harus mampu berjalan secepat mungkin. Jika kita berniat untuk menggunakan banyak script untuk perilaku karakter dan kejadian di level game, maka script akan perlu untuk mengeksekusi sebagai bagian dari loop game utama. Ini berarti bahwa script yang lambat akan memakan waktu yang kita butuhkan untuk membuat suatu adegan, menjalankan mesin fisika, atau menyiapkan audio.
b)         Kompilasi dan Interpretasi (penyusunan dan penafsiran)
Bahasa scripting secara luas diinterpretasikan,melalui susunan serangkaian byte. Penafsiran bahasa diambil melalui format teks. Interpreter melihat setiap baris, penyusunan bekerja sesuai yang maksud dari script, dan melakukan tindakan yang spesifik.
Bahasa byte-terkompilasi dikonversi dari teks ke format internal, yang disebut byte code. Kode byte biasanya jauh lebih padat daripada format teks. Karena kode byte dalam suatu format dioptimalkan ketika dieksekusi, agar dapat berjalan lebih cepat.
c)         Ekstensibilitas dan Integrasi
Bahasa scripting perlu memiliki akses ke fungsi yang signifikan ke dalam game. Sebuah script yang mengendalikan karakter, misalnya, harus mampu untuk menanyai game untuk mencari tahu apa yang bisa dilihat dan kemudian membiarkan game tahu apa yang akan dilakukan sebagai aksinya.
Serangkaian fungsi yang dibutuhkan untuk mengakses ini jarang diketahui ketika bahasa scripting telah diimplementasikan atau dipilih. Hal ini penting untuk memiliki sebuah bahasa yang dapat dengan mudah memanggil fungsi-fungsi atau menggunakan kelas main code dalam game. Biasanya, itu adalah penting bagi programmer untuk dapat mengekspos fungsi baru atau kelas yang dengan mudah ketika pembuat script memintanya.
d)         Re-Entrancy (ikut serta ulang)
Fungsi ini sering berguna untuk memanggil script menjadi diikutsertakan ulang. Mereka dapat berjalan untuk sementara waktu, dan ketika anggaran waktu telah habis script akan dapat ditunda. Ketika script selanjutnya mendapatkan beberapa waktu kembali, maka akan dapat menjalankan kembali script yang ditunda sebelumnya.
Hal ini sering membantu untuk membiarkan kontrol hasil script saat mencapai jeda normal. Kemudian sebuah algoritma penjadwalan dapat memberikan lebih banyak waktu untuk meminimalisasi penggunaan sumber daya.
Sebuah script untuk mengendalikan sebuah karakter, misalnya, mungkin memiliki lima tahapan yang berbeda (memeriksa situasi, memeriksa kesehatan, menentukan gerakan, rencana rute, dan melaksanakan gerakan). Ini semua dapat dimasukkan dalam satu script yang menghasilkan penyekat antara setiap bagian. Kemudian masing-masing akan berjalan dengan setiap lima frame, dan beban dari eksekusi AI akan didistribusikan.
Re-entrancy yang lebih canggih harus memungkinkan penulis script untuk menandai bagian yang tidak boleh terputus.
·         Embedding (penanaman)

Embedding berhubungan dengan ekstensibilitas. Sebuah bahasa yang tertanam dirancang untuk dimasukkan ke dalam program lain. Ketika kita menjalankan bahasa scripting dari workstation, biasanya akan menjalankan program khusus untuk menafsirkan file source code. Dalam game, sistem scripting perlu dikontrol dari dalam program utama. Game yang menentukan jalannya script harus dijalankan dan harus dapat memberitahu mesin terkait bahasa scripting yang cocok untuk memproses script tersebut.



·         Bahasa Open Source

Banyak bahasa scripting game populer yang dirilis di bawah lisensi open source. Software open-source dirilis di bawah lisensi yang memberikan hak user untuk memasukkannya ke dalam perangkat lunak mereka sendiri tanpa membayar biaya tambahan.

Memulai sebagai teks dalam sebuah file teks, script biasanya melewati empat tahap:
1. Tokenization :
Tokenizing mengidentifikasi unsur-unsur dalam teks. Sebuah file teks hanya berisi serangkaian karakter (dalam pengertian karakter ASCII). Hasil tokenizer keluar sebagai kumpulan byte tertentu dan jenis dari kelompok tertentu yang membentuk mereka.
2. Parsing (penguraian) :  

Makna dari sebuah program adalah sangat hirarkis: nama variabel dapat ditemukan dalam sebuah statement pemberian nilai, ditemukan di dalam pernyataan IF-, yang ada di dalam tubuh fungsi, di dalam definisi kelas, maupun di dalam sebuah deklarasi namespace, misalnya. Parser mengambil urutan token, mengidentifikasi peran masing-masing kode dalam program, dan mengidentifikasi struktur hirarkis keseluruhan program.
Contoh1          :  if (a < b) return;
dapat dilakukan proses parsing seperti pada bagan di bawah ini :

tes
3. Compiler :

mengubah parse tree ke dalam kode byte yang dapat dijalankan oleh interpreter. Kode byte biasanya berbentuk data biner berurutan. Compiler non-optimasi biasanya berisi output kode byte sebagai terjemahan literal dari parse tree.

4. Interpreting :

Tahap akhir dari serangkaian ini ialah menjalankan kode byte. Dalam sebuah compiler untuk bahasa seperti C atau C++, produk akhir akan menjadi mesin instruksi yang dapat langsung dijalankan oleh prosesor. Dalam bahasa scripting, anda sering perlu untuk menyediakan layanan (seperti re-entrancy dan eksekusi yang aman) yang tidak mudah dicapai dengan bahasa mesin.Kode byte akhir dijalankan pada sebuah “mesin virtual”. Ini secara efektif menjadi sebuah emulator untuk sebuah mesin yang belum pernah ada di hardware. Anda menentukan instruksi agar mesin dapat mengeksekusi, dengan instruksi kode byte.


Contoh Pembuatan game mengunakan script bahasa C.

Disini kami mengunakan game snake mengunakan script bahasa C

Langkah pertama maskan sintaks library

1.      #include <stdio.h>
2.      #include <stdlib.h>
3.      #include <time.h>
4.      #include <sys\timeb.h>
5.      #include <Windows.h>

Dalam sintaks digunakan Array dimana Array ini kita gunakan untuk menampung ular. Satu elemen pada array sama dengan satu segmen ular. Tiap elemen berisi posisi koordinat (x,y) segmen di layar. Berikut ini bentuk strukturnya. Kita beri nama Segment.

1.      /** Struktur **********/
2.       
3.      /**
4.          Struktur untuk menampung data tiap segment dari snake 
5.          (array)
6.       */
7.      struct Segment {
8.          int x, y;
9.      };

Kita tambahkan dua variabel global, yaitu array snake, dan length untuk menyimpan panjangnya.

1.      /** Variabel global **********/
2.       
3.      // Array untuk menampung data ular
4.      struct Segment snake[2000];
5.       
6.      // Variabel untuk menyimpan panjang ular (array snake)
7.      int length = 0;
Untuk game ini, kita menggunakan konsep queue. Artinya, elemen pada array akan ditambahkan di awal (head), dan ketika dihapus, yang hilang adalah bagian akhir (tail). Istilahnya first in first out.
Berikut ini fungsi untuk melakukan penambahan push() dan penghapusan pop().

1.      /** Fungsi-fungsi **********/
2.       
3.      /**
4.          Push segment ke snake (pada bagian head).
5.       */
6.      void push(int x, int y) {
7.          for(int i = length; i > 0; i--) {
8.              snake[i] = snake[i-1];
9.          }
10.      snake[0].x = x;
11.      snake[0].y = y;
12.      length++;
13.  }
14.   
15.  /**
16.      Pop bagian ekor snake.
17.   */
18.  void pop() {
19.      length--;
20.  }

 

Ular 3 Segment

Sekarang mari kita coba buat ular sepanjang 3 segmen pada bagian main(). Oke, supaya mudah untuk mengubah-ubah pengaturan panjang awalnya, kita simpan nilai 3 tersebut di variabel globalsnake_size. Ketiga segmen ini kita tempatkan di baris pertama (y = 0), di kolom ke 1, 2, dan 3 (x = 0 s.d. 2).

1.      /** Konfigurasi permainan **********/
2.       
3.      // Panjang segment snake saat awal permainan
4.      int snake_size = 3;
5.       
6.      /**
7.          Program utama
8.       */
9.      int main() {
10.      // Pertama-tama, push segment (node) ke kanan 
11.      // sebanyak 3 segment (sesuai nilai variable snake_size)
12.      for (int i = 0; i < snake_size; i++) {
13.          push(i, 0);
14.      }
15.   
16.      return 0;
17.  }

Rendering

Setelah ular dibuat, kita akan mencetak ular tersebut di layar. Untuk mencetak, kita buat fungsidisplay(). Fungsi display() ini akan membaca nilai x dan y setiap element lalu mencetak satu karakter ‘O’ di posisi tersebut.
Untuk bisa mencetak di posisi (x,y), kita harus memindahkan kursor ke posisi tersebut. Untuk itu kita buat juga fungsi gotoxy().

1.      /**
2.          Pindahkan posisi kursor di layar
3.          Fungsi ini spesifik untuk OS windows.
4.      */
5.      void gotoxy(int x, int y) {
6.          COORD pos;
7.          pos.X = x;
8.          pos.Y = y;
9.          SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
10.  }
11.   
12.  /**
13.      Gambar snake (array) di layar
14.   */
15.  void display() {
16.      for(int i = 0; i < length; i++) {
17.          // Cetak di posisi x,y
18.          gotoxy(snake[i].x, snake[i].y);
19.          printf("O");
20.      }
21.  }

Sekarang, mari panggil display() di main(), jalankan program dan lihat hasilnya (lihat baris 11-19).

1.      /**
2.          Program utama
3.       */
4.      int main() {
5.          // Pertama-tama, push segment (node) ke kanan 
6.          // sebanyak 3 segment (sesuai nilai variable snake_size)
7.          for (int i = 0; i < snake_size; i++) {
8.              push(i, 0);
9.          }
10.   
11.      // Tampilkan kondisi permainan saat ini di layar...
12.   
13.      // Bersihkan layar
14.      system("cls");
15.   
16.      // Cetak (render) snake di layar
17.      display();
18.   
19.      getchar();
20.      return 0;
21.  }

 

Game Loop

Bagaimana caranya agar ular bisa bergerak? Caranya, adalah dengan membuat infinite loop untuk me-render ulang layar setiap putarannya. Dengan demikian, setiap ada perubahan situasi (state) pada arraysnake, entah itu jumlah element (length) atau nilai x dan y nya, perubahan itu akan langsung tercermin di layar.
Mari kita taruh bagian rendering tadi ke dalam infinite loop (lihat baris 11-20).

1.      /** 
2.          Program utama 
3.       */ 
4.      int main() { 
5.          // Pertama-tama, push segment (node) ke kanan  
6.          // sebanyak 3 segment (sesuai nilai variable snake_size) 
7.          for (int i = 0; i < snake_size; i++) { 
8.              push(i, 0); 
9.          } 
10.    
11.      // Game loop. Bagian di dalam while akan dieksekusi terus menerus 
12.      while (true) { 
13.          // Tampilkan kondisi permainan saat ini di layar... 
14.   
15.          // Bersihkan layar 
16.          system("cls"); 
17.   
18.          // Cetak (render) snake di layar 
19.          display(); 
20.      }
21.   
22.      getchar(); 
23.      return 0;
24.  }
Untuk menggerakkan ular ke kanan setiap 200ms, pertama-tama, di dalam game loop kita menghitung berapa waktu yang sudah terlewati, jika waktu yang berlalu sudah lebih atau sama dengan 200ms, maka kita geser ular. Sama dengan sebelumnya, agar nilai 200 ini mudah diubah-ubah, kita simpan dalam variabel global snake_speed.

1.      // Kecepatan gerakan snake dalam ms 
2.      int snake_speed = 200;
Untuk menghitung interval waktu yang berlalu, kita gunakan fungsi ftime() untuk mendapat kan penanda waktu.
Cara menggeser ular, adalah dengan melakukan pop(), lalu push() kembali di posisi koordinat headdengan nilai x ditambah 1 karena saat ini kepala ular mengarah ke kanan.
(Lihat baris 6-8, 17-40)
1.      /** 
2.          Program utama 
3.       */ 
4.      int main() {  
5.       
6.          // Untuk menyimpan penanda waktu saat snake bergerak 
7.          struct timeb last_timestamp; 
8.          ftime(&last_timestamp); // Set nilai awal 
9.       
10.      // Pertama-tama, push segment (node) ke kanan  
11.      // sebanyak 3 segment (sesuai nilai variable snake_size) 
12.      for (int i = 0; i < snake_size; i++) { 
13.          push(i, 0); 
14.      } 
15.      // Game loop. Bagian di dalam while akan dieksekusi terus menerus 
16.      while (true) { 
17.          // Ambil penanda waktu saat ini 
18.          struct timeb current_timestamp; 
19.          ftime(&current_timestamp); 
20.   
21.          // Selisih waktu terakhir dengan waktu sekarang dalam ms 
22.          int interval = 1000 * (current_timestamp.time - last_timestamp.time) + (current_timestamp.millitm - last_timestamp.millitm); 
23.   
24.          // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed) 
25.          // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu  
26.          // terakhir kali snake bergerak. 
27.          if (interval >= snake_speed) { 
28.              // Tentukan posisi x,y ke mana snake akan bergerak. 
29.              int x, y; 
30.              x = snake[0].x + 1; 
31.              y = snake[0].y;
32.    
33.              // Pop ekor, lalu push segment ke depan head sehingga  
34.              // snake tampak bergerak maju.  
35.              pop(); 
36.              push(x, y);
37.   
38.              // Perbarui penanda waktu 
39.              last_timestamp = current_timestamp;
40.          }
41.   
42.          // Tampilkan kondisi permainan saat ini di layar... 
43.   
44.          // Bersihkan layar 
45.          system("cls"); 
46.   
47.          // Cetak (render) snake di layar 
48.          display(); 
49.      }
50.   
51.      ...
52.  }

Coba jalankan lagi. Sekarang ular sudah bisa bergerak!
Tapi layar tampaknya berkedip-kedip. Hal ini terjadi karena program mencoba mengosongkan layar dengan system(“cls”); sebelum menggambar lagi. Umumnya pembuat game akan melakukan teknik double buffering untuk menghindari layar berkedip (flicker). Namun untuk menyederhanakan tutorial ini, kita akan lakukan pendekatan lain, yaitu dengan me-render ulang layar hanya ketika ular bergerak. Sehingga rendering hanya terjadi setiap 200ms sekali (5 FPS).
Caranya mudah, kita pindahkan baris-baris rendering ke dalam blok if(interval >= snake_speed) { } (lihat baris 30-37).

1.      /** 
2.          Program utama 
3.       */ 
4.      int main() { 
5.          ...
6.       
7.          // Game loop. Bagian di dalam while akan dieksekusi terus menerus 
8.          while (true) { 
9.              // Ambil penanda waktu saat ini 
10.          struct timeb current_timestamp; 
11.          ftime(&current_timestamp); 
12.   
13.          // Selisih waktu terakhir dengan waktu sekarang dalam ms 
14.          int interval = 1000 * (current_timestamp.time - last_timestamp.time) + (current_timestamp.millitm - last_timestamp.millitm); 
15.   
16.          // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed) 
17.          // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu  
18.          // terakhir kali snake bergerak. 
19.          if (interval >= snake_speed) { 
20.              // Tentukan posisi x,y ke mana snake akan bergerak. 
21.              int x, y; 
22.              x = snake[0].x + 1; 
23.              y = snake[0].y;
24.    
25.              // Pop ekor, lalu push segment ke depan head sehingga  
26.              // snake tampak bergerak maju.  
27.              pop(); 
28.              push(x, y); 
29.   
30.              // Tampilkan kondisi permainan saat ini di layar... 
31.   
32.              // Bersihkan layar 
33.              system("cls"); 
34.   
35.              // Cetak (render) snake di layar 
36.              display();
37.   
38.              // Perbarui penanda waktu 
39.              last_timestamp = current_timestamp;
40.          }
41.      }
42.   
43.      ...
44.  }

 

Mengontrol Arah Gerakan Ular

Untuk bisa mengontrol arah gerakan ular, kita membuat sebuah variabel global tambahan bernamadir. Variabel ini memberitahu arah push() berikutnya, apakah ke kanan, bawah, kiri, atau atas. Arah ini akan ditentukan berdasarkan input tombol panah yang ditekan.
Pertama-tama, buat variabel global dir, dengan nilai awal ke arah kanan. VK_RIGHT adalah konstanta berisi kode untuk tombol panah kanan.

1.      // Arah kepala saat awal permainan 
2.      int dir = VK_RIGHT;
Sekarang kita modifikasi penentuan nilai x dan y untuk melakukan push() berdasarkan variabel dir. Lalu di dalam game loop, dilakukan juga pengecekan tombol yang sedang ditekan. Jika merupakan salah satu dari empat tombol panah di keyboard, maka ubah nilai dir (lihat baris 17-37, 56-73).
1.      /** 
2.          Program utama 
3.       */ 
4.      int main() { 
5.          ...
6.       
7.          // Game loop. Bagian di dalam while akan dieksekusi terus menerus 
8.          while (true) { 
9.       
10.          ...
11.   
12.          // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed) 
13.          // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu  
14.          // terakhir kali snake bergerak. 
15.          if (interval >= snake_speed) { 
16.              // Tentukan posisi x,y ke mana snake akan bergerak.  
17.              // Posisi dilihat dari koordinat segment kepala (head)  
18.              // dan arah (variable dir)
19.              int x, y;  
20.              switch (dir) { 
21.              case VK_LEFT: 
22.                  x = snake[0].x - 1; 
23.                  y = snake[0].y; 
24.                  break; 
25.              case VK_RIGHT: 
26.                  x = snake[0].x + 1; 
27.                  y = snake[0].y; 
28.                  break; 
29.              case VK_UP: 
30.                  x = snake[0].x; 
31.                  y = snake[0].y - 1; 
32.                  break; 
33.              case VK_DOWN: 
34.                  x = snake[0].x; 
35.                  y = snake[0].y + 1; 
36.                  break; 
37.              }
38.    
39.              // Pop ekor, lalu push segment ke depan head sehingga  
40.              // snake tampak bergerak maju.  
41.              pop(); 
42.              push(x, y); 
43.   
44.              // Tampilkan kondisi permainan saat ini di layar... 
45.   
46.              // Bersihkan layar 
47.              system("cls"); 
48.   
49.              // Cetak (render) snake di layar 
50.              display(); 
51.   
52.              // Perbarui penanda waktu 
53.              last_timestamp = current_timestamp;
54.          }
55.   
56.          // Ubah arah jika tombol panah ditekan 
57.          if (GetKeyState(VK_LEFT) < 0) { 
58.              dir = VK_LEFT; 
59.          } 
60.          if (GetKeyState(VK_RIGHT) < 0) { 
61.              dir = VK_RIGHT; 
62.          } 
63.          if (GetKeyState(VK_UP) < 0) { 
64.              dir = VK_UP; 
65.          } 
66.          if (GetKeyState(VK_DOWN) < 0) { 
67.              dir = VK_DOWN; 
68.          } 
69.   
70.          // Keluar dari program jika menekan tombol ESC 
71.          if (GetKeyState(VK_ESCAPE) < 0) { 
72.              return 0; 
73.          }
74.      }
75.   
76.      ...
77.  }

Kita juga bisa menambahkan pengecekan untuk keluar dari program jika pemain menekan tombol ESC.
Coba jalankan lagi program, sekarang kita bisa menggerakan ular dengan bebas

Collision Detection

Salah satu aspek yang penting dalam permainan ini adalah pengecekan apakah kepala ular bertabrakan dengan dinding atau dirinya sendiri. Di sini kita bisa melakukan pengecekan saat program memeroleh posisi x dan y yang baru, sebelum melakukan pop() dan push().
Jika posisi x berada di luar batasan 0-79 (panjang console) atau posisi y berada diluar batasan 0-24 (tinggi console), maka ular telah menabrak dinding, dan permainan berakhir. Sama seperti sebelum-sebelumnya, untuk nilai panjang dan lebar console bisa kita simpan di variabel global console_widthdan console_height.

1.      // Panjang console 
2.      int console_width = 80; 
3.       
4.      // Tinggi console 
5.      int console_height = 25;
Pengecekan berikutnya yaitu mengecek apabila posisi x dan y sama dengan posisi salah satu node, yang artinya ular menabrak dirinya sendiri. Untuk mengeceknya, kita buat fungsi check_collision().

1.      /** 
2.          Memeriksa apakah terdapat salah satu segment 
3.          snake (array) di koordinat x,y. 
4.          Return 0 artinya tidak bertumpuk, 1 artinya bertumpuk. 
5.       */ 
6.      int check_collision(int x, int y) { 
7.          for(int i = 0; i < length; i++) {
8.              if (snake[i].x == x && snake[i].y == y) { 
9.                  return 1; 
10.          } 
11.      } 
12.      return 0; 
13.  }

Berikut ini baris-baris yang ditambahkan di main() untuk melakukan pengecekan tadi, serta tambahan baris yang dilakukan di luar game loop, setelah permainan berakhir (game over) (lihat baris 18-32, 44-48).

1.      /** 
2.          Program utama 
3.       */ 
4.      int main() { 
5.          ...
6.       
7.          // Game loop. Bagian di dalam while akan dieksekusi terus menerus 
8.          while (true) { 
9.       
10.          ...
11.          // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed) 
12.          // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu  
13.          // terakhir kali snake bergerak. 
14.          if (interval >= snake_speed) { 
15.   
16.              ...
17.   
18.              // Jika posisi kepala (head) menabrak tembok pembatas,  
19.              // maka permainan berakhir (keluar dari game loop) 
20.              if (x < 0 || x >= console_width || y < 0 || y >= console_height) { 
21.                  break; 
22.              } 
23.   
24.              // Jika posisi kepala (head) menabrak dirinya sendiri 
25.              // (posisi sama dengan salah satu segment), maka permainan  
26.              // berakhir (keluar dari game loop) 
27.              if (check_collision(x, y) == 1) { 
28.                  break; 
29.              } 
30.               
31.              // Jika tidak terjadi tabrakan (collision), maka snake  
32.              // boleh bergerak maju.. 
33.              // Pop ekor, lalu push segment ke depan head sehingga  
34.              // snake tampak bergerak maju.  
35.              pop(); 
36.              push(x, y); 
37.   
38.              // Tampilkan kondisi permainan saat ini di layar... 
39.              ...
40.          }
41.          ...
42.      }
43.   
44.      // Setelah keluar dari game loop, berarti permainan berakhir (game over) 
45.      system("cls"); 
46.      printf("GAME OVER\n"); 
47.   
48.      printf("Press ENTER to exit..."); 
49.      getchar(); 
50.      return 0;
51.  }

Jalankan program sekali lagi, lalu coba arahkan ular ke dinding. Untuk pengetesan tabrakan terhadap diri sendiri, bisa dilakukan dengan mengubah snake_size dengan nilai yang lebih besar, agar ular cukup panjang untuk menabrak dirinya sendiri.


Tampilan layar saat terjadi tabrakan. Permainan berakhir.

Makanan!!!

Ini adalah bagian terakhir dari tutorial ini, makanan! Ular perlu melahap makanan untuk menjadi lebih panjang. Untuk itu, kita perlu menempatkan makanan di koordinat acak. Untuk menaruh koordinat makanan, kita tambahkan dua variabel global food_x dan food_y.

1.      // Posisi makanan
2.      int food_x, food_y;

Meskipun makanan ditaruh secara acak, ada dua hal yang perlu diperhatikan:
  1. Makanan harus berada di dalam layar console berukuran 80×25.
  2. Makanan tidak boleh bertumpuk dengan ular saat ditempatkan.
Maka dari itu, kita buat sebuah fungsi place_food() untuk menaruh makanan dengan memerhatikan kedua syarat tersebut. Untuk syarat nomor 2, kita bisa memanfaatkan fungsi check_collision() yang baru saja dibuat.

1.      /**
2.          Taruh makanan secara acak, namun memastikan 
3.          makanan tidak bertumpuk dengan salah satu segment 
4.          snake (array)
5.       */
6.      void place_food() {
7.          // Jika makanan bertumpuk dengan salah satu segment
8.          // snake, ulangi penempatan makanan secara acak.
9.          do {
10.          food_x = rand() % console_width;
11.          food_y = rand() % console_height;
12.      } while (check_collision(food_x, food_y) == 1);
13.  }

Di awal program sebelum memasuki game loop, kita menempatkan makanan pertama. Berikutnya, makanan akan ditempatkan ulang jika posisi x dan y baru dari ular sama dengan koordinat makanan, yang artinya ular memakan makanan. Dalam hal ini, kita hanya melakukan push() tanpa melakukanpop(), sehingga jumlah elemen bertambah.
Jangan lupa pula untuk melakukan rendering makanan di layar.
Di samping itu, kita juga bisa menerapkan sistem penilaian, misalnya nilai bertambah 100 jika ular memakan makanan. Lalu pada akhir permainan (saat game over), nilai yang sudah terkumpul ditampilkan kepada pemain.
(Lihat baris 5-6, 12-13, 21-22, 41-53, 64-67, 80)
1.      /**
2.          Program utama
3.       */
4.      int main() {
5.          // Randomize
6.          srand(time(NULL));
7.       
8.          // Untuk menyimpan penanda waktu saat snake bergerak
9.          struct timeb last_timestamp;
10.      ftime(&last_timestamp); // Set nilai awal
11.   
12.      // Untuk menyimpan nilai
13.      int score = 0;
14.   
15.      // Pertama-tama, push segment (node) ke kanan 
16.      // sebanyak 3 segment (sesuai nilai variable snake_size)
17.      for (int i = 0; i < snake_size; i++) {
18.          push(i, 0);
19.      }
20.   
21.      // Tempatkan makanan secara acak
22.      place_food();
23.   
24.      // Game loop. Bagian di dalam while akan dieksekusi terus menerus
25.      while (true) {
26.   
27.          ...
28.   
29.          // Snake bergerak setiap 500 ms (sesuai nilai variable snake_speed)
30.          // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu 
31.          // terakhir kali snake bergerak.
32.          if (interval >= snake_speed) {
33.   
34.              ...
35.   
36.              // Jika tidak terjadi tabrakan (collision), maka snake 
37.              // boleh bergerak maju..
38.   
39.              // Pop ekor, lalu push segment ke depan head sehingga 
40.              // snake tampak bergerak maju. 
41.              // Namun jika posisi x,y ke mana kepala (head) snake akan 
42.              // bergerak berada di posisi makanan, tidak perlu pop 
43.              // sehingga segment bertambah panjang. 
44.              if (x == food_x && y == food_y) {
45.                  // Dalam hal snake memakan makanan, maka nilai bertambah
46.                  score += 100;
47.   
48.                  // Lalu makanan ditempatkan ulang secara acak
49.                  place_food();
50.              }
51.              else {
52.                  pop();
53.              }
54.              push(x, y);
55.    
56.              // Tampilkan kondisi permainan saat ini di layar...
57.   
58.              // Bersihkan layar
59.              system("cls");
60.   
61.              // Cetak (render) snake di layar
62.              display();
63.   
64.              // Cetak (render) makanan di layar
65.              gotoxy(food_x, food_y);
66.              printf("X");
67.   
68.              // Perbarui penanda waktu
69.              last_timestamp = current_timestamp;
70.          }
71.   
72.          ...
73.   
74.      }
75.   
76.      // Setelah keluar dari game loop, berarti permainan berakhir (game over)
77.      // Tampilkan nilai yang diraih pemain
78.      system("cls");
79.      printf("GAME OVER\n");
80.      printf("Your score : %d\n\n", score);
81.   
82.      printf("Press ENTER to exit...");
83.      getchar();
84.   
85.      ...
86.   
87.  }
Selesai! Uji coba program untuk terakhir kalinya, dan game sudah siap dimainkan!

Layar game over menunjukkan permainan berakhir beserta nilai yang diperoleh.

StoryBoard


Referensi         :





Sabtu, 25 April 2015

Soal beserta penjelasan Graf and Tree


Sebuah pohon mempunyai 2n buah simpul berderajat 1, 3n buah simpul berderajat 2 dan n buah simpul berderajat 3.  Tentukan banyaknya simpul dan sisi di dalam pohon tersebut !

     Jawab:
               Berdasarkan lemma jabat tangan :
               jumlah semua simpul di dalam graf adalah 2 kali jumlah sisi di dalam graf tersebut
                    (2n x 1) + (3n x 2) + (n x 3) = 2 |E|
                                           11n = 2 |E| ……           (1)
               Jumlah sisi pada sebuah pohon adalah jumlah simpul minus satu, sehingga :
                     |E| = (2n + 3n + 1) – 1 = 6n – 1 …… (2)
               Persamaan (1) dan (2) menjadi :
                     11n = 2 (6n – 1)
                     11n = 12n – 2
                         n = 2
                Jadi :
                       Jumlah simpul pada pohon 6n = 6 x 2 = 12 buah simpul
                       Jumlah sisi 6n – 1 = 11 buah sisi










Nomor 2:

Tentukan bobot minimum pohon dibawah dengan menggunakan algoritma Prim : 


Tabel Pembentukan Pohon Merentang Minimum Dengan Menggunakan Algoritma Prim


Bobot pohon merentang minimum yang diperoleh dengan menggunakan algoritma Prim:                             
             10 + 25 + 15 + 20 + 35 = 105












Nomor 3:

Selesaikan dan tentukan bobot minimum dengan menggunakan algoritma Kruskal :


Sisi-sisi graf diurut menaik berdasarkan bobotnya :


Tabel Pembentukan Pohon Merentang Minimum Dengan Menggunakan Algoritma Kruskal




Bobot pohon merentang minimum yang diperoleh dengan menggunakan algoritma Kruskal :
                            
 10 + 25 + 15 + 20 + 35 = 105










Nomor 4 :

Kita akan menyambungkan 19 buah lampu pada satu stop kontak dengan menggunakan sejumlah kabel ekstensi yang masing-masing mempunyai 4 outlet.

Penyelesaian :
Diketahui : t = 19 Ã  banyaknya simpul daun
    m = 4 Ã  pohon 4-ary
Karena penyambungan merupakan pohon 4-ary dengan stop kontak sebagai akar pohon, maka :
                                    (m – 1) i = t – 1
                                    (4 – 1) i = 19 -1
                                                i = 6
            Jadi dibutuhkan 6 buah kabel ekstensi










Nomor 5 :

Diketahui 8 buah koin uang logam. Satu dari delapan koin ternyata palsu. Koin yang palsu mungkin lebih ringan atau lebih berat daripada koin yang palsu. Misalkan tersedia sebuah timbangan neraca yang sangat teliti. Buatlah pohon keputusan untuk mencari uang palsu dengan cara menimbang paling banyak hanya 3 kali saja!


Penyelesaian :
Misalkan 8 koin itu dinamai a,b,c,d,e,f,g,h. Daun menyatakan koin yang palsu. Pohon keputusan untuk mencari koin yang palsu ditunjukkan sbb :

Selasa, 06 Januari 2015

APLIKASI NEW MEDIA LINE

LINE
Line adalah sebuah aplikai pengiriman pesan instan gratis yang dapat digunakan pada berbagai platform seperti smartphone, tablet dan computer yang di fungsikan dengan menggunakan jaringan internet. Line dapat melakukan aktivitas seperti mengirimkan pesan teks, mengirimkan gambar, video dan pesan suara.
Aplikasi Line hanya dapat digunakan pada smartphoe seperti android, iOS,dan blackberry.
Line dibuat dengan tujuan awal untuk menolong pria yang tidak bisa mengungkapkan kata- kata kepada wanita, sehingga dengan adanya line pengguna bisa bertukar stiker tanpa harus mengungkapkan dengan kata- kata. Line tidak sekadar menawarkan instant messaging, karena pada kenyataanya pengguna bisa menelpon sesama anggota Line dengan berbasis VoiP (Voice Internet Protocol). Ini yang sedikit membedakan Line dengan layanan sejenis, pengguna bisa melakukan switch ke PC.
Line ini memiliki beberapa kelebihan dibandingkan dengan aplikasi yang hampir sama dengan Line yaitu:
  1. Line dapat diinstal di computer
  2. Merupakan aplikasi lintas platform
  3. Line adalah aplikasi pertama yang menyediakan fasilitas telepon gratis ke sesame pengguna line
  4. Bentuk stiker/ emoticon yang lebih bervariasi dan lebih dapat menggambarkan kondisi yang ingin diungkapkan sang pengguna
  5. Line juga memiliki fasilitas bloked list sehingga kita bisa memblok user yang tidak kita inginkan untuk menjadi friend di Line kita
Selain memiliki kelebihan, line ini juga memiliki beberapa kekurangan yaitu:
  1. Pengguna bisa dengan mudah meng-add akun Line, tanpa perlu di-approve
  2. Koneksi Data dari LINE masih belum terlalu stabil, masih belum sebaik whatsapp dalam mengirim dan menerima data.
  3. Untuk fitur Call akan berjalan lancar jika jalur data minimal 3G/HSDPA.
Berikut Ini adalah video tutorial cara penggunaan aplikasi LINE.

HOBI

Dalam tugas kali ini saya akan membicarakan hobi yang saya sukai dan mungkin tidak akan pernah puas untuk saya lakukan. Saya mempunyai banyak hobi mulai dari membaca novel, main game ,main piano, dan mungkin jailin adik  juga termasuk hobi ya? haha. Tapi untuk kali ini saya akan membicarakan mengenai hobi saya mengelilingi keindahan Negara kelahiran saya yaitu Indonesia yang mungkin tidak akan habisnya untuk diceritakan tentang kemasyuran yang Indonesia miliki.

Awalnya dimulai saat orang tua saya selalu mengajak saya berlibur setiap liburan sekolah mulai dari SD dan berlanjut hingga saya SMA. Pada mulanya biasa saja, tidak ada yang terlalu istimewa dengan pemandangan sekitar saya saat melintas. Namun, seiring saya bertambah dewasa dan setiap hari selalu berkutat dengan kemacetan yang ga ada habisnya di jakarta ,saya mulai merindukan hijaunya pemandangan , rimbunnya pepohonan dan leganya perasaan yang saya dapati saat berlibur. Di pulau Jawa ini hampir semua sudah saya kunjungi dari Puncak hingga Malang dan itu membuat saya keranjingan untuk mengetahui semua keindahan yang ada di Indonesia. Yang hebatnya itu semua bisa saya dapatkan dalam 1 pulau! 

1 pulau saja kita sudah mendapatkan keindahan yang tidak bisa dikatakan dengan kata kata, apalagi bila seluruh Indonesia ini kita jelajahi maka ga perlu ke luar negeri hanya untuk berlibur benar? bukankah lebih baik berlibur di negeri sendiri dari pada negeri orang? bukankah lebih baik rumput sendiri daripada rumput tetangga?. Karena itu saya mempunyai mimpi untuk bisa menjelajahi seluruh Indonesia dan dengan memakai uang saya sendiri,  amin hahahaha

Sekian dulu celotehan dari saya , mohon maaf bila ada salah kata ataupun miss komunikasi.
Terima kasih.... 

Rabu, 26 November 2014

Indonesiaku

Pada kesempatan kali ini saya akan menjelaskan tentang berbagai macam keindahan yang terdapat di Negeri Tercinta yaitu Indonesia. Bila membahas tentang tentang keindahan Indonesia , akan lama untuk menyebutkan satu per satu .Maka , pada kesempatan kali ini saya akan membahas tentang beberapa pulau yang ada di Indonesia.
  1. Pulau Seribu 

Pesona Keindahan Alam Pulau Seribu adalah suatu anugerah yang dipancarkan melalui pesona alam nyata yang tertanam banyak ragam keistimewaan. Pulau indah yang terletak di kawasan Jakarta ini. Dapat membuat suasana pengunjung yang datang menjadi damai, tenang dan kesejukan air laut seolah membuat hati menjadi dingin.
Pulau Seribu ini merupakan salah satu surga dunia yang begitu menakjubkan. Keindahan dasar lautpun memiliki suatu harapan indah yang dapat membuat para pecinta alam kerap selalu menghampiri di kepulauan yang satu ini. Apalagi keindahan terumbu karang yang alami juga siap menjawab keseriusan anda selama berenang dan menelusuri dasar laut. Pesona keindahan alam Pulau Seribu, tidak hanya terdiri dari keindahan pasir putih yang jernih serta air biru yang dimilikinya dapat menyejukkan pandangan mata dikala melihatnya.
Keasrian alamnya tambah diperindah dengan keadaban masyarakat disekitar yang selalu memberikan senyuman lembut kepada para pengunjung yang datang. Sarana dan prasarana yang cukup memadai dapat membuat pengunjung merasa betah. Seperti halnya sarana olahraga, air bersih, rumah sakit, masjid dan lain sebagainya.
Pulau Seribu ini terdiri dari pulau-pulau yang membentuk sebuah gugusan yang menghubungkan pulau satu dan pulau yang lain. Pulau Anyer, Pulau Kotok, Pulau Putri, Pulau Sepa Merupakan sebagian pulau yang terdapat di Kepulauan Seribu
2. Pulau Bali
Pulau Bali atau yang juga dikenal dengan sebutan Pulau Dewata ini sungguh luar biasa pesona keindahannya juga kekayaan budayanya yang masih sangat kental yang melekat pada penduduknya. Tidak heran kalau Pulau Bali sangat terkenal di dunia, dan banyak sekali wisatawan asing yang mengunjunginya. Hingga hampir setiap obyek wisata di Bali selalu dipenuhi oleh wisatawan asing. Banyak juga wisatawan lokal yang sangat tertarik dengan keindahan pulau Bali ini.

Berikut beberapa obyek wisata di Bali yang sangat menarik untuk dikunjungi :
Pantai Kuta
Tempat pariwisata ini merupakan pusat Pariwisata Bali karena sekarang telah mampu menyediakan fasilitas lengkap sesuai kebutuhan para wisatawan seperti berbagai penginapan dan hotel, pusat-pusat perbelanjaan, tempat rekreasi, kehidupan malam begitu semarak, sarana dan fasilitas olahraga seperti Bungy jumping, water boom dan lain sebagainya.
Daya tarik tempat ini yaitu pasir putihnya yang bersih, pemandangan indah dan juga sangat romantis untuk melihat matahari terbenam (sunset), juga ombak pantainya yang tinggi yang menjadi kesukaan para surfer.
Tanah Lot
Tempat wisata ini merupakan salah satu tempat paling menarik di pulau bali yang bisa dikunjungi. Tempat ini terletak di desa Beraban atau 13 km sebelah barat Tabanan. Keunikan tempat ini yaitu adanya pura yang berada di atas bukit batu besar pinggir laut. Tanah Lot terkenal sebagai tempat yang indah untuk melihat matahari terbenam (sunset), turis-turis biasanya ramai pada sore hari untuk melihat keindahan sunset di sini.

Kintamani
Wisata Kintamani di bali ini merupakan tempat wisata yang memiliki udara pegunungan yang sejuk dengan panorama gunung dan danau Batur yang indah. Pesona alamnya yang indah yaitu pemandangan Danau Batur yang merupakan danau terbesar di Bali dan Gunung Batur salah satu Gunung berapi yang masih aktif, yang berdiri di tengah-tengah kaldera membuat daerah ini menjadi salah satu tujuan wisata paling favorit di Bali.

3. Pulau Derawan

Kepulauan Derawan terletak di Laut Sulawesi, di pesisir Kabupaten Berau, Kalimantan Timur dan menghadap ke mulut muara Sungai Kelai dan dikenal dengan Delta Berau. Kepulauan ini terdiri atas enam gugusan pulau besar, yaitu Pulau Derawan, Pulau Sangalaki, Pulau Kakaban, Pulau Maratua, Pulau Panjang, Pulau Samama, serta beberapa pulau kecil dan gugusan karang.
Daerah ini merupakan kawasan laut dan mangrove yang diatur untuk keperluan kegiatan perikanan berkelanjutan, wisata bahari, penelitian, dan pengembangan sosial-ekonomi masyarakat, serta pemanfaatan sumber daya laut lainnya secara lestari.
Belum ada penerbangan langsung untuk menuju kawasan ini. Penerbangan dari Jakarta hanya sampai ke Balikpapan, ganti dengan pesawat kecil ke Tanjung Redeb, ibu kota Kabupaten Berau. Dari Tanjung Redeb menggunakan speedboat menuju Pulau Derawan.
Pulau Derawan terletak di Kepulauan Derawan, Kecamatan Derawan, Kabupaten Berau, Kalimantan Timur Satuan morfologi Pulau Derawan adalah dataran pantai bertopografi datar. Pantai pasir memiliki kemiringan lereng sekitar 7° – 11° dengan lebar 13,5 – 20 meter.
Kawasan wisata laut dan konservasi yang dikembangkan menjadi wisata selam ini terkenal dengan terumbu karangnya yang sangat indah. Dengan menggunakan snorkel anda bisa menikmati keindahan terumbu karang di bawah laut karena airnya sangat bening.
Tidak perlu jauh-jauh ke tengah laut, sekitar 100 meter dari bibir pantai, ikan dan terumbu karang beraneka warna sudah bisa dinikmati.
Rangkaian Kepulauan Derawan yang terbentang lebih dari 100mil sepanjang garis pantai Kalimantan Timur, merupakan salah satu daerah yang paling kaya secara biologis di Indonesia.
Di kepulauan ini air dari Sungai Berau bercampur dengan air dari Laut Sulawesi menciptakan suatu bentang laut yang unik dengan ciri sebuah delta sungai yang lebar menuju ke gosong karang yang tersebar, terumbu karang tepi dan atol.
Di Kepulauan Derawan terdapat lebih dari 460 jenis karang. Hal ini menjadikan Kepulauan Derawan sebagai daerah yang memiliki keragaman karang keras tertinggi nomor dua di dunia setelah Kepulauan Raja Ampat di Indonesia bagian Timur.
Beberapa gugus karang, seperti Moras, Lintang, Malalangun, Gasongan, Baliulin dan Masimbung juga terdapat di Kepulauan Derawan.

Demikianlah sebagian kecil dari pulau pulau menakjubkan dari Indonesia, dan masih banyak pulau di Indonesia yang belum di eksplore keindahannya. Maka dari itu kita sebagai orang Indonesia haruslah bangga akan kekayaan negeri sendiri dan berusaha untuk membuat negeri tercinta ini tetap asri

Selasa, 25 November 2014

SYNTHESIA


·         Fungsi

            Sythesia merupakan program yang memungkinkan anda untuk belajar piano secara otodidak/sendiri menggunakan keyboard sebagai pengganti not baloknya. Pada program synthesia ini kita dapat memainkan dan belajar dengan file music yang berformat MIDI, karena selain format itu maka tidak dapat digunakan.Untuk diketahui bahwa synthesia merupakan program yang tergolong sangat ringan , Karena untuk menjalankannya yang diperlukan hanya membutuhkan processor 1 GHz dan memory 20 MB, lalu processor pun harus memiliki grafis dengan akselerasi 3D hardware. Synthesia dapat berjalan menggunakan Windows XP, Vista, 7 dan Mac OS. Ini merupakan tampilan awal saat masuk pada synthesia :
·         FITUR-FITUR
Fitur-fitur yang dimiliki synthesia bias dikatakan banyak, mulai dari dapat memasukkan file music baru dan memainkannya, mengetahui seberapa besar perkembangan/progress anda dalam menguasai piano
1.      Play a song
Pada fitur ini anda akan menemukan berbagai tingkatan kesukaran dalam memainkan piano, mulai dari easiest, easier, easy, medium, hard, harder, keyboard classic dan scale exercise
2.      Add more songs
Pada fitur ini adalah fitur untuk menambahkan lagu/songs yang kita inginkan agar dapat kita mainkan

Ini adalah tampilan saat kita memainkan synthesia :


·         CARA KERJA
Cara kerja sythesia sangat mudah, yang sangat pertama pasti kita harus mendownload aplikasi synthesia terlebih dahulu, setelah itu buka aplikasi synthesia ,lalu klik play a songs dan pilih lagu yang akan dimainkan dan setelah itu maka mainkan piano anda !

reverensi : 
 https://berbagitnt.wordpress.com/2012/01/28/synthesia/
http://kepoblogg.blogspot.com/2013/03/bermain-keyboard-menggunakan-synthesia.html