Bahasa dan Program Editor
Game ini menggunakan bahasa pemrograman Prolog. Dan disini penulis menggunakan Strawberry Prolog sebagai program editor. Alasan penulis menggunakan strawberry prolog ini karena menurut penulis Strawberry Prolog mudah untuk digunakan.
Initial State
Game "Gogeta : Rival" merupakan game yang memiliki gameplay bidak pemain yang melawan bidak musuh (AI) , dan memiliki tujuan untuk menghentikan jalannya pergerakan lawan. Pemain memiliki 4 buah bidak , sedangkan musuh hanya memiliki 1 buah bidak. Bidak pemain dan bidak musuh sama - sama memiliki bentuk lingkaran. Untuk bidak pemain, bidaknya bergambar karakter Goku didalamnya, sedangkan untuk bidak musuh , bidaknya bergambar karakter Vegeta didalamnya. Bidak pemain dan bidak musuh hanya memiliki satu kali kesempatan jalan secara bergantian. Bidak pemain dan bidak musuh hanya mampu menggerakkan bidaknya secara serong (miring). Khusus untuk bidak pemain , apabila salah satu bidaknya sudah maju , maka tidak bisa memundurkan kembali posisi bidaknya. Namun hal itu tidak berlaku bagi musuh. Musuh bisa menggerakkan bidaknya maju ataupun mundur. Bidak pemain harus bisa menghentikan jalannya pergerakan bidak musuh. Jangan sampai bidak musuh mencapai posisi awal bidak anda. Apabila itu terjadi, maka anda akan kalah. Namun , apabila bidak musuh sudah dikepung atau sudah tidak bisa melangkah maju ataupun mundur lagi, maka anda menang. Pada interface game sebelum masuk ke menu utama game ini, terdapat splash screen sebagai loading proses masuk ke menu utama.
Rules (Aturan Main)
Aturan main (rules) yang digunakan dalam permainan "Gogeta : Rival" ini adalah sebagai berikut :
1. Pemain (user) menjalankan 4 buah bidak berbentuk lingkaran yang bergambar karakter Goku.
2. Dalam game ini, user-lah yang berjalan atau mengambil langkah terlebih dahulu, kemudian dilanjutkan oleh AI.
3. Baik pemain dan AI hanya mampu berjalan serong (miring), satu kali kesempatan jalan (pindah) secara bergantian.
4. Pemain hanya bisa berjalan ke arah serong kanan dan serong kiri, namun tidak bisa kembali ke posisi semula atau mundur ke belakang.
5. Sedangkan AI dapat berpindah ke arah serong kanan dan serong kiri, serong belakang, ataupun posisi semula.
Goal
Goal untuk menyelesaikan permainan "Gogeta : Rival" ini adalah ketika pemain dapat mengepung AI, sehingga langkah AI pun mati (tidak bisa jalan lagi). Atau, jika AI dapat lolos dari pemain dan mencapai posisi awal bidak pemain.
- Kondisi menang Untuk memenangkan permainan ini , pemain dapat mengepung AI, sehingga AI tidak dapat berpindah lagi.
- Kondisi Kalah Kondisi kalah adalah kondisi dimana AI dapat lolos dan berhasil mencapai posisi awal bidak pemain.
Konsep AI
Kecerdasan buatan pada game ini adalah pergerakan dari bidak musuh. AI yang berwujud bidak ini bergerak berdasarkan posisi dari bidak pemain. Bidak musuh bergerak menghindari kepungan dari bidak pemain, berusaha agar pergerakannya tidak dimatikan oleh bidak pemain, serta berusaha untuk mencapai posisi awal dari bidak pemain.
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. Pada permainan ini, AI menggunakan Algoritma Minimax. Algoritma Minimax merupakan algoritma yang digunakan untuk menentukan pilihan agar memperkecil kemungkinan kehilangan nilai maksimal. Algoritma ini diterapkan dalam permainan yang melibatkan dua pemain dan permainan yang menggunakan strategi atau logika lainnya. Hal ini berarti permainan - permainan tersebut dapat dijelaskan sebagai suatu rangkaian aturan.
Algoritma Minimax merupakan basis dari semua permainan berbasis AI , misalnya seperti permainan satu lawan banyak, dimana algoritma ini akan melakukan pengecekan pada seluruh kemungkinan yang ada sampai akhir permainan dilakukan. Pengecekan tersebut akan menghasilkan pohon permainan yang berisi semua kemungkinan tersebut. Tentunya dibutuhkan resource yang berskala besar untuk menangani komputasi pencarian pohon solusi tersebut. Keuntungan yang didapat dengan menggunakan Algoritma Minimax yaitu, mampu menganalisis segala kemungkinan posisi permainan untuk menghasilkan keputusan yang terbaik , karena Algoritma Minimax ini bekerja secara rekursif dengan mencari langkah yang akan membuat lawan mengalami kerugian minimum. Semua strategi lawan akan dihitung dengan algoritma yang sama dan seterusnya. Ini berarti , pada langkah pertama komputer akan menganalisis seluruh pohon permainan. Dan untuk setiap langkahnya, komputer akan memilih langkah yang paling membuat lawan mendapatkan keuntungan minimum, dan yang paling membuat komputer itu sendiri mendapatkan keuntungan maksimum.
Listing Program
%==============Gogeta :
Rival===================%
%===Game ini dikembangkan dari game Row untuk
Project PKB====%
%============================================================%
%======Nama : NABIL======================%
%======NPM : 55412193===================%
%======Kelas : 3IA12======================%
%======Tahun : 2014=======================%
%======================================================%
%============Laboratorium Teknik
Informatika===========%
%=================Universitas
Gunadarma================%
%======================================================%
%=========================2014=========================%
%======================================================%
?-
%---Inisialisasi Gambar yang dipakai-------------------%
G_dbkai
is bitmap_image("Gambar//dbkai.bmp",_),
G_songokuvsvegeta is bitmap_image("Gambar//songokuvsvegeta.bmp",_),
G_genkidama
is bitmap_image("Gambar//genkidama.bmp",_),
G_song2
is ("Audio\\button.wav"),
window(_,_,splash_start(_),"Welcome", 400,100,600,525).
splash_start(init):-
G_batas := 0,
waktu is set_timer(_,0.05,fungsi_timer).
splash_start(paint):-
draw_bitmap(0,0,G_dbkai,_,_).
fungsi_timer(end):-
text_out(25,400,print("Loading : ")),
text_out(25+G_batas,420,print(" ")),
%draw_bitmap(30+(G_batas*2),150,G_bidak,_,_),
G_batas := G_batas + 6,
(G_batas
>= 505,close_window(_), window(G_pertama,_,win_func2(_), "Menu", 400,100,600,525)).
%------------Deklarasi
Window--------------------------------------%
window(G_pertama,_,win_func2(_), "Gogeta :
Rival", 400,100,600,525).
win_func2(paint):-
draw_bitmap(0,0,G_songokuvsvegeta,_,_),
fail.
%=============Inisiasi tombol Window
Menu=========%
win_func2(init):-
button(_,_,win_how(_),"Start
Game",260,200,100,30),
button(_,_,win_cara(_),"How to
Play",260,250,100,30),
button(_,_,win_about(_),"About",260,300,100,30),
button(_,_,win_exit(_),"Exit",260,350,100,30).
%------------How to
Play-------------------------%
win_cara(press):-
beep(G_song2),
shell_execute("howtoplay.html").
%-------------About--------------------------%
win_about(press):-
beep(G_song2),
shell_execute("aboutgame.html").
fail.
%----------------------Exit----------------%
win_exit(press):-
beep(G_song2),
close_window(G_pertama),
fail.
%---------------------koding game
------------------------%
win_how(press):-
beep(G_song2),
close_window(G_pertama),
execute("Audio\\lagu.exe"),
pen(0,0),
G_R:=brush(rgb(255,160,0)),
G_X:=brush(rgb(255,255,255)),
G_B:=brush(rgb(70,70,200)),
G_O:=brush(rgb(255,0,0)),
set(pos([ [x,b,x,b,x,b,x,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,o] ])),
G_Br=4,
G_I =0,
G_J =0,
G_K =0,
G_think1=0,
G_think2=0,
window(_,_,win_func(_),"Gogeta : Rival",400,100,473,510).
win_func(paint):-
draw_bitmap(0,0,G_genkidama,_,_),
fail.
%----------------mendeklarasikan fungsi
inisialisasi yang berisi menu---------------------
win_func(init):-
menu(pop_up,_,_,menu_pilihan(_),"&Pilihan").
menu_pilihan(init):-
menu(normal,_,_,start_game(_),"&Mulai Baru"),
menu(normal,_,_,menu_exit(_),"&Keluar").
win_func(init).
start_game(press) :-
beep(G_song2),
set(pos([[x,b,x,b,x,b,x,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,r],
[r,b,r,b,r,b,r,b],
[b,r,b,r,b,r,b,o]])),
set(lose_flag(false)),
update_window(_).
menu_exit(press):-
beep(G_song2),
close_window(_),
execute("Audio\\taskill.bat").
win_func(close):-
beep(G_song2),
close_window(_),
execute("Audio\\taskill.bat").
chetno(0).
chetno(X) :-
X>0, Y := (X - 2),chetno(Y).
win_func(paint) :-
text_out(5,37,"8"),
text_out(5,87,"7"),
text_out(5,137,"6"),
text_out(5,187,"5"),
text_out(5,237,"4"),
text_out(5,287,"3"),
text_out(5,337,"2"),
text_out(5,387,"1"),
text_out(425,37,"8"),
text_out(425,87,"7"),
text_out(425,137,"6"),
text_out(425,187,"5"),
text_out(425,237,"4"),
text_out(425,287,"3"),
text_out(425,337,"2"),
text_out(425,387,"1"),
text_out(37,425,"A"),
text_out(87,425,"B"),
text_out(137,425,"C"),
text_out(187,425,"D"),
text_out(237,425,"E"),
text_out(287,425,"F"),
text_out(337,425,"G"),
text_out(387,425,"H"),
text_out(37,0,"A"),
text_out(87,0,"B"),
text_out(137,0,"C"),
text_out(187,0,"D"),
text_out(237,0,"E"),
text_out(287,0,"F"),
text_out(337,0,"G"),
text_out(387,0,"H"),
for(I,0,7),
for(J,0,7),
X is 20 + 50 * I,
Y is 20 + 50 * J,
X1 is X + 50,
Y1 is Y + 50,
Z is I + J,
(chetno(Z) ->
color(r) ;
color(b)
),
rect(X,Y,X1,Y1),
fail.
win_func(paint):-
drawing(I,J),
fail.
drawing(I,J):-
pos(Table),
member(Table,El,I,J),
color(El),
calculate(I,J,A,B,C,D),
ellipse(A,B,C,D).
calculate(X,Y,X1,Y1,X2,Y2):-
X1 is 30 + X*50,
Y1 is 30 + Y*50,
X2 is X1 +30,
Y2 is Y1 +30.
convert(I,J,X,Y):-
X>20, Y>20,Y<420, X<420,
A is X - 20,
B is Y - 20,
I is A// 50,
J is B// 50.
win():-
pos(Table),
member(Table,o,_,Yo),
member(Table,x,_,Yx),!,
(Yx>=Yo ,G_Br=4->
message("Oh No !","Anda Kalah",!);
X :=5
),
Yo>0.
move(Table,X,Y,Deep):-
nolose(Table,X,Y,_,_),
think1(Table,X,Y,Deep),
think2(Table,X,Y,Deep),
(G_think1 >
G_think2->
nolose(Table,X,Y,I,J);
(G_think1 <
G_think2->
nolose1(Table,X,Y,I,J);
think(Table,X,Y,I,J)
)
),
promqna(X,Y,o),
promqna(I,J,o).
nolose(Table,X,Y,A,B):-
A is X - 1,
B is Y - 1,
proverka(Table,A,B).
nolose(Table,X,Y,A,B):-
A is X + 1,
B is Y - 1,
proverka(Table,A,B).
nolose(Table,X,Y,A,B):-
A is X - 1,
B is Y + 1,
proverka(Table,A,B).
nolose(Table,X,Y,A,B):-
A is X + 1,
B is Y + 1,
proverka(Table,A,B).
nolose1(Table,X,Y,A,B):-
A is X + 1,
B is Y - 1,
proverka(Table,A,B).
nolose1(Table,X,Y,A,B):-
A is X - 1,
B is Y - 1,
proverka(Table,A,B).
nolose1(Table,X,Y,A,B):-
A is X + 1,
B is Y + 1,
proverka(Table,A,B).
nolose1(Table,X,Y,A,B):-
A is X - 1,
B is Y + 1,
proverka(Table,A,B).
proverka(Table,X,Y):-
X<8, Y<8, X>=0, Y>=0,
member(Table,Element,X,Y),
Element=r.
think(Table,X,Y,K,L):-
(X < 4->
nolose1(Table,X,Y,K,L);
nolose(Table,X,Y,K,L)
).
think1(Table,X,Y,0):-
G_think1 := Y.
think2(Table,X,Y,0):-
G_think2 := Y.
think2(Table,X,Y,Deep):-
Deep1 is Deep - 1,
nolose(Table,X,Y,K,L),
think2(Table,K,L,Deep1).
think1(Table,X,Y,Deep):-
Deep1 is Deep - 1,
nolose1(Table,X,Y,K,L),
think1(Table,K,L,Deep1).
promqna(I,J,El):-
pos(Table),
member(Table,Element,I,J),
(Element =r , G_Br=3 ,I> G_I - 2 ,I<G_I + 2 ,J<G_J + 2 ,J>G_J - G_K ->
replace(Table,NewTable,El,I,J),
G_Br := 4
else (Element =El , G_Br=4->
replace(Table,NewTable,r,I,J) ,
G_Br :=3,
G_I :=I,
G_J :=J,
( Element =x->
G_K :=0;
G_K :=2
)
else
fail
)
),
set(pos(NewTable)),
drawing(I,J).
/*lose(Table):-
member(Table,o,X,Y),
not(nolose(Table,X,Y,_,_).
*/
win_func(mouse_click(X, Y))
:-
win(),
pos(Table),
member(Table,o,Xo,Yo),
nolose(Table,Xo,Yo,_,_),
convert(I,J,X,Y),
promqna(I,J,x),
pos(TableNew),
(G_Br=4 ->
(nolose(TableNew,Xo,Yo,_,_)->
move(TableNew,Xo,Yo,4);
(Yo=7->
message("Permainan Selesai","Selamat ,
Anda Menang !!",!);
message("Permainan Selesai","Draw
Game",!)
)
)
).
member(Table,El,X,Y):-
member(Table,Row,Y),
member(Row,El,X).
replace(Table,NewTable,NewEl,X,Y):-
member(Table,Row,Y),
replace(Row ,NewRow,NewEl,X ),
replace(Table,NewTable,NewRow,Y).
member([E,_,_,_,_,_,_,_],E,0).
member([_,E,_,_,_,_,_,_],E,1).
member([_,_,E,_,_,_,_,_],E,2).
member([_,_,_,E,_,_,_,_],E,3).
member([_,_,_,_,E,_,_,_],E,4).
member([_,_,_,_,_,E,_,_],E,5).
member([_,_,_,_,_,_,E,_],E,6).
member([_,_,_,_,_,_,_,E],E,7).
replace([_,A,B,C,D,E,F,G],[S,A,B,C,D,E,F,G],S,0).
replace([A,_,B,C,D,E,F,G],[A,S,B,C,D,E,F,G],S,1).
replace([A,B,_,C,D,E,F,G],[A,B,S,C,D,E,F,G],S,2).
replace([A,B,C,_,D,E,F,G],[A,B,C,S,D,E,F,G],S,3).
replace([A,B,C,D,_,E,F,G],[A,B,C,D,S,E,F,G],S,4).
replace([A,B,C,D,E,_,F,G],[A,B,C,D,E,S,F,G],S,5).
replace([A,B,C,D,E,F,_,G],[A,B,C,D,E,F,S,G],S,6).
replace([A,B,C,D,E,F,G,_],[A,B,C,D,E,F,G,S],S,7).
color(r):-brush(G_R).
color(x):-brush("Gambar//goku.bmp").
color(b):-brush(G_B).
color(o):-brush("Gambar//vegeta.bmp").
Output
Glosarium
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.
AI (Artificial Intelligence) : Suatu kecerdasan yang ditunjukkan oleh suatu entitas buatan, dimana suatu kecerdasan yang diciptakan dan dimasukkan ke dalam suatu mesin (komputer) dapat melakukan pekerjaan seperti yang dapat dilakukan oleh manusia.
Algoritma Minimax : Algoritma Minimax merupakan basis dari semua permainan berbasis AI, misalnya seperti permainan satu lawan banyak, dimana algoritma ini akan melakukan pengecekan pada seluruh kemungkinan yang ada sampai akhir permainan dilakukan.
Daftar Pustaka