Rabu, 30 Maret 2016

Konsep Pembuat Scripting Game





Konsep Pembuatan Scripting pada Game


Pengantar Teknologi Game

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.
  1. 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 :
1
  1. 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.
  1. 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. Struktur untuk menampung data tiap segment dari snake 
  4. (array)
  5. */
  6. struct Segment {
  7. int x, y;
  8. };
Kita tambahkan dua variabel global, yaitu array snake, dan length untuk menyimpan panjangnya.
  1. /** Variabel global **********/
  2. // Array untuk menampung data ular
  3. struct Segment snake[2000];
  4. // Variabel untuk menyimpan panjang ular (array snake)
  5. 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. Push segment ke snake (pada bagian head).
  4. */
  5. void push(int x, int y) {
  6. for(int i = length; i > 0; i–) {
  7. snake[i] = snake[i-1];
  8. }
  9. snake[0].x = x;
  10. snake[0].y = y;
  11. length++;
  12. }
  13. /**
  14. Pop bagian ekor snake.
  15. */
  16. void pop() {
  17. length–;
  18. }

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

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. Gambar snake (array) di layar
  13. */
  14. void display() {
  15. for(int i = 0; i < length; i++) {
  16. // Cetak di posisi x,y
  17. gotoxy(snake[i].x, snake[i].y);
  18. printf(“O”);
  19. }
  20. }
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. // Tampilkan kondisi permainan saat ini di layar…
  11. // Bersihkan layar
  12. system(“cls”);
  13. // Cetak (render) snake di layar
  14. display();
  15. getchar();
  16. return 0;
  17. }

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

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. // Game loop. Bagian di dalam while akan dieksekusi terus menerus
  6. while (true) {
  7. // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed)
  8. // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu 
  9. // terakhir kali snake bergerak.
  10. if (interval >= snake_speed) {
  11. // Tentukan posisi x,y ke mana snake akan bergerak. 
  12. // Posisi dilihat dari koordinat segment kepala (head) 
  13.  // dan arah (variable dir)
  14. int x, y; 
  15. switch (dir) {
  16. case VK_LEFT:
  17. x = snake[0].x – 1;
  18. y = snake[0].y;
  19. break;
  20. case VK_RIGHT:
  21. x = snake[0].x + 1;
  22. y = snake[0].y;
  23. break;
  24. case VK_UP:
  25. x = snake[0].x;
  26. y = snake[0].y – 1;
  27. break;
  28. case VK_DOWN:
  29. x = snake[0].x;
  30. y = snake[0].y + 1;
  31. break;
  32. }
  33. // Pop ekor, lalu push segment ke depan head sehingga 
  34. // snake tampak bergerak maju.  
  35. pop();
  36. push(x, y);
  37. // Tampilkan kondisi permainan saat ini di layar…
  38. // Bersihkan layar
  39. system(“cls”);
  40. // Cetak (render) snake di layar
  41. display();
  42. // Perbarui penanda waktu
  43. last_timestamp = current_timestamp;
  44.  }
  45.  // Ubah arah jika tombol panah ditekan
  46. if (GetKeyState(VK_LEFT) < 0) {
  47. dir = VK_LEFT;
  48. }
  49. if (GetKeyState(VK_RIGHT) < 0) {
  50. dir = VK_RIGHT;
  51. }
  52. if (GetKeyState(VK_UP) < 0) {
  53. dir = VK_UP;
  54. }
  55. if (GetKeyState(VK_DOWN) < 0) {
  56. dir = VK_DOWN;
  57. }
  58. // Keluar dari program jika menekan tombol ESC
  59. if (GetKeyState(VK_ESCAPE) < 0) {
  60. return 0;
  61. }
  62. }
  63. }
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. // Tinggi console
  4. 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. return 0;
  12. }
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. // Game loop. Bagian di dalam while akan dieksekusi terus menerus
  6. while (true) {
  7. // Snake bergerak setiap 200 ms (sesuai nilai variable snake_speed)
  8. // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu 
  9. // terakhir kali snake bergerak.
  10. if (interval >= snake_speed) {
  11. // Jika posisi kepala (head) menabrak tembok pembatas, 
  12. // maka permainan berakhir (keluar dari game loop)
  13. if (x < 0 || x >= console_width || y < 0 || y >= console_height) {
  14. break;
  15. }
  16. // Jika posisi kepala (head) menabrak dirinya sendiri
  17. // (posisi sama dengan salah satu segment), maka permainan  
  18. // berakhir (keluar dari game loop)
  19. if (check_collision(x, y) == 1) {
  20. break;
  21. }
  22. // Jika tidak terjadi tabrakan (collision), maka snake  
  23. // boleh bergerak maju..
  24. // Pop ekor, lalu push segment ke depan head sehingga  
  25. // snake tampak bergerak maju.  
  26. pop();
  27. push(x, y);
  28. // Tampilkan kondisi permainan saat ini di layar…
  29. }
  30. }
  31. // Setelah keluar dari game loop, berarti permainan berakhir (game over)
  32. system(“cls”);
  33. printf(“GAME OVER\n”);
  34. printf(“Press ENTER to exit…”);
  35. getchar();
  36. return
  37. }
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.
3
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. }
  13. while (check_collision(food_x, food_y) == 1);
  14. }
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. // Untuk menyimpan penanda waktu saat snake bergerak
  8. struct timeb last_timestamp;
  9. ftime(&last_timestamp); // Set nilai awal
  10. // Untuk menyimpan nilai
  11. int score = 0;
  12. // Pertama-tama, push segment (node) ke kanan 
  13. // sebanyak 3 segment (sesuai nilai variable snake_size)
  14. for (int i = 0; i < snake_size; i++) {
  15. push(i, 0);
  16. }
  17. // Tempatkan makanan secara acak
  18. place_food();
  19. // Game loop. Bagian di dalam while akan dieksekusi terus menerus
  20. while (true) {
  21. // Snake bergerak setiap 500 ms (sesuai nilai variable snake_speed)
  22. // Dihitung dengan membandingkan selisih waktu sekarang dengan waktu 
  23. // terakhir kali snake bergerak.
  24. if (interval >= snake_speed) {
  25. // Jika tidak terjadi tabrakan (collision), maka snake 
  26. // boleh bergerak maju..
  27. // Pop ekor, lalu push segment ke depan head sehingga 
  28. // snake tampak bergerak maju. 
  29. // Namun jika posisi x,y ke mana kepala (head) snake akan 
  30. // bergerak berada di posisi makanan, tidak perlu pop 
  31. // sehingga segment bertambah panjang. 
  32. if (x == food_x && y == food_y) {
  33. // Dalam hal snake memakan makanan, maka nilai bertambah
  34. score += 100;
  35. // Lalu makanan ditempatkan ulang secara acak
  36. place_food();
  37. }
  38. else {
  39. pop();
  40. }
  41. push(x, y);
  42. // Tampilkan kondisi permainan saat ini di layar…
  43. // Bersihkan layar
  44. system(“cls”);
  45. // Cetak (render) snake di 
  46. display();
  47. // Cetak (render) makanan di layar
  48. gotoxy(food_x, food_y);
  49. printf(“X”);
  50. // Perbarui penanda waktu
  51. last_timestamp = current_timestamp;
  52. }
  53. }
  54. // Setelah keluar dari game loop, berarti permainan berakhir (game over)
  55. // Tampilkan nilai yang diraih pemain
  56. system(“cls”);
  57. printf(“GAME OVER\n”);
  58. printf(“Your score : %d\n\n”, score);
  59. printf(“Press ENTER to exit…”);
  60. getchar();
  61. }
Selesai! Uji coba program untuk terakhir kalinya, dan game sudah siap dimainkan!
4
Layar game over menunjukkan permainan berakhir beserta nilai yang diperoleh.

StoryBoard
5

Referensi         :

Jumat, 24 April 2015

Soal Latihan Graf and Tree

Nomor 1:

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

Tutorial Skype

Halo... kali ini gw bakal bikinin sedikit video tutorial singkat tentang cara menggunakan skype... kenapa gw pilih aplikasi ini?? karena setelah banyak mempertimbangkan, bagi saya skype adalah aplikasi yang sedang sangat berkembang di kalangan remaja saat ini, dan skype juga merupakan aplikasi yang tidak memiliki banyak fitur, jadi tidak membingung kan pengguna nya.

sedikit penjelasan tentang skype :

Skype adalah sebuah program komunikasi dengan teknologi P2P (peer to peer). Program ini merupakan program bebas (dapat diunduh gratis) dan dibuat dengan tujuan penyediaan sarana komunikasi suara (voice) berkualitas tinggi yang murah berbasiskan internet untuk semua orang di berbagai belahan dunia. Pengguna Skype dapat berbicara dengan pengguna Skype lainnya dengan gratis, menghubungi telepon tradisional dengan biaya (skypeOut), menerima panggilan dari telepon tradisional (SkypeIn), dan menerima pesan suara. Teknologi skype ditemukan oleh wirausahawan Niklas Zennström dan Janus Friis, orang yang sama yang menemukan Kazaa dan Joost (P2P untuk televisi). Skype lalu berkompetisi dengan protokol terbuka VoIP yang sudah ada seperti SIP, IAX, dan H.323. Grup Skype yang dibentuk pada bulan September 2003 lalu dibeli oleh perusahaan lelang internet raksasa di Amerika e-Bay pada bulan September 2005 dan bermarkas di Luxembourg, Jerman dengan kantor-kantor di London, Inggris, Praha, Rusia dan San Jose, California, A.S.
Sejak diluncurkan skype telah mengalami pertumbuhan pesat baik dari penggunaannya yang populer maupun pengembangan perangkat lunaknya, jasa yang ditawarkan pun menjadi beragam mulai dari penggunaan gratis maupun berbayar.
Hanya dalam beberapa tahun saja pada bulan April 2006 Skype memiliki 100 juta pengguna.

Keunggulan

  1. Komunikasi global dan lokal yang lebih ekonomis melalui suara atau konferensi video. Sebagai ilustrasi pada tahun 2007 perbandingan menelpon ke Amerika dari Indonesia adalah Rp.6,640,-/ menit sedangkan dengan menggunakan skype, aktivitas ini didapatkan gratis (untuk sesama pengguna skype) dan berbayar bila skype digunakan untuk menelpon ke pesawat telpon genggam: Rp. 1,593/ menit atau pesawat telpon rumah: Rp. 423/ menit  Komunikasi menjadi lebih murah dan terjangkau. Konferensi bisa dilangsungkan antar pengguna (dua orang) sampai dengan lima pengguna sekaligus.
  2. Penggunaannya yang mudah. Untuk pengguna yang telah biasa menggunakan pengirim-penerima pesan instan internet, perangkat lunak skype akan dirasakan mudah. Pengguna hanya diharuskan untuk memiliki komputer dengan spesifikasi teknis tertentu, headset (yang memiliki mike dan speaker), serta sambungan internet.
  3. Kualitas suara yang lebih baik dibandingakan VoIP pendahulunya. Kegunaan dasar pembicaraan telepon melalui komputer di mana pun pengguna berada (dengan koneksi internet) secara gratis.

Kualitas Suara Lebih Baik
Dalam hal kualitas suara yang lebih baik, hal ini mungkin terjadi karena tim kerja Skype telah berhasil mengontrol sumberdaya- sumberdaya yang tersedia pada jaringan. Sehingga meningkatkan keberhasilan panggilan dan kualitas pada jaringan Skype melebihi tingkat POTS (Plain Old Telephony System: Sistem Telepon Tua Biasa) tanpa menggunakan pemusatan sumberdaya yang mahal. Dengan menyederhanakan perangkat lunaknya, sistem ini memungkinkan pengaplikasian yang mudah oleh siapapun.

Traversal Firewall dan NAT
Klien-klien yang tidak menggunakan firewall dan klien-klien yang sudah berada pada alamat-alamat IP publik yang terarah dapat membantu “ujung-penghubung” dari NAT berkomunikasi dengan mengarahkan panggilan. Hal ini memungkinkan dua klien yang awalnya tidak bisa berkomunikasi untuk berbicara satu sama lainnya, karena sinyal panggilan di terjemahkan pada pengguna akhir yang satu dan pengguna akhir lainnya, sehingga kekhawatiran akan risiko keamanan atau privasi dapat diatasi. Bersamaan dengan hal ini, hanya proxi-proxi yang memiliki “jatah” berlebih yang dipilih sehingga performa pada penggunanya tidak terganggu. Beberapa teknik baru telah dikembangkan untuk menghindari konfigurasi firewall dan gateway pada pengguna akhir, dimana setting konfigurasi yang tidak sensitif biasanya menghambat mayoritas pengguna dalam berkomunikasi. Singkatnya, Skype bekerja di belakang mayoritas firewall dan gateway tanpa menggunakan konfigurasi khusus.

Data dan alat penerima
Kebanyakan dari pengirim-penerima pesan instan (Instant Messenger) atau perangkat lunak komunikasi memerlukan bentuk data pencari terpusat yang bertujuan agar hubungan antar pengguna akhir berhasil dilakukan, dimana para pengguna akhir ini memiliki nama pengguna statis karena alamat IP-nya cenderung berubah. Perubahan ini terjadi saat pengguna berpindah lokasi atau mencoba menghubungkan diri kembali ke dalam jaringan dengan menggunakan alamat IP dinamis. Kebanyakan dari alat komunikasi yang berbasiskan internet, mencari dan menemukan penggunanya menggunakan sentral informasi (central directory) dimana setiap nama pengguna dan nomor IPnya tercatat dan mencari tahu apakah setiap pengguna sedang dalam jaringan (online) atau tidak. Sentral informasi ini amatlah besar biayanya ketika penggunanya bertambah hingga jutaan, dengan mendesentralisasikan infrastruktur yang memakan banyak sumberdaya ini, skype berhasil memfokuskan sumber dayanya untuk mengembangkan fungsi. Teknologi jaringan P2P yang digunakan oleh aplikasi “berbagi berkas” (file-sharing) sebenarnya hampir cocok untuk digunakan pada jaringan desentralisasi yang digunakan oleh skype, namun jaringan-jaringan ini secara alamiah telah terbagi-bagi. Pencarian tidak dapat menghubungkan seluruh “ujung” yang terdapat di jaringan. Sehingga untuk dapat berkomunikasi dengan kualitas telepon yang baik dengan biaya serendah mungkin, diperlukan pengembangan generasi ketiga dari teknologi P2P (“3G P2P”) atau dikenal juga dengan Indeks Global (Global Index) disingkat IG – hal ini membuktikan sekali lagi pergeseran paradigma pada istilah “jaringan yang mungkin” . Teknologi IG adalah jaringan berlapis-lapis dimana antara penghubung-super (supernones) saling berkomunikasi dengan cara tertentu sehingga setiap penghubung dalam jaringan memiliki pengetahuan penuh akan setiap pengguna yang ada dan sumberdaya yang digunakannya dalam selubung (jeda panggilan) seminimal mungkin.

Pengarah lalu lintas yang pintar
Dengan menggunakan seluruh sumberdaya yang ada, Skype mampu mengarahkan dengan pintar panggilan panggilan yang terkode melalui seluruh jalur efektif yang mungkin dilalui. Skype bahkan memastikan berbagai jalur-jalur penghubung tetap terbuka dan secara dinamis berpindah memilih jalur yang terbaik pada saat itu. Hal ini membuat Skype langsung menjadi perhatian orang karena dampaknya dalam mengurangi jeda sambungan dan peningkatan kualitas panggilan dalam jaringan.

Keamanan
Setiap panggilan dan pesan instan dikodekan oleh Skype pada ujung satu dan lainnya untuk melindungi privasi pengguna. Pengkodean ini perlu karena seluruh panggilan/ pertukaran informasi disalurkan menggunakan fasilitas Internet untuk publik.

Mudah digunakan
Dengan perangkat yang mudah digunakan dan bukan mempersulit pengguna, skype dibuat sesederhana mungkin – semua orang yang dapat menggunakan aplikasi Windows dan telepon karena perangkat lunak ini dapat bekerja dengan baik dengan sistem operasi komputer saku (pocket PC), Windows 2000, Windows XP, Windows Vista, Pocket PC, Mac OS X and Linux .

Kekurangan
  1. Penipuan. Layaknya seluruh hubungan yang dilakukan melalui internet, skype juga memiliki masalah yang sama dengan registrasi identitas penggunanya. Registrasi dapat dilakukan tanpa menyerahkan identitas diri yang sah sehingga sebagai pengguna kita dapat memilih untuk tidak menggunakan nama asli dan di pihak yang sama kita berisiko untuk berkenalan dengan orang tanpa tahu identitasnya. Hal ini rentan terhadap penipuan dan kejahatan-kejahatan lainnya.
  2. Kapasitas yang besar. Skype memakan 23MB kapasitas harddisk ketika dipasang, dibandingkan dengan pengirim pesan instan lainnya seperti Yahoo Messenger yang memakan kapasitas lebih kecil sekitar 10-15 MB.
  3. Terhalang oleh waktu dan kesediaan orang yang memanggil dan yang dipanggil. Penggunaan skype dengan metode suara harus dilakukan dengan rencana sebelumnya seperti membuat janji dengan orang yang dituju, karena apabila orang yang dituju tidak siap (terhalang oleh perbedaan waktu atau kesulitan sambungan Internet) maka niat untuk melakukan komunikasi langsung melalui suara bisa jadi sia-sia.
  4. Tidak ada panggilan darurat dengan Skype. Skype tidak dapat digunakan untuk panggilan darurat.

langsung aja ini link video tutorial nya :
http://youtu.be/MX_O85kZ08g

SUMBER :
http://id.wikipedia.org/wiki/Skype

Senin, 05 Januari 2015

My Hobby

Hmmm.... tugas kali ini menceritakan tentang hobby... gw jujur bingung mau tulis apa... hahaha, karena sebenernya anak hyperactive kaya gw gini punya banyak banget hobby... misalnya dibidang musik, camping/hiking, little bit photograph, berburu, sampe ke mancing pun jadi hobby gw... hahaha, tapi mungkin kali ini gw bahas tentang yang musik dan fotografi aja.

Musik... gw kenal musik baru dari kelas 2 SMP, pertama kali gw belajar musik ya belajar main gitar, tapi sayang nya gw ga di lahirkan buat jadi gitaris... kemampuan gw main gitar gitu2 aja ga pernah berkembang... hahaha, tapi gw ga pernah berenti maenin alat musik ini... terus lanjut di kelas 1 SMA, kelas 1 sma ini gw belajar main biola... dan sama seperti tadi, gw bukan dilahirkan untuk menjadi musisi... jadi skill biola gw ampe sekarang biasa-biasa aja... ga hebat seperti lindsay stirling atau yang lain nya... hahaha. tapi puji Tuhan gw pernah konser biola 1 kali sama tempat gw belajar biola... hasilnya cukup memuaskan, tapi sayang waktu itu ga ada teman, saudara, bahkan keluarga yang sempat dateng buat nonton... hahaha, tapi ga masalah yang penting kan pengalaman nya...




Selanjut nya fotografi... gw ga maniak banget sih sama hobby ini, dan fotografi yang gw hobby in juga bukan kaya alay-alay yang bawa kamera gede potret sana sini tanpa tau apa yang di ambil... ahahaha, maaf kalo ada yang tersinggung.
oke, fotografi gw lebih mengarah ke landscape, yaa gw kan hobby hiking/camping, naah istilah nya sambil menyelam minum air lah... gw sambil travelling sambil nambah koleksi foto gw... selanjutnya gw cerita2 dikit aja ya tentang foto yang pernah gw jepret.


Borobudur



Semua orang juga pasti udah tau dong dengan candi yang sangat megah ini... yaa, ga lain dan ga bukan candi borobudur... foto ini gw ambil kira2 5 tahun lalu, waktu itu kebetulan langit nya lagi indah banget, jadi gw coba abadikan moment candi ini bareng biru nya langit... dan hasil nya ya kaya di atas... mungkin masih amatir banget... hahaha, tapi buat gw... not bad lah... hahaha


Middle of No Where





foto ini di ambil kurang lebih 3 tahun lalu, sesuai judul middle of no where, gw pun ga tau pasti di mana foto ini di ambil... hahaha, yang pasti waktu itu lagi explore gunung salak sama kaka gw, dan kita di pertemukan dengan sungai kecil nan cantik ini... dan sampe sekarang gw gatau persis dimana lokasi sungai ini,,, karena beberapa kali gw explore balik gunung salak tapi gw ga pernah bisa ketemu sama kali cantik ini lagi... sayang waktu itu gw cuma bawa camera pocket, jadi kecantikan nya ga bisa gw abadikan sepenuhnya :(

dan gw juga sisipkan foto hutan pinus waktu di tengah perjalanan... ga ada seni sih cuma asal jepret... hahaha

Bandung White Crater



Yap.... ini adalah kawah putih di bandung,,, sangat susah cari lokasi foto yang bagus buat tempat satu ini... dan ga banyak juga yang bisa di ceritain tentang tempat ini... karena emang udah jadi salah satu destinasi wisata terramai di bandung...

Tangkuban Perahu



Yaa kita masih di bandung, dan ini tangkuban perahu... pasti kalian udah tau kan... jadi gw ga banyak bicara tentang foto ini... hahaha


Desert in Bangka Island



ini salah satu favorit gw.... hahaha, foto ini di ambil 2 taun lalu waktu gw trip ke bangka... kalo yang ini kalian pasti ga tau kan?? hahaha, gw sedikit cerita ya... foto ini gw ambil waktu di pantai pasir padi kep. bangka belitung. kalian pasti bingung kan pantai kok ga ada laut nya nah gw juga bingung... hahaha, tapi sekedar informasi buat kalian, jadi di pulau bangka itu setiap setahun sekali laut nya bakal surut sampe bener-bener tengah... di beberapa pantai bakal jadi padang pasir kaya gini... keren kan?? amazing indonesia...

Lukisan Purba Goa Harimau


nah foto ini gw ambil 4 setengah taun yang lalu waktu gw di sumatera, tepat nya gw lupa dimana... kalo ga salah di batu raja... hahaha, yang pasti waktu itu gw explore 2 goa, yaitu goa putri dan goa harimau... dan gw menemukan sesuatu yang amat menarik, yaa lukisan purba... letak nya ada di dalam goa harimau... dan di dalem goa ini juga ada kerangka manusia purba yang sengaja tidak di angkat dari goa tersebut... tapi gw ga ngambil foto nya, karena bagi gw kurang menarik... bentuk nya persis manusia biasa... hahaha

Goa Putri

Foto ini sama kaya foto diatas, di ambil 4 tahun lalu waktu lagi di sumatera... goa ini goa putri... kalo kata gw sih tempat ini kurang menarik... karena udah terlalu banyak sentuhan tangan manusia dan juga banyak coretan2 dari manusia yang kurang bertanggung jawab... jadi goa nya udah ga asri lagi... sebenernya ada sejarah tentang goa putri ini... cuma gw lupa ceritanya kaya gimana.. hahaha, kalo kalian penasaran browsing google aja ya...

nah demikian sedikit tulisan ga jelas gw tentang hobby... kalo banyak kesalahan dalam penulisan mohon maaf yang sebesar2nya... terima kasih :)