Monday, 30 May 2016

PENGANTAR TEKNOLOGI GAME

                                                              GAME JAWARA OF SKY

Initial State




              Game Jawara of Sky merupakan pengembangan dari game sky wars pada contoh game strawberry prolog. Dalam star wars, user memiliki tujuan untuk mengalahkan setiap musuh yang datang hingga pesawat yang kita kendalikan hancur jika terkena setiap benturan dari pesawat ataupun serangan musuh. Namun pada game Jawara of Sky ini memiliki perbedaan dimana didalam permainan terdapat health point (HP) untuk pesawat player sehingga jika terkena satu serangan saja, akan hanya berdampak pada pengurangan HP player dan tidak langsung hancur. Pesawat player akan hancur jika HP sudah habis atau 0%. Kemudian juga perbedaan game Jawara of Sky ini dengan star wars pada prolog terdapat pada timer pada saat bermain. Sehingga game Jawara of Sky mempunyai goal tersendiri yaitu player harus bertahan selama 30 detik. Jika player mampu melewati waktu yang sudah ditentukan, maka player dinyatakan menang. Akan tetapi, jika HP player sudah habis sebelum waktu yang ditentukan berakhir, player dinyatakan kalah dalam pertempuran.


Pada interface game terdapat Menu, Level dan About Me, dimana Menu berisikan New Game, bantuan dan exit,  kemudian Level berisikan pilihan level mana yang akan di mulai, dan About Me sebagai identitas dari pengembang game The Hobbit of Snake.
Pada permulaan awal game akan tampil sebuah splash screen garis beserta video berupa filecopy. Kemudian pada tampilan menu game terdapat pilihan Start, About, Help dan Keluar.



                                       Tampilan pada saat splash screen
 

                                                    Tampilan menu awal


Rules
1.     Menggunakan kontroler W, A, S dan D pada keyboard untuk mengendalikan pesawat player.
2.     Menggunakan K untuk menyerang, Q untuk serangan spesial, P untuk pause saat mulai bermain dan ESC untuk menyerah dalam permainan.
3.     Mengalahkan musuh yang bermunculan hingga mencapai batas waktu tertentu.
4.     Jika player kehabisan health point (HP)  maka player dinyatakan gugur dalm permainan.
5.     Jika player dapat bertahan dan tidak kehabisan HP hingga batas waktu yang telah ditentukan, maka player dinyatakan menang.
Goals
    Dalam permainan Jawara of Sky memiliki tujuan akhir untuk mengalahkan musuh hingga batas waktu yang telah ditentukan. Jika sebelum habis batas waktu dan player telah kehabisan HP, maka player dinyatakan gugur dalam pertempuran.
Screenshot :
                              Tampilan pada saat menang

 




                                                   Tampilan pada saat kalah



konsep AI
AI

Kecerdasan Buatan atau Intelegensi Artifisial (AI) didefinisikan sebagai kecerdasan entitas ilmiah. Sistem seperti ini umumnya dianggap komputer. Kecerdasan diciptakan dan dimasukkan ke dalam suatu mesin (komputer) agar dapat melakukan pekerjaan seperti yang dapat dilakukan manusia. Beberapa macam bidang yang menggunakan kecerdasan buatan antara lain sistem pakar, permainan komputer (games), logika fuzzy, jaringan syaraf tiruan dan robotika.

Konsep AI atau kecerdasan buatan dalam game ini bukanlah seperti pada kebanyakan game yang memiliki AI pada lawannya. Konsep AI pada game ini terdapat dalam sistem permainan itu sendiri. Yaitu dimana sistem permainan dapat mengecek setiap collision (tabrakan) yang terjadi pada player dengan musuh.

Algoritma

Algoritma adalah metode efektif diekspresikan sebagai rangkaian terbatas dari instruksi-instruksi yang telah didefinisikan dengan baik. Algoritma merupakan 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 pencarian solusi secara  melebar atau breadth first search (BFS). Dalam algoritma BFS solusi dicari dengan membentuk pohon ruang status yang merupakan pohon dinamis. BFS mencari solusi persoalan pada pohon ruang status yang dibentuk secara dinamis. dengan cara semua simpul pada aras d dibangkitkan terlebih dahulu sebelum simpul-simpul pada aras d+1. Simpul BFS memerlukan sebuah antrian untuk menyimpan simpul-simpul yang akan dibangkitkan. Simpul-simpul yang dibangkitkan disimpan di belakang antrian.
Dalam penerapannya dalam game Jawara of Sky, algoritma BFS terdapat dalam sistem pada game dimana sistem dapat mengecek setiap tabrakan yang terjadi pada player. Adapun sintax BFS yang terdapat dalam game Jawara of Sky adalah sebagai berikut :



 
crash(X1, Y1, X2, Y2) :- !,
  TX1 is ship_left(X1),
  TX2 is ship_right(X1),
  TY1 is ship_up(Y1),
  TY2 is ship_down(Y1),
  do_crash_check(TX1, TX2, TY1, TY2, X2, Y2).

do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY2), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY2), !.

check_collisions(_) :- !, enemy_ships(EShips), enemy_bombs(EBombs), check_es(EShips, NewShips), check_eb(EBombs), retract(enemy_ships(_)), assert(enemy_ships(NewShips)).
check_es([],[]) :- !.
check_es([ship(D, X, Y)|T], []) :- X1 is G_X, Y1 is G_Y, crash(X, Y, X1, Y1), !, bar_ngurang(_).
check_es([ship(D, X, Y)|T], [ship(D, X, Y)|R]) :- survive_enemy(X, Y), !, check_es(T, R).
check_es([ship(D, X, Y)|T], R) :- !, (G_AutoFired is 0 -> G_Score := G_Score + G_PTS else G_Score := G_Score - G_PTS),
  (G_HighScore < G_Score -> G_HighScore := G_Score), G_Difficulty := G_Difficulty + 2, check_es(T, R).

survive_enemy(X, Y) :- !, player_bombs(Bombs), s_e(X, Y, Bombs).

s_e(_, _, []) :- !.
s_e(X, Y, [bomb(AutoFire, BX, BY)|T]) :- is_in_ship(X, Y, BX, BY), !, G_AutoFired := AutoFire, fail.
s_e(X, Y, [bomb(_, _, BY)|T]) :- !, s_e(X, Y, T).

%bbbbbbb pengecekan tubrukan terhadap serangan musuh dddddddddddd
check_eb([]) :- !.
check_eb([bomb(_, BX, BY)|T]) :- X1 is G_X, Y1 is G_Y, is_in_ship(X1, Y1, BX, BY), !, bar_ngurang(_).
check_eb([bomb(_, BX, BY)|T]) :- !, check_eb(T).

=======================================================================================

                               LISTING PROGRAM
?-
%inisialisasi gambar
G_bgawal is bitmap_image("Picture\\bg2.bmp",_),
G_sky is bitmap_image("Picture\\langit.bmp",_),

%--------------------------loading
window(G_layer0,_,window_awal(_),"Loading... ", 540,250,400,300).

window_awal(init):-
    G_batas_line := 145,
    G_batas_text := 0,
    G_waktu is set_timer(_,0.1,fungsi_timer).

fungsi_timer(end):-
    G_batas_line := G_batas_line + 10,
    G_batas_text := G_batas_text + 10,update_window(_),
    (G_batas_text = 110 -> close_window(G_layer0),execute("sound\\menu.exe"),
    window(G_layer1,_,window_menu(_),"Menu progress", 450,100,500,490)).
      
window_awal(paint):-
      
       text_out(150,190,print("loading: " + G_batas_text +" %")),
       animate(_,_,fail(_),"video/FILECOPY.AVI",60,50),
       pen(9,rgb(250,0,0)),
     rect(120,130,270,170),
     pen(15,rgb(0,0,180)),                     
       line(145,150,G_batas_line,150).

%--------------------------tampilan program menu
window_menu(paint) :-
  draw_bitmap(0,0,G_bgawal,_,_),
  text_out(220,190,print("1 - Start")),
  text_out(220,220,print("2 - About")),
  text_out(220,250,print("3 - Help")),
  text_out(220,310,print("4 - Exit")).

%------- Fungsi about ---------
about_game(press) :-
       shell_execute("JOS.html").

%--------- fungsi start ------------
new_window2(press) :-
       beep("sound\\gun.wav"),close_window(G_layer1),
       window( G_layer2, _, window_game(_), "Jawara Of Sky", 450,100,500,500).
    

%----------------------pilihan help----------
pilihan_help(press):-
message("Help","K : untuk menembak\nW : untuk ke atas\nA : untuk ke kiri\nS : untuk ke bawah\nD : untuk ke kanan
\nP : untuk pause\nESC : untuk menyerah",i).


%------------------pilihan keluar-------------
pilihan_exit(press):-
beep("sound\\Lock.wav"),
not(yes_no("konfirmasi","Anda Yakin Ingin Keluar Dari Permainan?", ?)->execute("sound\\cleanmenu.bat"),close_window(G_layer1)).


%+++++++++++++++++++++++++++Gamenya+++++++++++++++++++++++
%----luas area permainan------
width(480) :- !.
height(460) :- !.

%dead or alive?
dead.

%ship data:
ship_half_width(20) :- !.
ship_height(30) :- !.
ship_minship(100) :- !.

%enemies:
enemy_ships([]).
enemy_bombs([]).

%speed:
speed(10) :- !.
%G_EnemySpeed
player_bomb_speed(15) :- !.

%player:
player_bombs([]).

%kalo mokad
die(_) :- !,
execute("sound\\cleangame.bat"),execute("sound\\menu.exe"),
assert(first_sleepint_paint), assert(dead).

%setting difikulnye
start_game(P, S, PTS) :- 
  execute("sound\\bb.exe"),
  execute("sound\\cleanmenu.bat"),
  retract(dead),
  retract(enemy_ships(_)), assert(enemy_ships([])),
  retract(enemy_bombs(_)), assert(enemy_bombs([])),
  width(W), height(H), X is W >> 1, Y is H - 1,
  G_D := 0,
  G_X := X,
  G_Y := Y,
  retract(player_bombs(_)), assert(player_bombs([])),
  (paused -> retract(paused)),
  G_HP:=220,
  G_limit:=31,
  G_info:= 20,
  G_text_HP:=100,
  G_Difficulty := P,
  G_EnemySpeed := S,
  G_DirectionTimer := -100,
  G_PTS := PTS,
  G_Score := 0,
  update_window(_).

%inisialisasi bentuk kapal
is_in_ship(X, Y, PX, PY) :- !,
  ship_left(X) =< PX,
  ship_right(X) >= PX,
  ship_up(Y) =< PY,
  ship_down(Y) >= PY.

%Kalo nabrakk
crash(X1, Y1, X2, Y2) :- !,
  TX1 is ship_left(X1),
  TX2 is ship_right(X1),
  TY1 is ship_up(Y1),
  TY2 is ship_down(Y1),
  do_crash_check(TX1, TX2, TY1, TY2, X2, Y2).

do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX1, TY2), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY1), !.
do_crash_check(TX1, TX2, TY1, TY2, X2, Y2) :- is_in_ship(X2, Y2, TX2, TY2), !.

%koordinat batas di dalam pesawat:
R is ship_up(int Y) :- !, ship_height(SH), R0 is Y - SH, R is R0 + 5.
R is ship_down(int Y) :- !, R is Y.
R is ship_left(int X) :- !, ship_half_width(SHW), R is X - SHW.
R is ship_right(int X) :- !, ship_half_width(SHW), R is X + SHW.

%#############penambahan musuh##############
add_enemy(_) :- X is G_LastShipWay, ship_minship(Y), X > Y,
  R0 is random(1000), R1 is G_Difficulty, R2 is R1 >> 1, R0 < R2, !,
  width(W), ship_half_width(HW), W1 is W - HW - HW, XNEW is random(W1) + HW,
  enemy_ships(L), random_left_right(D), ship_height(SHH), L1 is [ship(D, XNEW, SHH)|L],
  retract(enemy_ships(_)), assert(enemy_ships(L1)),
  G_LastShipWay := 0.

add_enemy(_) :- !.
random_left_right(X) :- Y is random(1000), Y < 500, !, X is left.
random_left_right(right) :- !.

%$$$$$$$$$$ Serangan musuh $$$$$$$$$$$$
fire_enemy(X, Y) :- R0 is random(1000), R1 is G_Difficulty, R2 is R1 >> 2, R0 < R2, !,
  enemy_bombs(L), random_speed(S), L1 is [bomb(S, X, Y)|L],
  retract(enemy_bombs(_)), assert(enemy_bombs(L1)).

fire_enemy(X, Y) :- !.

random_speed(S) :- !, S0 is G_EnemySpeed, S1 is S0 / 4, S2 is S0 * 1.5, S3 is S1 * 1000, S4 is S2 * 1000,
  S5 is S4 - S3, INTS5 is integer(S5), R0 is random(INTS5) + S3, S is R0 / 1000.

%$$$$$$$$$ Serangan Player $$$$$$$$$$$$
fire_player(_) :- firing, !, retract(firing), player_bombs(L), X is G_X, Y is G_Y, ship_height(SH), Y1 is Y - SH -7,
  (autofire -> AutoFire := 1 else AutoFire := 0), L1 is [bomb(AutoFire, X, Y1)|L],
  retract(player_bombs(_)), assert(player_bombs(L1)).
fire_player(_) :- !.

update_positions(_) :- !, update_enemies(_), update_bombs(_), update_player_bombs(_), update_player(_).

% {{ UPDATE_ENEMIES:
update_enemies(_) :- !, enemy_ships(L), update_enemy(L, R), retract(enemy_ships(_)), assert(enemy_ships(R)).
update_enemy([], []) :- !.
update_enemy([ship(D, X, Y)|T], R) :- height(H), S is G_EnemySpeed, Y1 is ship_down(Y + S), Y1 > H, !, update_enemy(T, R).
update_enemy([ship(D, X, Y)|T], [ship(D, RX, RY)|R]) :- S is G_EnemySpeed, preserve_direction(D, S, X, RX), !, RY is Y + S, update_enemy(T, R).
update_enemy([ship(D, X, Y)|T], [ship(RD, X, RY)|R]) :- !, S is G_EnemySpeed, RY is Y + S, opposite(D, RD), update_enemy(T, R).
preserve_direction(left, S, X, RX) :- !, RX is X - S, ship_left(RX) >= 0.
preserve_direction(right, S, X, RX) :- !, RX is X + S, width(W), ship_right(RX) < W.
opposite(left, right) :- !.
opposite(right, left) :- !.
% }}

%update enemy bombs:
update_bombs(_) :- !, enemy_bombs(L), update_bomb(L, R), retract(enemy_bombs(_)), assert(enemy_bombs(R)).
update_bomb([], []) :- !.
update_bomb([bomb(S, X, Y)|T], R) :- height(H), Y1 is Y + S, Y1 > H, !, update_bomb(T, R).
update_bomb([bomb(S, X, Y)|T], [bomb(S, X, RY)|R]) :- !, RY is Y + S, update_bomb(T, R).

%update player bombs:
update_player_bombs(_) :- !, player_bombs(L), update_player_bomb(L, R), retract(player_bombs(_)), assert(player_bombs(R)).
update_player_bomb([], []) :- !.
update_player_bomb([bomb(_, X, Y)|T], R) :- player_bomb_speed(S), Y1 is Y - S, Y1 < 0, !, update_player_bomb(T, R).
update_player_bomb([bomb(AutoFire, X, Y)|T], [bomb(AutoFire, X, RY)|R]) :- !, player_bomb_speed(S), RY is Y - S, update_player_bomb(T, R).

%update player:
update_player(_) :- G_DirectionTimer > 0, !, D is G_D, X is G_X, Y is G_Y, speed(S), update_player_impl(S, D, X, Y, RX, RY), G_X := RX, G_Y := RY.
update_player(_) :- !.
update_player_impl(S, 1, X, Y, X, RY) :- Y0 is Y - S, ship_up(Y0) < 0, !, ship_height(RY).
update_player_impl(S, 1, X, Y, X, RY) :- !, RY is Y - S.
update_player_impl(S, 4, X, Y, X, RY) :- Y1 is Y + S, height(H), Y1 >= H, !, RY is H - 1.
update_player_impl(S, 4, X, Y, X, RY) :- !, RY is Y + S.
update_player_impl(S, 2, X, Y, RX, Y) :- X0 is X - S, ship_left(X0) < 0, !, ship_half_width(RX).
update_player_impl(S, 2, X, Y, RX, Y) :- !, RX is X - S.
update_player_impl(S, 3, X, Y, RX, Y) :- X0 is X + S, width(W), ship_right(X0) > W, !, ship_half_width(HW), RX is W - HW.
update_player_impl(S, 3, X, Y, RX, Y) :- !, RX is X + S.
update_player_impl(S, D, X, Y, X, Y) :- !.

%>>>>>>>>>>>>>>>>>Sistem HP<<<<<<<<<<<<<<<<<<<<<
bar_HP(_):-
line(20,80,G_HP,80),
text_out(20,90,print("HP : " + G_text_HP +" %")).

bar_ngurang(_):-
G_text_HP:=G_text_HP - 10,
G_HP:=G_HP - 20,(G_HP = 20 ->tampilan_kalah(_)).



%)))))))))))info pas maen((((((((
tampilan_info(_):-
text_out(G_info,435,print("Tekan P untuk berhenti - Tekan ESC untuk menyerah")).

info_gerak(end):-
  G_info:=G_info-5,(G_info= -250 -> G_info:=500).



%~~~~~~~~~limit maen~~~~~~~~~~~~~~
tampilan_limit(_):-
text_out(250,20,print(G_limit)).

limit_survive(end):-
  G_limit:=G_limit-1,(G_limit=0 ->set_pause(_),
message("You Win !!","\t\tSelamat!! \nAnda Telah Berhasil Bertahan Dari Serangan Musuh",i),die(_),update_window(_)).



%!!!!!!!!notif kalo kalah!!!!!!!!
tampilan_kalah(_):-
die(_),update_window(_),
message("You Lose !!!","\t\tMaaf \nPesawat Anda Telah Hancur dan Anda Dinyatakan Gugur :(",!),
fail.

%***********main************
window_game(init) :- !,
  G_HighScore := 0, G_LastShipWay := 0,
  pen(5, rgb(0,0,0)),
  X is 1/30,
  G_limit := set_timer(_,1.0,limit_survive),
  G_gerak := set_timer(_,0.1,info_gerak),
  G_Timer := set_timer(_, X, do_timer),
  fail.

%********* Tampilan main *************
window_game(paint):- 
  G_player_color:=brush(rgb(0,0,0)), G_enemy_color:=brush(rgb(200,0,200)), G_Red:=brush(rgb(250,0,0)),
  width(W), height(H),
  brush(rgb(10, 10, 10)),
  draw_bitmap(0,0,G_sky,_,_),
  paint_score(_),
  not(dead),
  brush(G_player_color),
  tampilan_limit(_),
  bar_HP(_),
  tampilan_info(_),
  paint_player(_),
  draw_player_bombs(_),
  brush(G_enemy_color),
  draw_enemies(_),
  draw_enemy_bombs(_),
  fail.

window_game(close) :- !,
      kill_timer(G_layer2, G_Timer),
      fail.

%=======================================Bentuk Player
paint_player(_) :- !,
  X is G_X, Y is G_Y,
  X1 is ship_left(X),
  X2 is ship_right(X),
  YY is ship_up(Y),
  fill_polygon(X1+20,Y, X2+10,Y, X+15,YY-20), %badan kanan
  fill_polygon(X1-10,Y, X2-20,Y, X-15,YY-20), %badan kiri
  fill_polygon(X+20,Y, X2+30,Y, X+20,YY),  %sayap kanan
  fill_polygon(X1-30,Y, X-20,Y, X-20,YY),  %sayap kiri
  fill_polygon(X1,Y, X2,Y, X,YY-40),  %badan kapal
  fill_polygon(X+5,Y+10, X2+20,Y+35, X+5,YY+10), %ekor kanan
  fill_polygon(X1-20,Y+35, X-5,Y+10, X-5,YY+10),  %ekor kiri
pen(2,rgb(0,0,255)), 
  line((X,YY,X1,Y),(X,YY,X2,Y),(X1,Y,X2,Y)).


%~~~~~~~~~~~~~ Menu pada saat pemilihan level ~~~~~~~~~~
paint_score(_) :- dead, !,
 
  text_out(197,40,"Select Level"),
  text_out(180, 80, "1 - Easy"),
  text_out(180, 110, "2 - Normal"),
  text_out(180, 140, "3 - Don't Try This"),
  text_out(180, 170, "4 - Back To Main Menu"),
 
  text_out(180, 260, "F12 - Help"),
  text_out(180, 230, "HighScore"),
  text_out(260, 230, ":"),
  text_out(280, 230, print(G_HighScore)).

paint_score(_) :- !,
 
  text_out(20,20,"HighScore"),
  text_out(99,20,":"),
  text_out(114,20,print(G_HighScore)),
  text_out(20,50,"Score"),
  text_out(99,50,":"),
  text_out(114,50,print(G_Score)).

%=======================Bentuk musuhnye==============
draw_enemies(_) :- !, enemy_ships(L), d_e(L).
d_e([]) :- !.
d_e([ship(_, X, Y)|T]) :- !,
  ship_half_width(HW), ship_height(SH),
  X1 is ship_left(X),
  X2 is ship_right(X),
  YY is ship_up(Y),
  fill_polygon(X1,YY, X2,YY, X, Y), d_e(T).

%===================bentuk tembakan musuh===========
draw_enemy_bombs(_) :- !, enemy_bombs(L), d_eb(L).
d_eb([]) :- !.
d_eb([bomb(_, X, Y)|T]) :- !,
  Y1 is Y - 7,
  XX is round(X),
  YY is round(Y),
  YY1 is round(Y1),
  fill_polygon(XX - 1,YY, XX + 1,YY, XX + 1, YY1, XX - 1, YY1), d_eb(T).

%@@@@@@@@@@ bentuk tembakannye @@@@@@@@@@@@@
draw_player_bombs(_) :- !, player_bombs(L), d_pb(L).
d_pb([]) :- !.
d_pb([bomb(AutoFire, X, Y)|T]):- !,
  Y1 is Y + 7,
  XX is round(X),
  YY is round(Y),
  YY1 is round(Y1),
  (Condition is f ->
    (AutoFire is 1 -> brush(G_Red) else brush(G_player_color))
  ),
  fill_polygon(XX+20 ,YY, XX+20 ,YY, XX+20 , YY1, XX+20 , YY1),
  fill_polygon(XX-20 ,YY, XX-20 ,YY, XX-20 , YY1, XX-20 , YY1), d_pb(T).

assert_autofire(_) :- autofire, !, retract(autofire).
assert_autofire(_) :- !, assert(autofire).

set_pause(_) :- paused, !, retract(paused).
set_pause(_) :- !, assert(paused).



%---------------------pilihan kembali-----------
pilihan_back(press):-
beep("sound\\Lock.wav"),
close_window(G_layer2),
window(G_layer1,_,window_menu(_),"Menu progress", 450,100,500,500).

set_moving(D) :- !, G_DirectionTimer := 1, G_D := D.

%bbbbbbbbbbbbbbbb Pengecekan tubrukan terhadap kapal musuh dddddddddddddddddd
check_collisions(_) :- !, enemy_ships(EShips), enemy_bombs(EBombs), check_es(EShips, NewShips), check_eb(EBombs), retract(enemy_ships(_)), assert(enemy_ships(NewShips)).
check_es([],[]) :- !.
check_es([ship(D, X, Y)|T], []) :- X1 is G_X, Y1 is G_Y, crash(X, Y, X1, Y1), !, bar_ngurang(_).
check_es([ship(D, X, Y)|T], [ship(D, X, Y)|R]) :- survive_enemy(X, Y), !, check_es(T, R).
check_es([ship(D, X, Y)|T], R) :- !, (G_AutoFired is 0 -> G_Score := G_Score + G_PTS else G_Score := G_Score - G_PTS),
  (G_HighScore < G_Score -> G_HighScore := G_Score), G_Difficulty := G_Difficulty + 2, check_es(T, R).

survive_enemy(X, Y) :- !, player_bombs(Bombs), s_e(X, Y, Bombs).

s_e(_, _, []) :- !.
s_e(X, Y, [bomb(AutoFire, BX, BY)|T]) :- is_in_ship(X, Y, BX, BY), !, G_AutoFired := AutoFire, fail.
s_e(X, Y, [bomb(_, _, BY)|T]) :- !, s_e(X, Y, T).

%bbbbbbb pengecekan tubrukan terhadap serangan musuh dddddddddddd
check_eb([]) :- !.
check_eb([bomb(_, BX, BY)|T]) :- X1 is G_X, Y1 is G_Y, is_in_ship(X1, Y1, BX, BY), !, bar_ngurang(_).
check_eb([bomb(_, BX, BY)|T]) :- !, check_eb(T).

fire_enemies(_) :- !, enemy_ships(L), f_e(L).
f_e([]) :- !.
f_e([ship(_, X, Y)|T]) :- !, fire_enemy(X, Y), f_e(T).

%\\\\\\\\\\\\\\\\ Perintah2 pada saat pause ///////////////
do_timer(end) :- not(dead), !,
  (paused -> text_out(220,165,"Paused"),
  text_out(130,200,"W/A/S/D : untuk menggerakkan pesawat"),
  text_out(180,230,"K : untuk menyerang"),
  text_out(175,260,"ESC : untuk menyerah"),
 fail),
  (autofire -> assert(firing)),
  fire_player(_),
  fire_enemies(_),
  update_positions(_),
  check_collisions(_),
  S is G_EnemySpeed,
  G_LastShipWay := G_LastShipWay + S,
  add_enemy(_),
  update_window(_),
  fail.

do_timer(end) :- !,
  paint_sleeping(_), fail.

paint_sleeping(_) :- first_sleeping_paint, !, retract(first_sleepint_paint), update_window(_).
paint_sleeping(_) :- !.

%^-------------------------Gamenya----------------------^

 
%------------------------------------------fungsi pencetan di menu awal

       window_menu(key_down(49,_)):-                                 %1
              new_window2(_) .    

       window_menu(key_down(50,_)):-                                 %2
              about_game(_).
      
       window_menu(key_down(51,_)):-                                 %3
              pilihan_help(_).

       window_menu(key_down(52,_)):-                                 %4
              pilihan_exit(_).
      
      

%----------------------pencetan di gamenye

window_game(key_down(87,_)):-                                 %W
              set_moving(1).      

window_game(key_down(65,_)):-                                 %A
              set_moving(2).      

window_game(key_down(68,_)):-                                 %D
              set_moving(3).      

window_game(key_down(83,_)):-                                 %S
              set_moving(4).      

window_game(key_down(80,_)):-                                 %P
              set_pause(_).
      
window_game(key_down(81,_)):-                                 %Q
              assert_autofire(_).
      
window_game(key_down(75,_)):-                                 %K
              not(autofire), assert(firing),execute("nembak.exe").
      
window_game(key_down(27,_)):-                                 %ESC
              die(_), update_window(_).
      
window_game(key_down(49,_)):-                                 %1
              start_game(100, 5,  3), beep("sound\\gun.wav").
      
window_game(key_down(50,_)):-                                 %2
              start_game(150, 7,  5), beep("sound\\gun.wav").
      
window_game(key_down(51,_)):-                                 %3
              start_game(300, 3, 10), beep("sound\\gun.wav").
      
window_game(key_down(52,_)):-                                 %4
              pilihan_back(_).
      
window_game(key_down(123,_)):-                                %F12
              pilihan_help(_).



 GLOSORIUM

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.

Algoritma Breadth First Search (BFS)
Breadth-first search adalah algoritma yang melakukan pencarian secara melebar yang mengunjungi simpul secara preorder yaitu mengunjungi suatu simpul kemudian mengunjungi semua simpul yang bertetangga dengan simpul tersebut terlebih dahulu. Selanjutnya, simpul yang belum dikunjungi dan bertetangga dengan simpulsimpul yang tadi dikunjungi , demikian seterusnya. Jika graf berbentuk pohon berakar, maka semua simpul pada aras d dikunjungi lebih dahulu sebelum simpul-simpul pad aras d+1.


AI
AI (Artificial Intelligence) yaitu kecerdasan buatan, dimana AI akan mengontrol pergerakan karater yang sudah dibuat dalam menentukan jalur mendapatkan apel dan menghidari dari tabrakan dengan dirinya sendiri dan pembatas yang ada pada area permainan.

HP
Health Point (HP) merupakan sebuah poin atau nilai yang menyatakan sebuah tingkat kesehatan atau nyawa yang tersedia pada awal permainan. Pada umunya HP digunakan untuk memberikan kesempatan hidup player di dalam game, sehingga player tidak mengalami one hit KO (mati seketika jika terkena sekali serang).


         MEIDIANA DWI ANDYNI
                      3IA14
                   55413407