Minggu, 22 Mei 2016

Tugas 3 Pengantar Teknologi Game



Sniper Shootin Gallery

Sniper Shooting Gallery adalah game Matches yang bertema Dota 2 Reborn. Dimana Player dan AI akan saling bergantian menembak target namun akan berusaha untuk menyisakan satu target agar target tersebut terpaksa ditempak oleh musuh. Player atau AI yang menembak target terakhir adalah yang kalah
Pemain akan bergantian menembak target dengan AI. Game ini dimainkan cukup dengan menggunakan mouse. Player dan AI akan menembak habis seluruh target secara bergantian. Anda sebagai pemain bertujuan untuk menembak target dan menyisakan satu target untuk mengalahkan AI
Permainan akan berakhir ketika semua target telah berhasil ditembak. Dan player akan menang bila AI menembak target terakhir (Dalam mode default)
Berikut adalah beberapa tampilan dari game :

1.       Splash Screen
loading akan berlangsung sampai 100% dan membuka menu utama
2. Main Menu


3. In-game

4. In-game

5. Win
 

6.  Lose


RULES
Ø  Berikut adalah aturan bermain di dalam game ini.
Ø  Tunggu sampai Sound berakhir dan klik Ok untuk memulai.
Ø  Pemain diberikan kesempatan untuk membunuh Creep pertama.
Ø  Pemain bisa menjadi giliran kedua jika di atur pada menu mode.
Ø  Pemain diberikan keleluasaan untuk mengambil berapapun Creep yang ada asalkan masih pada kolom yang sama.
Ø  Dilarang mengklik diluar icon Creep karena terkadang terjadi Bug. Jika terjadi bug anda bisa menggunakan menu Ulang untuk mengulang permainan.
Ø  Komputer telah dirancang untuk menyisakan satu telur terakhir. Karena yang mengambil telur terakhir adalah yang kalah.
Ø  Dan pada menu mode terdapat perubahan system game yang merubah aturan menjadi pengambil telur terakhir dialah pemenangnya.


Konsep AI
        Player dan AI akan bersaing untuk saling mengambil ikon, namun baik player maupun AI harus berusaha agar jangan sampai mengambil ikon yang terakhir. Dalam game ini (mode Default) Player atau AI yang mengambil ikon terakhir akan dianggap kalah.

Algoritma yang Dipakai
1.       Backtracking (DFS)
Pada game Sniper Shooting Gallery ini menggunakan algoritma Backtracking. Algoritma backtracking menggunakan algoritma berbasis DFS untuk mencari solusinya. Algoritma Backtraking ini tergolong hemat waktu tidak seperti algoritma Bruteforce yang mencari semua kemungkinan solusi, Backtraking hanya menampilkan pencarian yang mengarah ke solusi saja. Otak yang diberikan kepada computer adalah dia akan selalu berusaha untuk menyisakan satu ikon untuk Player. Dengan algoritma ini pastinya perhitungan ini akan cepat untuk diproses.
2.       Greedy
Algoritma Greedy akan mencari nilai optimum dalam penyelesaian masalah. Karena dalam permainan ini kita mencari solusi yang paling tepat dalam penyelesaian masalah yaitu jangan sampai mengambil icon yang terakhir, maka menurut saya algoritma greedy ini pas untuk diterapkan dalam permainan matches
Berikut adalah listing dari program yang saya buat :

LISTING PROGRAM

/*=================================================================
* Judul Game            : Sniper Shooting Gallery
* Bahasa Pemrograman    : Strawberry Prolog
* Pengembang            : Dilan Kusuma, 3IA14
* NPM                   : 52413460
* =================================================================
*/

?-

Red_and_Bold is font_mask(_,rgb(255,0,0),_,_,_,bold,_,_),

set_default(font_mask(default,_,"Times New Roman",18,_,_,_,_)),

write("Clear The Stars"),

write("Strawberry Prolog", Red_and_Bold), nl,


%==================  memberi nilai awal =====================

G_Comp_First=0,

G_Take_Last=0,


%------ memasukkan alamat gambar -----

G_gambar is bitmap_image("splash.bmp",_),

G_background is bitmap_image("field2.bmp",_),

G_star is bitmap_image("creep.bmp",_),

G_menu is bitmap_image("MainMenu.bmp",_),

G_help is bitmap_image("help.bmp",_),

G_boom is bitmap_image("boom.bmp",_),

G_menang is bitmap_image("win.bmp",_),

G_kalah is bitmap_image("lose.bmp",_),

window(G_Splash, _, windows(_),"Loading",200,200,1000,450).
%=============================================================

windows(init):-  % set timer

G_batas := 0,

G_waktu is set_timer(_,0.01,fungsi_timer).

windows(paint):- %memberi Background

draw_bitmap(0,0,G_gambar,_,_).

fungsi_timer(end):-  %fungsi timer

text_out(700,340,print("Now Loading...")),
text_out(730,360,print(G_batas + " %")),

G_batas := G_batas +1,

(G_batas >= 100 -> close_window(G_Splash),
execute("Battle.exe"),

window(G_screen,_,win_menu(_),"Sniper Shooting Gallery",350,10,800,650)).

win_menu(paint):-

draw_bitmap(0,0,G_menu,_,_).

win_menu(close):-

close_window(G_screen),write("close G_screen ").

%-----pembuatan button pada window utama----

win_menu(init):-

button(_,_,start(_),"Play Now",100,550,90,45),

button(_,_,how(_),"How to Play",250,550,90,45),

button(_,_,about(_),"About",400,550,90,45),

button(_,_,exit(_),"Exit",550,550,90,45).

%==========================================================

start(press):-

close_window(G_screen),

update_window(_),

pen(0,0),

menu_new(_),

window(G_game, _,win_game(_), "Sniper Shooting Gallery",(350,10,800,615)),

beep("Lock.wav").

%=========================================================

%-----tampilan jika mengklik button how to play--

how(press):-

shell_execute("howto.html").

update_window(_).

%----tampilan jika mengklik button about----

about(press):-

shell_execute("about.html").
    
update_window(_).

%=======================================================

%-----tampilan jika mengklik button exit----

exit(press):-

execute("lalala.bat"),

close_window(G_screen),write("close G_screen ").

%=============================================================

%-------function utama dari game------

win_game(init) :-

menu( normal, _, _, menu_home(_), "Home"),

menu( normal, _, _, menu_new(_), "New Game"),

menu( pop_up, _, _, menu_level(_), "Change Level"),

menu( normal, _, _, menu_options(_), "&Mode"),

menu( right, _,_, menu_help(_), "Help"),

menu( right, _, _, menu_exit(_), "Quit Game").

%=============================================================

menu_home(press):-

close_window(G_game),window(G_screen,_,win_menu(_),"Sniper Shooting Gallery", (350,10,800,650)).

%----- ketika menekan menu new game ------

menu_new(press) :-

beep("Lock.wav"),

set(pos([5,4,2,2,4,5])),

set(lose_flag(false)),

update_window(_),

(G_Comp_First=0->

set(pos([5,4,2,2,4,5]))

else

Pos=[5,4,2,2,4,5],

N is 2*random(3),

el(Pos,A, N),

A2 is A-2,

replace(Pos2, Pos, A2, N),


set(pos(Pos2))),

update_window(_).

%======================================================

%=================== Change Level =====================

menu_level(init):-

menu( normal, _, _, level1(_), "Level Easy"),

menu( normal, _, _, level2(_), "Level Medium"),

menu( normal, _, _, level3(_), "Level Hard").

%============= Level 1,2,3 ==================

level1(press):-

beep("Lock.wav"),

set(pos([5,4,2,2,4,5])),

set(lose_flag(false)),

update_window(_).

level2(press):-

beep("Lock.wav"),

set(pos([3,4,5,5,4,3])),

set(lose_flag(false)),

update_window(_).

level3(press):-

beep("Lock.wav"),

set(pos([5,4,5,5,4,5])),

set(lose_flag(false)),

update_window(_).

%===================Menu Mode=======================

menu_options(press) :-

  window_n( _, _, options_func, "Options", 200, 100, 300,200,?,_,_).
options_func(init) :-
  check_box( A, _, check_func, "AI Shoot First", 20, 20,200, 20),
  G_A:=A,
  set_check_box_value(G_A,G_Comp_First),
  check_box( B, _, check_func, "Last Shot Wins", 20,60, 200, 20),
  G_B:=B,
  set_check_box_value(G_B,G_Take_Last),
  button( _, _, ok_func(_), "OK", 20, 120, 80, 30),
  button( _, _, cancel_func(_), "Cancel", 120, 120, 80, 30).


ok_func(press) :-
  G_Comp_First:=get_check_box_value(G_A),
  G_Take_Last:=get_check_box_value(G_B),
  (G_Take_Last=1->
    set_text("Sniper Shooting Gallery (Take The Last Shot)",G_Main)
  else
    set_text("Sniper Shooting Gallery (Don't Shot The Last)",G_Main)),
  close_window(parent(_)).

cancel_func(press) :-
  close_window(parent(_)).

check_func(press) :-
  set_check_box_value(_,1-get_check_box_value(_)).

%====================Menu Help======================

menu_help(press) :-

draw_bitmap(0,0,G_help,_,_),
message("Game Rules","Sniper dan AI akan saling menembak target secara bergantian.
Boleh menembak berapapun dengan syarat target yang ditembak masih dalam satu kolom.
Jika Human menembak target yang terakhir maka player akan kalah.

Ayo Bunuh Creep!!!",i),
update_window(_).

%----- ketika menekan menu exit -----

menu_exit(press) :-

beep,

message("Exit","Thank you for playing Sniper Shooting Gallery",i),

write("menu exit press"),nl,

execute("lalala.bat"),

close_window(_).

%======================================================

win_game(close) :-

write("close win_game "),nl,

close_window(G_game).

win_game(paint):-

draw_bitmap(0,0,G_background,_,_),

pos(Pos),

el(Pos,El,N),

for(I,1,El),

%=======================================================

% Jarak antara masing-masing item

X is 120+60*N,

Y is 335- 40*I,

% Untuk bentuk item

draw_bitmap(X,Y,G_star,_,_),fail.

%=======================================================

%------Deklarasi Area Mouse Klik----

win_game(mouse_click(X,Y)):-

beep,

X1 is (X- 120)//60,

Y1 is (335-Y)//40,

X1=<5,X>=40,

pos(Pos),

el(Pos,El,X1),

El>Y1,

replace(Pos2, Pos, Y1, X1),

beep("gun.wav"),

(Pos2=[0,0,0,0,0,0]->

set(pos(Pos2)),

end(0)

else

wait(0.5),

beep("Lock.wav"),

play(Pos3, Pos2),

(Pos3=[0,0,0,0,0,0]->

end(1)),

set(pos(Pos3))),

update_window(_).

win_game(mouse_click(X,Y)):-

beep("blop.wav").

%=============================================================

%------AI dari game Des fight itu sendiri----

play(Pos3, Pos2):-

G_Take_Last=0,

write("komputer ngambil"),nl,

count_successes(not_trivial(Pos2))<4, find_max(Pos2,Max,N), New is (Max>1,count_successes(not_empty(Pos2)) mod 2=:=1 -> 1 else 0),

replace(Pos3, Pos2, New, N).

play(Pos3, Pos2):-

el(Pos2,A, N),

R:=0,

add_xor(R,Pos2,N),

R<A, replace(Pos3, Pos2, R, N),update_window(_). play(Pos3, Pos2):- find_max(Pos2,Max,N), Max2 is (Max>1, random(2)=:=0 ->

Max-2

else

Max-1),

replace(Pos3, Pos2, Max2, N).

not_empty(Pos):-

el(Pos,A, _),

A>1.

not_trivial(Pos):-

el(Pos,A, _),

A<0.

el([H|T],H,0).

el([H|T],El,N):-

el(T,El,N1),

N is N1+1.

replace([H|T],[_|T],H,0).

replace([H|T2],[H|T],El,N):-

replace(T2,T,El,N1),

N is N1+1.

find_max([H],H,0).

find_max([H|T],A, N) :-

find_max(T,A1,N1),

(A1<H->

A is H,
N is 0

else
A is A1,
N is N1+1).

add_xor(_,[],_):-!.

add_xor(R,[H|T],0):- !,

add_xor(R, T, -1).

add_xor(R,[H|T],N):-

N1 is N- 1,

R:=R xor H,

add_xor(R, T, N1).

%=============================================================

%------- notif menang atau kalah ------

end(Flag):-

Flag=G_Take_Last->

draw_bitmap(0,0,G_boom,_,_),
beep("boom.wav"),
wait(0.5),
draw_bitmap(0,0,G_kalah,_,_),
beep("lose.wav"),

message("You Lose","Your Ancient Has Been Destroyed",i),menu_new(_)

else
draw_bitmap(0,0,G_boom,_,_),
beep("boom.wav"),
wait(0.5),
draw_bitmap(0,0,G_menang,_,_),
beep("win.wav"),

message("Win Win","You Gained Enough Gold to Crush Their Ancient",i),

set(lose_flag(false)),

update_window(_).