Tuesday, June 18, 2013

Game Prolog Hunting Emote

 

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 AIAlgoritma 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).

»»  READMORE...