Senin, 23 Mei 2016

Pengantar Teknologi Game

Game Arcade Ball


Initial State

Game Arcade Ball ini meruapakan game modifikasi dari contoh game yang disediakan Strawberry Prolog, dengan judul Horrible Racing. Arcade Ball adalah permainan yang bertujuan untuk menghindari objek yang turun dari atas ke bawah yang objek nya turun di tempat secara random juga kecepatan objek yang turun semakin cepat.
Pada game Arcade Ball yang penulis kembangkan menggunakan latar belakang dan objek yang telah di ubah menjadi konsep bola “ball”. Sama seperti permainan horrible racing, permainan ini harus menghindari runtuhan objek yang turun kebawah secara random tempat maupun kecepatannya.
Game ini mempunyai 3 buah menu, yaitu Mulai, tentang dan keluar. Fungsi dari masing-masing tombol adalah:
-         Mulai untuk memulai permainan baru, ini bisa digunakan jika permainan telah selesai atau  hanya jika ingin mengulang permainan yang sama.
-          tentang, berisi informasi singkat tentang penulis selaku pengembang game Arcade Ball
-          Keluar, merupakan menu yang bertujuan untuk keluar dari permainan.

Pemain juga mempunyai kesempatan sampai 5 kali tertabrak atau tertimpa objek runtuhan sebelum kalah, atau pemain punya 5 nyawa selama permainan.


Rules

Aturan permainan yang digunakan pada game ini adalah pemain hanya cukup menghindari objek runtuhan yang jatuh dari atas kebawah menggunakan arah kanan dan kiri pada keyboard sampai score mencapai 100 dengan maksimal tertabrak atau tertimpa objek runtuhan sebanyak 5 kali.


Goal

Goal atau tujuan dalam game Arcade Ball adalah berusaha untuk menghindari objek runtuhan yang turun dari bawah ke atas sampai score mencapai 100


Screenshot

1. Tampilan awal game


2. Tampilan saat bermain



3. Tampilan jika menang



4. Tampilan jika kalah



5. Tampilan jika ingin keluar dari game





Konsep AI

Artificial Inteligence(AI)      
            Game adapatasi dari horrible racing ini memang telah menggunakan AI sebagai lawan. Pada dasarnya AI merupakan ’penurunan’ sifat manusia kepada komputer, jadi komputer bisa memberikan respon secara cerdas seperti layaknya pada manusia itu sendiri.
            Dalam permainan ini AI nya sebagai objek menyerupai batu bata yang jatuh dari atas ke bawah secara random


Algoritma
            Dalam permainan ini, algoritma yang digunakan adalah algoritma minimax. Algoritma minimax adalah salah satu algoritma yang digunakan dalam cabang ilmu komputer, fungsi atau cara kerja dari algoritma ini adalah berusaha untuk menjatuhkan objek runtuhan di tempat yang random agar user kesulitan untuk menghindari objek tersebut.
            Dengan memanfaatkan algoritma, game Arcade Ball menjadi lebih interaktif karena kita sebagai pemain akan bermain selayaknya seperti melawan komputer
            Pemain sebagai user mencoba untuk menghindari runtuhan objek, namun komputer akan memberikan perlawan dengan menjatuhkan objek runtuhan untuk menimpa user agar user kalah. 


Listing Program
?-
  G_Lifes:=5,
  G_Counter:=0,
  G_Times:=0,
  G_Waktu:=100,
  G_Score:=0,
  G_Depth:=10,
  G_Crashed:=0,
  G_Col1:=0, G_Col2:=0, G_Col3:=0,
  G_Pos:=2,
  G_OldPos:=GPos,
  G_Pen0:= pen(1, rgb(155, 155, 255)),
  G_Pen1:= pen(1, rgb(0, 0, 255)),
  G_Brush0:= brush(rgb(255, 255, 0)),
  G_Brush1:= brush(rgb(255, 255, 0)),
  G_Brush2:= brush(rgb(255, 200, 0)),
  

  window(G_Wnd, _, win_func(_), "Arcade Ball", 500, 80, 220, 610).


%Jendela menu

  win_func(init):-
    menu( pop_up, _, _, menu_func(_), "Menu"),init_data,random.
  win_func(init) :-
    menu(pop_up, _, _,help(_),"About"),init_data,random.
  win_func(close)
     -
    not( yes_no("Keluar","Yakin ingin keluar?", ?)).


%Tombol permainan hanya arah, menghapus mouse click

win_func(key_down(37, _)) :-
     (G_Pos > 1 -> G_OldPos:=G_Pos, G_Pos:=G_Pos - 1), draw_car.

win_func(key_down(39, _)) :-
     (G_Pos < 3 -> G_OldPos:=G_Pos, G_Pos:=G_Pos + 1), draw_car. 

win_func(paint):-
draw.    


%Blok objek berpindah

  draw_car:-
    pen(G_Pen0), brush(G_Brush0),
    rect(0, 0, 0, 5000), %batas pergerakan dari player
    Pos:=G_Pos*60- 40,%pos 2 = tengah, pos 3 = kanan, pos 1 = kiri
    pen(G_Pen1), brush(G_Brush1),
    draw_bitmap(Pos,420,bitmap_image("Back2.bmp",_), _, _),
    Pos:=G_Pos*60- 40,
    brush(G_Brush2).
   


%Blok objek sebelum pindah

  draw:-
    pen(G_Pen0), brush(G_Brush0),
    rect(0, 0, 300, 600),
    draw_bitmap(0,0,bitmap_image("Back2.bmp",_),_,_),


%Background
    color_text_back(G_Wnd, rgb(125, 125, 125)),
    color_text(G_Wnd, rgb(10, 10, 0)),
    text_out(10, 500, "Time  : "+print(G_Waktu)),%Output Text
    text_out(10, 515, "Score : "+print(G_Score)),
    text_out(10, 530, "Lifes : "+print(G_Lifes)),
    Pos:=G_Pos*60- 40,
    pen(G_Pen1), brush(G_Brush1),
    draw_bitmap(Pos,420,bitmap_image("ORANG2.bmp",_), _, _),%Player Objek
    brush(G_Brush2),
   



     Mask:= 1 << (G_Depth- 1),
     for(I, 1, G_Depth),
      (
        (G_Col1 /\ Mask > 0 -> round_rect(20, I*40- 20, 60, I*40, 10, 10)),%pergerakan pada kolom1 ke bawah dengan perulangan
        (G_Col2 /\ Mask > 0 -> round_rect(80, I*40- 20, 120, I*40, 10, 10)),%pergerakan pada kolom2 ke bawah dengan perulangan
        (G_Col3 /\ Mask > 0 -> round_rect(140, I*40- 20, 180, I*40, 10, 10)),%pergerakan pada kolom3 ke bawah dengan perulangan
        Mask:= Mask >> 1, fail %Mask := 1 (Biner := 0001)
      ).


%Kec mobil
time_func(end):-
     G_Counter:=G_Counter+1,
    (G_Counter >= G_Times ->
      G_Waktu := G_Waktu-1,
      G_Score:=G_Score+1,
      G_Crashed:=0,
      Pos:=random(300) // 100 + 1, put_trap(Pos),
      once(crash(Z))
      (Z =:= G_Pos -> beep("Wui.wav"), G_Lifes:= G_Lifes- 1, G_Crashed:=3),%Saat terjadi crash, mengeluarkan suara, lifes-1
      (G_Lifes  = 0 -> kill_timer(G_Wnd, G_Timer),message("Maaf!!!","Maaf Anda Kalah",i)),
      (G_Waktu = 0 -> kill_timer(G_Wnd, G_Timer),message("Selamat!!!","Selamat Anda Menang",!),
      write("back to menu")),
      G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1, G_Col3:=G_Col3>>1,
      G_Counter:=0,
      G_Times:= (200- G_Score) // 40,
      draw
    ).


  put_trap(1):- G_Col1:= G_Col1 \/ (1 << G_Depth).
  put_trap(2):- G_Col2:= G_Col2 \/ (1 << G_Depth).
  put_trap(3):- G_Col3:= G_Col3 \/ (1 << G_Depth).

  crash(1):- G_Col1 /\ 1 > 0, G_Pos =:= 1.
  crash(2):- G_Col2 /\ 1 > 0, G_Pos =:= 2.
  crash(3):- G_Col3 /\ 1 > 0, G_Pos =:= 3.
  crash(4).


%Menu

menu_func(init) :-
          menu( normal, _, _, new(_), "&Mulai"),
          menu( separator, _, _, fail(_),_),
          menu( normal, _, _, exit(_), "&Keluar").


%Menu Mulai!

new(press) :-
       G_Lifes:=5,
       G_Counter:=0,
       G_Times:=0,
       G_Waktu :=100,
       G_Score:=0,
       G_Depth:=10,
       G_Crashed:=0,
       G_Col1:=0, G_Col2:=0, G_Col3:=0,
       G_Pos:=2,
       G_OldPos:=G_Pos,
       G_Timer:=set_timer(G_Wnd, 0.10, time_func).




%Menu Press

     exit(press) :-
       close_window(_).
     win_func(close):- 
      ask.
      ask:-
      yes_no( "Keluar","Yakin Mau selesai", ?),
      !,message("Bye~", "Terima Kasih ",!),
      end.
      ask:-
      message("No", "Masih Mau Bermain?", s).



%Menu Tentang

     help(init) :-
          menu(normal, _, _, langkah_dalam_bermain(_),"&Tentang"),
          menu(separator, _,_,fail(_),_).
      
    
%About

     langkah_dalam_bermain(press):-
     window( _, _, cara_func(_), "tentang Permainan", 110, 150, 900, 200).
     cara_func(paint):-
          text_out(70,30," Name   : Rachman Aji"),
          text_out(70,50," NPM    : 58411572"),
          text_out(70,70," Class  : 3 IA 15"),
          text_out(70,90," Universitas Gunadarma"),
          text_out(70,110," Tugas Project Game: Horrible Racing to Arcade Ball"),
          text_out(70,130," Selamat Bermain"),

     fail.





Death Race



Initial State
Game Death Race! Ini merupakan pengembangan lebih lanjut dari contoh game Horrible Racing yang ada pada Strawberry Prolog Pada Umumnya. Game ini memiiliki tujuan untuk menghindari trap atau jebakan yang datang sebisa dan selama mungkin. Game Death Race ini memilki duah buah karakter yaitu player dan trap. Player berusaha menghindari trap yang datang, dan trap akan ditempatkan berdasarkan posisi player. Namun di sini juga terdapat penambahan karakter ke tiga yang berfungsi sebagai Enemy dengan tugas yang sama dengan player yaitu menghindari trap ditambah juga dengan tugas tambahan yaitu mengurangi ruang gerak player untuk menghindari trap.

Pada Interface awal terdapat tampilan “Welcome to Death Race!”. Dan juga terdapat dua buah button yaitu button “PLAY GAME” untuk memuali permainan baru, dan button “EXIT” untuk keluar dari permainan.



Kemudian ketika kita mengklik tombol “PLAY GAME” maka akan langsung masuk ke form 2 yaitu arena permainan. Disinilah tempat Player yang berwarna hijau melawan enemy yang berwarna kuning untuk menghindari Trap yang berwarna merah.
Pada bagian menu bar di sebelah kiri atas, terdapat tiga buah menu yaitu: Menu “About”, menu “Help”, dan menu “Close”.
Menu “About” merupakan menu untuk menampilkan identitas dari pengembang game Death Race!.
Menu “Help” merupakan menu untuk mengakses aturan dan cara bermain game Death Race!. Dan nenu “Close” merupakan menu untuk keluar dari permainan.




Rules
1.    Menggunakan controler Left adn Right pada ketboard untuk mengendalikan player berpindah ke kiri   dan ke kanan.
2.     Berusaha untuk bertahan selama dan sebisa mungkin untuk menghindari trap yang datang.
3.   Berhati hatilah dengan pergerakan Enemy yang juga menghindari trap namun juga berusaha untuk   memojokan player agar terkena trapp.
4.     Jika life dari player telah habis maka permainan akan berakhir.


Goal 
Dalam permaina game Death Race ini memilki tujan akhir adalah berusaha mengumpulkan score sebanyak mungkin dan bertahan selama mungkin agar tidak terkena trap maupun terjebak oleh enemy agar mengenai trap.

Screen Shot jika permainan telah selesai karena life telah habis




Konsep AI 

AI
Pada dasarnya game Horrible Racing merupakan game single player atau permainan yang hanya dimainkan oleh satu pemain, dimana hanya terdapat satu player yang berusaha menghindari trap yang datang. Akan tetepai pada game Death Race ini penulis mencoba mengembangkan permainan dengan membuat karakter baru sebagai lawan dari karakter pemain dengan tujuan untuk menyulitkan pergerakan karakter pemain. Karakter yang telah dibentuk tidak akan dapat berjalan jika tidak adanya kendali dari bahasa pemrograman. Kendali yang ditanamkan pada pemrogrman disebut AI (Artificial Intelligence) yaitu kecerdasan buatan, dimana AI akan mengontrol pergerakan karater yang sudah dibuat dalam menentukan jalur jalur perpindahan agar tidak terkena trap dan dapat memlih perpindahan yang sesuai agar karakter pemain terjebak.


Algoritma
Algoritma adalah suatu teknik dalam kumpulan perintah untuk menyelesaikan suatu masalah. Perintah-perintah ini dapat diterjemahkan secara bertahap dari awal hingga akhir. Masalah tersebut dapat berupa apa saja, dengan catatan untuk setiap masalah, ada kriteria kondisi awal yang harus dipenuhi sebelum menjalankan algoritma.

Dalam permainan ini  AI menggunakan algoritma Branch and Bound, algoritma ini mendukung perhitungan untuk memukan jalan terbaik menghindari trap dan posisi terbaik untuk menjebak karakter pemain.  Hal ini tidak didapat dari algoritma lain seperti DFS dan brute force. Dan algoritma Branch and Bound pada game Death Race sebagai berikut :

time_func(end):-
            G_Counter:=G_Counter+1,
            (G_Counter >= G_Times ->
            G_Score:=G_Score+1,
            G_Crashed:=0,
            %G_CrashedX:=0,
            Pos:=random(400) // 100 + 1, put_trap(Pos),

            once(crashX(ZX)),
            (ZX =:= G_PosX->
                        (G_PosX =:= G_Pos - 1 ; G_PosX=:= 1 ->
                                    G_PosX:= 2
                        else
                                    G_OldPosX:=random(2) + 1,
                                    (G_OldPosX =:= 2 -> G_OldPosX := G_Pos - 1),
                                    G_PosX := G_OldPosX
                        ), beep("plus\\moveenemy.wav") %G_CrashedX:=3, G_LifesX:= G_LifesX - 1
            ),

            once(crash(Z)),
            (Z =:= G_Pos ->
                        beep("plus\\trap.wav"), G_Lifes:= G_Lifes- 1, G_Crashed:=3
            ),
     (G_Lifes  =< 0 ->
                        kill_timer(G_Form2, G_Timer),
                        message("Game Over!","you're a coward, try again!",!)
            ),

            G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1,
            G_Col3:=G_Col3>>1, G_Col4:=G_Col4>>1,
            G_Counter:=0,
            G_Times:= (200- G_Score) // 40,
            draw
            ).



Listing
?-
%============== Pendeklarasian ================%
G_Lifes:=10,%life
%G_LifesX:=100,
G_Counter:=0,
G_Times:=5,%lama muncul penghalang
G_Score:=0,%score
G_Depth:=10,%tinggi trap
G_Crashed:=0,%crash
%G_CrashedX:=0,
G_Col1:=0, G_Col2:=0,
G_Col3:=0, G_Col4:=0,

%posisi awal
G_Pos:=4,
G_OldPos:=G_Pos,
G_PosX:=1,
G_OldPosX:=G_PosX,

%warna dan latar
G_Pen0:= pen(1, rgb(0, 0, 0)),
G_Pen1:= pen(1, rgb(0, 0, 0)),
G_Brush0:= brush(rgb(20, 20, 20)),
G_Brush1:= brush(rgb(0, 255, 0)),
G_Brush2:= brush(rgb(255, 255, 0)),
G_Brush3:= brush(rgb(255, 0, 0)),
G_Road is bitmap_image("Plus\\road.bmp",_),
G_Background is bitmap_image("Plus\\background.bmp",_),

%============== pembuatan tampilan awal dan menu button================%
window(G_Form1, _, win_func(_), "Welcome to Death Race!", 200,80,570,329).

win_func(paint):-
                draw_bitmap(0,0,G_Background ,_,_).
               
win_func(init):-
                button(_,_,pygame(_),"PLAY GAME",25,230,200,40),
                button(_,_,exgame(_),"EXIT",329,230,200,40).

pygame(press):-
                window(G_Form2, _, win_play(_), "Death Race!", 200,80,280,620),
                close_window(G_Form1),
                update_window(_).

win_play(init):-
                menu(normal, _, _, mabout(_),"&About"),
                menu(normal, _, _, mhelp(_),"&Help"),
                menu(popup, _, _, msetup(_),"&Setup"),
                menu(normal, _, _, mclose(_),"&Close"),
                G_Timer:=set_timer(G_Form2, 0.25, time_func).

%============== Control player ================%
%pindah ke kiri player
win_play(key_down(37, _)) :-
                (G_Pos > G_PosX + 1 -> G_OldPos:=G_Pos, G_Pos:=G_Pos - 1), draw.
%pindah ke kanan player
win_play(key_down(39, _)) :-
                (G_Pos < 4  -> G_OldPos:=G_Pos, G_Pos:=G_Pos + 1), draw.

%============== Pembuatan Objek ================%
win_play(paint):- draw.
draw:-  
                draw_bitmap(0,0,G_Road ,_,_),
                pen(G_Pen0), brush(G_Brush0),%warna latar
                rect(0, 500, 280, 620),%ukuran latar
                color_text_back(G_Form2, rgb(20, 20, 20)),%warna bacgruound score dan life
                color_text(G_Form2, rgb(255, 255, 255)),%warna tulisan score dan life
                font(13,15,"Calibri"),
                text_out(150, 512, "Score : "+print(G_Score)),%Posisi untuk print score player
                text_out(150, 530, "Lifes : "+print(G_Lifes)),%Possisi untuk print lifes player
                font(13,30,"Calibri"),
                text_out(10, 510, "Death Race"),
                Pos:=G_Pos*60- 40,
                PosX:=G_PosX*60- 40,
                pen(G_Pen1), brush(G_Brush1),
                ellipse(Pos, 420, Pos+40, 460),
                pen(G_Pen1), brush(G_Brush2),
                ellipse(PosX, 420, PosX+40, 460),
                brush(G_Brush3),
                Mask:= 1 << (G_Depth- 1),
                for(I, 1, G_Depth),
                (
                                (G_Col1 /\ Mask > 0 -> round_rect(20, I*40- 20, 60, I*40, 10, 10)),
                                (G_Col2 /\ Mask > 0 -> round_rect(80, I*40- 20, 120, I*40, 10, 10)),
                                (G_Col3 /\ Mask > 0 -> round_rect(140, I*40- 20, 180, I*40, 10, 10)),
                                (G_Col4 /\ Mask > 0 -> round_rect(200, I*40- 20, 240, I*40, 10, 10)),
                                Mask:= Mask >> 1, fail
                ).

%============== AI buat trap ================%
time_func(end):-
                G_Counter:=G_Counter+1,
                (G_Counter >= G_Times ->
                G_Score:=G_Score+1,
                G_Crashed:=0,
                %G_CrashedX:=0,
                Pos:=random(400) // 100 + 1, put_trap(Pos),

                once(crashX(ZX)),
                (ZX =:= G_PosX->
                                (G_PosX =:= G_Pos - 1 ; G_PosX=:= 1 ->
                                                G_PosX:= 2
                                else
                                                G_OldPosX:=random(2) + 1,
                                                (G_OldPosX =:= 2 -> G_OldPosX := G_Pos - 1),
                                                G_PosX := G_OldPosX
                                ), beep("plus\\moveenemy.wav") %G_CrashedX:=3, G_LifesX:= G_LifesX - 1
                ),

                once(crash(Z)),
                (Z =:= G_Pos ->
                                beep("plus\\trap.wav"), G_Lifes:= G_Lifes- 1, G_Crashed:=3
                ),
     (G_Lifes  =< 0 ->
                                kill_timer(G_Form2, G_Timer),
                                message("Game Over!","you're a coward, try again!",!)
                ),

                G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1,
                G_Col3:=G_Col3>>1, G_Col4:=G_Col4>>1,
                G_Counter:=0,
                G_Times:= (200- G_Score) // 40,
                draw
                ).

put_trap(1):- G_Col1:= G_Col1 \/ (1 << G_Depth).
put_trap(2):- G_Col2:= G_Col2 \/ (1 << G_Depth).
put_trap(3):- G_Col3:= G_Col3 \/ (1 << G_Depth).
put_trap(4):- G_Col4:= G_Col4 \/ (1 << G_Depth).

crash(1):- G_Col1 /\ 1 > 0, G_Pos =:= 1.
crash(2):- G_Col2 /\ 1 > 0, G_Pos =:= 2.
crash(3):- G_Col3 /\ 1 > 0, G_Pos =:= 3.
crash(4):- G_Col4 /\ 1 > 0, G_Pos =:= 4.
crash(5).

crashX(1):- G_Col1 /\ 1 > 0, G_PosX =:= 1.
crashX(2):- G_Col2 /\ 1 > 0, G_PosX =:= 2.
crashX(3):- G_Col3 /\ 1 > 0, G_PosX =:= 3.
crashX(4):- G_Col4 /\ 1 > 0, G_PosX =:= 4.
crashX(5).
%============== Pembuatan Main Menu ================%
mabout(press):-
                window( _, _, habout(_), "About Me", 100, 150, 400, 200).

habout(paint):-
                font(13,20,"Calibri"),
                text_out(10,35," Nama Project   : Death Race "),
                text_out(10,55," Nama                : Maulana Ruswa "),
                text_out(10,75," Kelas                 : 3IA15 "),
                text_out(10,95," NPM                  : 54411357 "),
                fail.
habout(paint):-
                font(13,25,"Calibri"),
                color_text(_, rgb(70,200,70)),
                text_out(20,10,"About Me :"),
                button( _, _, oabout(_), "OK", 180, 120, 80, 30),
                fail.
oabout(press) :-
                close_window(parent(_)).

mhelp(press):-
shell_execute("help.html").                      

mclose(press):-
                close_window(G_Form2),
                update_window(G_Form1).

exgame(press):-
                close_window(G_Form1),
                fail.



Nama : Sinta Novianka
Kelas : 3IA14
NPM : 58413503 

       





Komputasi Biologi

Pengertian Komputasi Komputasi adalah sebuah istilah umum untuk segala jenis pemrosesan informasi untuk menemukan pemecahan masalah dari...