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
loading akan berlangsung sampai 100% dan membuka menu utama
2. Main Menu
3. In-game
4. In-game
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(_).