Pada tugas Pengantar Teknologi Game ini kelompok saya
akan memberikan contoh game yang menggunakan AI (Artificial Intelligent).
Disini kita menggunakan prolog untuk membuat game tersebut.
· Rules
Untuk memainkan game ini, kita
harus memiliki kompiler strawberry prolog terlebih dahulu. Ini dikarenakan
penulis membuat aplikasi ini dengan strawberry prolog yang masih versi gratis,
sehingga tidak dapat dibuat menjadi object code berbentuk executable.
Game
ini menggunakan emote cool sebagai lawannya (AI)
dan emote love struck sebagai pemain (user). Aturan-aturan yang digunakan untuk bermain permainan
ini adalah pemain hanya bisa berjalan ke
arah diagonal maju (ke atas), sehingga tidak diperkenankan untuk mundur (ke bawah).
Tetapi jika kita sudah mencapai kotak lawan terjauh kita bisa mundur kebelakang untuk memakan emote lawan.
Begitu juga dengan lawannya.
Untuk
lebih jelas mengenai aturan bermainnya, brikut ini akan saya jelaskan secara
terperinci:
1. emot love struck bergerak pada kotak papan yang
tidak ditempati.
2. emot love struck bergerak secara diagonal
satu langkah.
3. emot love struck bisa bergerak secara diagonal
ke belakang jika di bagian belakang terdapat emot cool.
4. emot love struck bisa melompati lebih
dari satu token lawan dengan bergerak diagonal dan
zig-zag dengan melakukan gerakan dua langkah pada arah yang sama jika terdapat
kotak papan yang tidak ditempati pada jalur lompatan.
5. emot cool berubah menjadi emot
angry jika mencapai baris terjauh.
6. Permainan di mulai dengan
pemain hunter yang kemudian akan menghalangi pemain AI.
· Goal (Tujuan)
Tujuan dari game ini adalah
untuk memburu emote cool AI dengan cara memakannya yaitu dengan
melangkahkan emote cool AI dengan emot hunter secara diagonal pula. Kita bisa
bergerak mundur jika bertujuan untuk memakan emote lawan. Namun untuk memakan
bola emote lawan, syaratnya kita hanya bisa melangkahi 1 emote secara diagonal.
Semakin banyak memakan emote lawan
(AI), maka akan menguntungkan pihak yang memakan. Dan apabila pemain berhasil
menghabiskan emote lawan lebih dahulu, maka pemain hunter akan menang dan
berhasil mengalahkan pemain AI.
1. Win
Pemain dikatakan menang jika sudah memburu atau memakan paling banyak emote cool.
2. Loser
Pemain dikatakan kalah jika emot love sruck sudah tidak ada lagi di papan
permainan yang ada tinggal empat emot lawan. Satu emote cool dan tiga emot
devil. Ada tiga emote devil karena emote cool sudah mencapai kotak terjauh
lawan dan berubah menjadi emote devil.
· Algoritma
Pada permainan hunting emote ini akan mengimplementasikan algoritma Minimax dalam
permodelan AI. Algoritma Minimax(Minimax
algorithm) digunakan untuk menentukan pilihan agar memperkecil kehilangan nilai
maksimal. Algoritma ini dikembangkan berdasarkan teori game zero-sum
yang mendeskripsikan situasi dimana jika pemain mengalami pendapatan, pemain
lain akan mengalami kehilangan dengan nilai yang sama dari pendapatan tersebut,
dan sebaliknya. Jumlah pendapatan dari pemain yang dikurangi dengan jumlah
kehilangan akan berjumlah nol.
Teori minimax menyatakan untuk
setiap dua orang pemain dalam permainan terdapat nilai V dari strategi yang
dimiliki pemain seperti:
1. Strategi yang ditentukan
pemain hunter akan menghasilkan konsekuensi kemungkinan untuk pemain AI, V.
2. Strategi yang ditentukan
pemain AI akan menghasilkan konsekuensi kemungkinan untuk pemain Hunter, V.
Algoritma Minimax
merupakan algoritma dasar pencarian Depth First Search (DFS)
untuk melakukan traversal dalam pohon yang akan mengekspansi simpul paling
dalam terlebih dahulu. Algoritma ini membangkitkan simpul pada tingkat
selanjutnya setelah simpul akar dibangkitkan. Pencarian selesai jika tidak ada
simpul yang belum dikunjungi dapat dicapai dari simpul yang telah dikunjungi.
Berdasarkan hal
tersebut dapat diketahui bahwa algoritma ini terdapat dua peran, yaitu max dan min.
Pembuatan pohon dimulai dari posisi awal hingga posisi akhir permainan,
kemudian posisi akhir dievaluasi dari sudut pandang max. Setelah
itu, node bagian dalam diisi dengan nilai yang telah dievaluasi dan node yang
dimiliki max akan menerima nilai maksimum dari node anaknya.
Node untuk min akan memilih nilai minimum dari node
anak.
Keterangan Gambar :
Nilai yang terdapat pada papan
digunakan untuk pengambilan keputusan untuk AI dengan algoritma Minimax.
Implementasi Kode Program
Berikut ini adalah potongan
kode program beserta fungsi dari kode program tersebut.
o Kode program untuk pembuatan
tampilan awal game
?-
set(pos(w,[[m,1,0],[m,3,0],[m,5,0],[m,7,0],
[m,0,1],[m,2,1],[m,4,1],[m,6,1],
[m,1,2],[m,3,2],[m,5,2],[m,7,2]],
[ [m,0,5],[m,2,5],[m,4,5],[m,6,5],
[m,1,6],[m,3,6],[m,5,6],[m,7,6],
[m,0,7],[m,2,7],[m,4,7],[m,6,7]])),
G_Val is 50,
G_Pawn_w is bitmap_image("../HUNTING/ris/pawn_w.bmp","../HUNTING/ris/maska.bmp"),
G_Pawn_ws is bitmap_image("../HUNTING/ris/pawn_ws.bmp","../HUNTING/ris/maska.bmp"),
G_Pawn_b is bitmap_image("../HUNTING/ris/pawn_b.bmp","../HUNTING/ris/maska.bmp"),
G_King_w is bitmap_image("../HUNTING/ris/king_w.bmp","../HUNTING/ris/maska.bmp"),
G_King_ws is bitmap_image("../HUNTING/ris/king_ws.bmp","../HUNTING/ris/maska.bmp"),
G_King_b is bitmap_image("../HUNTING/ris/king_b.bmp","../HUNTING/ris/maska.bmp"),
G_NoColor is brush(rgb(0,0,100)),
G_Grey is brush(rgb(20,20,200)),
pen(pen(0,rgb(0,0,0))),
window(_,_,myFunc(_),"Hunting",80,30,492,531).
o Kode program untuk menginisialisasi
nilai – nilai yang digunakan
newGame:- set(pos(w,[[m,1,0],[m,3,0],[m,5,0],[m,7,0],
[m,0,1],[m,2,1],[m,4,1],[m,6,1],
[m,1,2],[m,3,2],[m,5,2],[m,7,2]],
[ [m,0,5],[m,2,5],[m,4,5],[m,6,5],
[m,1,6],[m,3,6],[m,5,6],[m,7,6],
[m,0,7],[m,2,7],[m,4,7],[m,6,7]])),
G_Clicked:= 0,update_window(_),(G_P=1->play).
myFunc(init):-
G_H = 60,G_N = 8,G_P = 0,
G_Clicked = 0,G_K = m,
G_X = 1,G_Depth = 3,
G_Y = 1,
o Kode program untuk membuat
menu bar
menu(pop_up, _,_,myPopUpGame(_),"&start"),
menu(pop_up, G_Menu,_,level(_),"&Level"),
menu( right, _, _, menu_help(_), "&Help").
level(init):-
menu(normal,_,_,l2(_),"&easy"),
menu(checked,_,_,l3(_),"&medium"),
menu(normal,_,_,l4(_),"&hard").
l2(press):-change_menu(2).
l3(press):-change_menu(3).
l4(press):-change_menu(4).
change_menu(M):-modify_menu(G_Menu,G_Depth- 1,normal,_),
G_Depth:=M, modify_menu(G_Menu,M- 1,checked,_).
myPopUpGame(init):-
menu(normal,_,_,newGame(_),"close this game"),
menu(normal,_,_,swapSides(_),"New game - hunter start").
newGame(press) :-close_window(_).
swapSides(press):-G_P:= 0, newGame.
menu_help(press):-shell_execute("Checkers.html").
o Kode program jika user mengklik bola
bintang dan memindahkannya
myFunc(mouse_click(X,Y)):-X<G_H*G_N,Y<G_H*G_N,
X1 is X // G_H,Y1 is Y // G_H,move(X1,Y1),!,fail.
move(X,Y):- G_Clicked = 0,pos(C,B,W),
elem([K,X,Y],W),G_Clicked:=G_Clicked+1,draw_Pul(K,mm,X,Y),
G_X:=X,G_Y:=Y,G_K:=K.
move(X,Y):- G_Clicked = 1,
(pos(C,B,W),
(elem([K,X,Y], W)->
draw_Pul(G_K,w,G_X,G_Y),G_X:=X,G_Y:=Y,G_K:=K,draw_Pul(K,mm,X,Y);
hodW(C,G_K,G_X,G_Y,X,Y,B,W));
G_Clicked:=0, draw_Pul(G_K,w,G_X,G_Y)).
move(X,Y):- G_Clicked > 1,
pos(C,B,W),
take(G_K,G_X,G_Y,X,Y,B,W).
o Kode program yang digunakan
jika bola bintang bergerak satu langkah
step(k,X1,Y1,X2,Y2,B,W):-
abs(Y2-Y1)=:=1,abs(X2-X1)=:=1,
not(elem([_,X2,Y2],B)),not(elem([_,X2,Y2],W)),
remove([k,X1,Y1],W,W1),
addB([k,X2,Y2],W1,W2),
set(pos(w,B,W2)),
draw_Pul(k,w,X2,Y2),clear(X1,Y1),G_Clicked:=0,play.
step(m,X1,Y1,X2,Y2,B,W):-
Y2=:=Y1- 1,abs(X2-X1)=:=1,
not(elem([_,X2,Y2],B)),not(elem([_,X2,Y2],W)),
remove([m,X1,Y1],W,W1),
(Y2=0->addB([k,X2,Y2],W1,W2),draw_Pul(k,w,X2,Y2);
addB([m,X2,Y2],W1,W2),draw_Pul(m,w,X2,Y2)),
set(pos(w,B,W2)),
clear(X1,Y1),G_Clicked:=0,play.
o Kode program yang digunakan
untuk melompati bola bintang dan menghilangkannya dari papan
permainan
hodW(C,K,X1,Y1,X2,Y2,B,W):-
(take(K,X1,Y1,X2,Y2,B,W);can(W,B,W),draw_Pul(G_K,w,G_X,G_Y);step(K,X1,Y1,X2,Y2,B,W)).
t(X1,Y1,X2,Y2,B,W):-
abs(X2-X1)=:=2,abs(Y2-Y1)=:=2,
not(elem([_,X2,Y2],B)),not(elem([_,X2,Y2],W)),
Y is (Y1+Y2)//2,X is (X1+X2)//2,elem([_,X,Y],B).
take(K,X1,Y1,X2,Y2,B,W):-t(X1,Y1,X2,Y2,B,W),
Y is (Y1+Y2)//2,X is (X1+X2)//2,
remove([_,X1,Y1],W,W1),
(Y2=0->draw_Pul(k,w,X2,Y2),addB([k,X2,Y2],W1,W2);
draw_Pul(K,w,X2,Y2),addB([K,X2,Y2],W1,W2)),
remove([_,X,Y],B,B1),
set(pos(w,B1,W2)),
clear(X1,Y1),clear(X,Y),cantake(K,X2,Y2).
o Kode program untuk melompati
lebih dari satu bola bintang jika mungkin
cantake(K,X,Y):-pos(C,B,W),Y1 is Y+2,Y2 is Y- 2,X1 is X+2,X2 is X- 2,
(in(X1,Y1),t(X,Y,X1,Y1,B,W),G_Clicked:=G_Clicked+1,draw_Pul(K,mm,X,Y),G_X := X,G_Y := Y,G_K:=K;
in(X1,Y2),t(X,Y,X1,Y2,B,W),G_Clicked:=G_Clicked+1,draw_Pul(K,mm,X,Y),G_X := X,G_Y := Y,G_K:=K;
in(X2,Y1),t(X,Y,X2,Y1,B,W),G_Clicked:=G_Clicked+1,draw_Pul(K,mm,X,Y),G_X := X,G_Y := Y,G_K:=K;
in(X2,Y2),t(X,Y,X2,Y2,B,W),G_Clicked:=G_Clicked+1,draw_Pul(K,mm,X,Y),G_X := X,G_Y := Y,G_K:=K).
cantake(K,X,Y):-G_Clicked := 0,play.
o Kode program untuk mengetahui
giliran
play:-pos(C,B,W),(isFinal(B,W,X),end(w);
set_text("waiting!",_),
winB(G_Depth,B,W,X),(X> -32000->update_window(_);end(d)),
(pos(C,B1,W1),(isFinal(B1,W1,X),end(b);isDrawW(B1,W1,X),end(d));
set_text("Your Turn,Lady / Sir",_))).
o Kode program untuk menampilkan
pemberitahuan jika kita menang atau kalah dan ingin bermain lagi atau tidak.
s(w,Y):-Y is " congratulation you a winner. ".
s(b,Y):-Y is " sorry you still loser. ".
end(X):-s(X,Y),
(yes_no("Game over",Y+"Play again?",!) -> G_P:=1-G_P,
newGame; (!,G_Clicked:= -1,fail)).
end(X).