Powered By Blogger

Kamis, 20 Juni 2013

Softskill - Game Prolog Hunting Emote

Pada tugas mata kuliah Softskill – Pengantar teknologi game, kali ini saya akan membahas game prolog hunting emote. Game yang saya bahas menggunakan AI (Artificial Intelegence).

Cara Bermain

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.

Konsep AI

Karakter yang dimainkan pemain dan komputer dalam permainan ini berupa emoticon yang berbeda yaitu emot cool dan love struck yang diletakkan secara diagonal pada papan permainan. Emot tersebut bergerak secara diagonal pada papan. Dalam permainan ini pemain ditugaskan untuk menghalangi pemain AI memenangkan permainan.Untuk melompati emot lawan(emot cool) harus memancing pergerakan lawan agar meletakkan emotnya nya berada pada jalur diagonal emot pemain. Pemain AI harus meletakkan emot pada jalur yang tepat sekaligus melompati emot lawan untuk menghilangkan emot tersebut.

Penyelesaian:
1.Identifikasi ruang keadaan
Permasalahan ini dapat dilambangkan dengan papan 8x8(seperti papan catur) dan 24 emot hunting (12 emot hunting pemain
AI emot nya cool, 12 emot hunting pemain hunter emotnya love struck).
2.Keadaan awal dan tujuan
Keadaan Awal = emot pemain AI berada pada posisi papan warna biru.
Keadaan Tujuan = emot hilang.
3. Aturan-aturan

a. emot bergerak pada kotak papan yang tidak ditempati.
b. emot bergerak secara diagonal satu langkah.
c. emot bisa bergerak secara diagonal ke belakang jika di bagian belakang terdapat emot lawan.
d. emot 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.
e. emot berubah menjadi emot angry jika mencapai baris terjauh.
f. Permainan di mulai dengan pemain hunter yang kemudian akan menghalangi pemain AI.



TAMPILAN AWAL



DAFTAR LEVEL



JALAN DIAGONAL



TAMPILAN KETIKA KALAH



TAMPILAN KETIKA MENANG


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

• 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,


• 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").

• Kode program jika user mengklik bola bintang dan memindahkannya
myFunc(mouse_click(X,Y)):-X
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).

• 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.

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



• 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.

• 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",_))).

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