Sabtu, 28 Mei 2016

Terrible Racing Game (Strawberry Prolog)



Game Terrible Racing ini merupakan pengembangan lebih lanjut dari contoh game Horrible Racing yang ada pada Strawberry Prolog pada umumnya. Game ini memiiliki tujuan untuk menghindari rintangan atau jebakan yang datang sebisa dan selama mungkin. Game Horrible Racing ini memilki duah buah karakter yaitu player dan rintangan. Player berusaha menghindari rintangan yang datang, dan rintangan 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 rintangan ditambah juga dengan tugas tambahan yaitu mengurangi ruang gerak player untuk menghindari rintangan.



Konsep 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 rintangan yang datang. Akan tetapi pada Horrible Racing ini, saya 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 rintangan 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 rintangan dan posisi terbaik untuk menjebak karakter pemain.



Source Code

% This program was edited by Febriyanto from Gunadarma University

% This program was originally created by Ivan Genov Genov
% from University of Sofia

?-
%====================Pendklarasian Awal=====================%
  G_Lifes:=10, %banyaknya nyawa
  G_S:=0, %score
  G_L:=10, %life
  G_Counter:=0,
  G_Times:=0,
  G_Score:=0,
  G_Depth:=10,
  G_Crashed:=0,
  G_Col1:=0, G_Col2:=0, G_Col3:=0, G_Col4:=0, G_Col5:=0, G_Col6:=0, G_Col7:=0,
  G_Pos:=4, %posisi awal
  G_OldPos:=GPos,
  G_Pos2:=3,
  G_OldPos2:=G_Pos2,
% Latar dan Background
  G_Pen0:= pen(1, rgb(249, 193, 255)),
  G_Pen1:= pen(3, rgb(35, 106, 250)),
  G_Brush0:= brush(rgb(249, 193, 255)),
  G_Brush1:= brush(rgb(250, 171, 94)),
  G_Brush2:= brush(rgb(115, 240, 130)),
  G_Brush3:= brush(rgb(248,67,76)),
  G_ss is bitmap_image("game.bmp",_),
  G_menu is bitmap_image("menu.bmp",_),
  G_play is bitmap_image("play.bmp",_),
  G_rules is bitmap_image("rules.bmp",_),
  G_About is bitmap_image("about.bmp",_),

%Tampilan Awal
window(G_kedua,_,win_dua(_),"Getting Ready",100,100,725,450).

%variable untuk fungsi timer
win_dua(init):-
G_batas := 1,
waktu is set_timer(_,0.05,fungsi_timer).

%Splashscreen
fungsi_timer(end):-
draw_bitmap(5,100,G_ss,_,_),
text_out(300,295,print("LOADING : " + G_batas+"%")),
pen(1,rgb(255,255,255)),brush(rgb(255,255,255)),
rect(0,250,206-(2*G_batas),350),
rect(490+(2*G_batas),250,700,350),
G_batas := G_batas + 1 ,
G_batas = 101 -> close_window(G_kedua),

%Window Menu
window(G_pertama,_,win_pertama(),"Menu",100,100,720,425),
beep("menu1.wav"),
     update_window(_).

%Memanggil Fungsi Background
win_pertama(paint):-
draw_bitmap(0,0,G_menu,_,_).

%Button pada Menu
win_pertama(init):-
button(_,_,tombol_1(_),"PLAY",260,160,110,35),
button(_,_,tombol_2(_),"QUIT",439,160,110,35),
menu(normal, _,_,help(_),"&Help"),
menu(normal, _,_,about(_),"&About").

%fungsi tombol help dan about
help(press):-
window(G_help,_,win_rules(_),"HELP",200,100,428,450).
win_rules(paint):-
draw_bitmap(0,0,G_rules,_,_).
win_rules(init):-
button(_,_,tombol3(_),"OK",178,350,50,40).
tombol3(press):-
close_window(G_help).

about(press):-
window(G_Aboutme,_,win_about(_),"About",200,100,450,450).
win_about(paint):-
draw_bitmap(0,0,G_About,_,_).
win_about(init):-
button(_,_,tombol_4(_),"MORE ABOUT ME",125,350,170,40).
tombol_4(press):-
shell_execute("about.html").
%fungsi tombol 1
tombol_1(press):-
close_window(G_pertama),
window(G_Wnd, _, win_func(_), "PLAY", 100, 0, 460, 600),
execute("backsound.exe"),
update_window(_).

%fungsi tombol 2
tombol_2(press):-
close_window(G_pertama).

win_func(init):-
G_Timer:=set_timer(G_Wnd, 0.1, time_func).

%Control Player menggunakan ASCII
win_func(key_down(37, _)) :- 
     (G_Pos > G_Pos2 + 1 -> G_OldPos:=G_Pos, G_Pos:=G_Pos - 1), draw_car.

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

win_func(close) :- 
not( execute("backsound.bat")).

%=======================PEMBUATAN OBJEK=============

win_func(paint):-
draw.
draw:-
    pen(G_Pen0), brush(G_Brush0),
    draw_bitmap(0,0,G_play,_,_),
    color_text_back(G_Wnd, rgb(185, 222, 212)),
    color_text(G_Wnd, rgb(0, 0, 0)),
    text_out(187, 512, "SCORES : "+print(G_Score)),
    text_out(10, 512, "COMP : "+print(G_L)),
    text_out(364, 512, "LIFES : "+print(G_Lifes)),
    Pos:=G_Pos*60- 40,
    Pos2:=G_Pos2*60- 40,
    pen(G_Pen1), brush(G_Brush1),
    ellipse(Pos, 420, Pos+40, 460),
    brush(G_Brush3),
    ellipse(Pos2, 420, Pos2+40, 460),
    brush(G_Brush2),
    ellipse(Pos+7- G_Crashed, 428- G_Crashed, Pos+15+G_Crashed, 439+G_Crashed),
    ellipse(Pos+25- G_Crashed, 428- G_Crashed, Pos+33+G_Crashed, 439+G_Crashed),

    ellipse(Pos2+7- G_Crashed, 428- G_Crashed, Pos2+15+G_Crashed, 439+G_Crashed),
    ellipse(Pos2+25- G_Crashed, 428- G_Crashed, Pos2+33+G_Crashed, 439+G_Crashed),
    
    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)),
        (G_Col5 /\ Mask > 0 -> round_rect(260, I*40- 20, 300, I*40, 10, 10)),
        (G_Col6 /\ Mask > 0 -> round_rect(320, I*40- 20, 360, I*40, 10, 10)),
        (G_Col7 /\ Mask > 0 -> round_rect(380, I*40- 20, 420, I*40, 10, 10)),

         Mask:= Mask >> 1, fail
      ).


%=============== AI untuk Trap =================%
time_func(end):-
G_Counter:=G_Counter + 1,
(G_Counter >= G_Times ->
G_Score:=G_Score+1,
G_Crashed:=0,
Pos:=random(700) // 100 + 1, put_trap(Pos),

once(crashX(ZX)),
(ZX =:= G_Pos2->
(G_Pos2 =:= G_Pos - 1 ; G_Pos2=:= 1 -> 
G_Pos2:= 2
else
G_OldPos2:=random(1) + 1,
(G_OldPos2 =:= 2 -> G_OldPos2 := G_Pos - 1),
G_Pos2 := G_OldPos2
),

    (ZX =:= G_Pos2 -> beep("crash.wav"),
G_L:= G_L- 1, G_Crashed:=4
),
     (G_L  =< 0 -> 
kill_timer(G_Wnd, G_Timer),
beep("win.wav"),
message("Congratulation!","YOU WIN!",!),
execute("backsound.bat"),
close_window(G_Wnd)),

 
once(crash(Z)),
    (Z =:= G_Pos -> beep("crash.wav"),
G_Lifes:= G_Lifes- 1, G_Crashed:=4
),
     (G_Lifes  =< 0 -> 
kill_timer(G_Wnd, G_Timer),
 beep("lose.wav"),
 message("LOL","YOU'RE LOSER!!!",!),
 execute("backsound.bat"),
 close_window(G_Wnd)),

G_Col1:=G_Col1>>1, G_Col2:=G_Col2>>1, 
G_Col3:=G_Col3>>1, G_Col4:=G_Col4>>1,
G_Col5:=G_Col5>>1, G_Col6:=G_Col6>>1,
G_Col7:=G_Col7>>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).
put_trap(5):- G_Col5:= G_Col5 \/ (1 << G_Depth).
put_trap(6):- G_Col6:= G_Col6 \/ (1 << G_Depth).
put_trap(7):- G_Col7:= G_Col7 \/ (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):- G_Col5 /\ 1 > 0, G_Pos =:= 5.
crash(6):- G_Col6 /\ 1 > 0, G_Pos =:= 6.
crash(7):- G_Col7 /\ 1 > 0, G_Pos =:= 7.
crash(8).

crashX(1):- G_Col1 /\ 1 > 0, G_Pos2 =:= 1.
crashX(2):- G_Col2 /\ 1 > 0, G_Pos2 =:= 2.
crashX(3):- G_Col3 /\ 1 > 0, G_Pos2 =:= 3.
crashX(4):- G_Col4 /\ 1 > 0, G_Pos2 =:= 4.
crashX(5):- G_Col5 /\ 1 > 0, G_Pos2 =:= 5.
crashX(6):- G_Col6 /\ 1 > 0, G_Pos2 =:= 6.
crashX(7):- G_Col7 /\ 1 > 0, G_Pos2 =:= 7.
crashX(8).





Related Posts

Terrible Racing Game (Strawberry Prolog)
4/ 5
Oleh

1 komentar:

Tulis komentar
avatar
1 November 2016 pukul 23.38

linknya mati, ada link lain?

Reply