Thursday, December 22, 2011

Project Pengantar Kecerdasan Buatan (Mini Othello)

Semester 5, Matakuliah Pengantar Kecerdasan Buatan mewajibkan mahasiswanya untuk membuat project pemrograman Artificial Intelligence (AI). Bahasa pemrograman untuk membuat aplikasi (game) yang dipakai kali ini adalah Strawberry Prolog.


Game yang saya modifikasi adalah Reversy. Beberapa game lainya seperti tic-tac-toe,chess,dsb bisa dilihat dalam folder contoh game dari Strawberry Prolog (cari aja hehe).

Judul Game saya adalah Mini Othello (6x6).
Berikut listing programnya:


%-------------------------------------------------------------------------------

%This game is developed by Hedi Oktavia E.
%3IA14 - Gunadarma University

?-

%===Window Utama===
window(_,_,win_func(_),"Mini Othello",300,50,410,580).
win_func(paint):-
draw_bitmap(64,375,bitmap_image("Gambar//vs.bmp",_),_,_),
draw_bitmap(2,0,bitmap_image("Gambar//arrow.bmp",_),_,_),fail.


%===Gambar Background===
win_func(paint):-
brush("Gambar//o.bmp"),
rect(50,50,350,350),
for(I,0,5),
X is I * 50 + 50,
line(X,50,X,350),
line(50,X,350,X),
fail.

%===Bidak Musuh (Squidward)===
win_func(paint):-
brush("Gambar//sp.bmp"),
sit(H),
for(J,0,6),
for(I,0,6),
take(H,Line,J),
take(Line,b,I),
X is I*50 + 55,
Y is J*50 + 55,
X1 is X + 40,
Y1 is Y + 40,
rect(X,Y,X1,Y1),
fail.

%===Bidak Pemain (Spongebob)===
win_func(paint):-
brush("Gambar//sw.bmp"),
sit(H),
for(J,0,6),
for(I,0,6),
take(H,Line,J),
take(Line,w,I),
X is I*50 + 55,
Y is J*50 + 55,
X1 is X + 40,
Y1 is Y + 40,
rect(X,Y,X1,Y1),
fail.

%===Tampilan Menu Utama===
win_func(init) :-
menu(pop_up, _, _,menu_game(_), "&Game"),
menu(normal, _, _, menu_htp(_), "&How to Play"),
menu(right,_,_,menu_about(_),"a&Bout"),
window_brush(_, rgb(90, 90, 90)).


menu_game(init):-
menu(normal, _, _, menu_baru(_), "&Mulai Baru"),
menu(normal, _, _, menu_keluar(_), "&Keluar").


%===Perintah menu Mulai Baru===
menu_baru(press) :-
set(sit([[n,n,n,n,n,n],[n,n,n,n,n,n],[n,n,b,w,n,n],[n,n,w,b,n,n],[n,n,n,n,n,n],[n,n,n,n,n,n]])),
pen(2,rgb(200,200,200)),
update_window(_).

%===Perintah menu Keluar===
menu_keluar(press):-
close_window(_).
 win_func(close):-  %----> isi menu keluar
 ask.
 ask:-
 yes_no( "Quit","Keluar game?", ?),
 !,message("Ya", "Kapan-kapan main lagi ya!",!),
 end.
 ask:-
 message("Tidak", "Ayo terus bermain dan kalahkan Squidward!", s).

%===Perintah menu How to Play===
menu_htp(press) :-
message("Rules", "Cara Bermain:
1. Jepitlah bidak othello lawan secara horizontal, vertikal atau diagonal.
2. Bidak othello yang terjepit akan menjadi milik pemain yang menjepitnya.
3. Jika AI tidak dapat meletakkan bidak, maka gilirannya akan digantikan oleh user.
4. Jika user tidak dapat meletakkan bidak, maka permainan berakhir.
5. Pemain dengan jumlah bidak othello terbanyak adalah pemenangnya.", i).

%===Perintah menu About===
menu_about(press) :-
message("About This Game","
This game is developed by:
          HEDI OKTAVIA
                 from
GUNADARMA UNIVERSITY,
    educational purposes.", i).

%===Kondisi menang atau kalah===
win_func(paint):-
brush(rgb(100,250,250)),
sit(H),
N1 is count_successes(victory(w,H)),
N2 is count_successes(victory(b,H)),
text_out(50, 16, "You   :  "+print(N1)+"                              "),
text_out(219,16, "      Computer   :  "+print(N2)+"  "),

(N1>N2, N1+N2<36 ->
message("Squidward said","You're just lucky.",!),
text_out(50,360, "                    Info:     You have won.                   ")

else(N1>N2, N1+N2=:=36 ->
ask1
else (N1=\=2, N2=\=2, N1=N2, N1+N2<36 ->
message("Squidward said","It's draw..",!),
text_out(50,360, "                    Info:     The Game's draw.              ")
else (N1=N2, N1+N2=:=36 ->
ask3
else (N1<N2, N1+N2<36->
message("Squidward said","I beat you.",!),
text_out(50,360, "                    Info:     You have lost.                   ")
else (N1<N2, N1+N2=:=36 ->
ask2
)))))),
fail.

win_func(paint).



win_func(mouse_click(X,Y)):-
X1 is (X - 40) // 50,
Y1 is (Y - 40) // 50,
X1 >= 0,
X1 =< 5,
Y1 >= 0,
Y1 =< 5,
sit(Sit1),
insert(X1,Y1,w),
sit(Sit2),
not(Sit1=Sit2),
win_func(paint),
wait(1),
take3(Sit2,n,X2,Y2),
insert(X2,Y2,b),
sit(Sit3),
not(Sit2=Sit3),
win_func(paint).

win_func(mouse_click(X,Y)):-
  beep.

insert(X,Y,Who):-%trace,
sit(Sit),
take2(Sit,n,X,Y),
opposit(Who,NewWho),
for(WayX,-1,1),
for(WayY,-1,1),
sit(Sit2),
neighbour(NewWho,X,Y,Sit2,WayX,WayY),
jump(NewWho,X,Y,Sit2,WayX,WayY,NewX,NewY),
replace3(Result,Sit2,Who,X,Y,NewX,NewY,WayX,WayY),
set(sit(Result)),
fail.
insert(X,Y,Who).

neighbour(Who,X,Y,Sit,WayX,WayY):-
X1 is X+ WayX,
Y1 is Y+ WayY,
take2(Sit,Who,X1,Y1).

jump(Who,X,Y,Sit,WayX,WayY,X2,Y2):-
X1 is X+ WayX,
Y1 is Y+ WayY,
opposit(Who,NewWho),
neighbour(NewWho,X1,Y1,Sit,WayX,WayY),
X2 is X1+ WayX,
Y2 is Y1+ WayY.

jump(Who,X,Y,Sit,WayX,WayY,NewX,NewY):-
X1 is X+ WayX,
Y1 is Y+ WayY,
neighbour(Who,X1,Y1,Sit,WayX,WayY),
jump(Who,X1,Y1,Sit,WayX,WayY,NewX,NewY).

take3(Sit,El,0,0):-
take2(Sit,El,0,0).

take3(Sit,El,0,5):-
take2(Sit,El,0,5).

take3(Sit,El,5,0):-
take2(Sit,El,5,0).

take3(Sit,El,5,5):-
take2(Sit,El,5,5).

take3(Sit,El,X,Y):-
take2(Sit,El,X,Y).

take2(Sit,El,X,Y):-
take(Sit,Row,Y),
take(Row,El,X).

replace2(Result,Sit,El,X,Y):-
take(Sit,Line,Y),
replace(NewLine,Line,El,X),
replace(Result,Sit,NewLine,Y).

replace3(Result,Result,Who,X,Y,X,Y,WayX,WayY).
replace3(Result,Sit,Who,X,Y,ToX,ToY,WayX,WayY):-
replace2(ResultP,Sit,Who,X,Y),
X1 is X + WayX,
Y1 is Y + WayY,
replace3(Result,ResultP,Who,X1,Y1,ToX,ToY,WayX,WayY).

replace([New,B,C,D,E,F],[_,B,C,D,E,F],New,0).
replace([A,New,C,D,E,F],[A,_,C,D,E,F],New,1).
replace([A,B,New,D,E,F],[A,B,_,D,E,F],New,2).
replace([A,B,C,New,E,F],[A,B,C,_,E,F],New,3).
replace([A,B,C,D,New,F],[A,B,C,D,_,F],New,4).
replace([A,B,C,D,E,New],[A,B,C,D,E,_],New,5).

take([El,_,_,_,_,_],El,0).
take([_,El,_,_,_,_],El,1).
take([_,_,El,_,_,_],El,2).
take([_,_,_,El,_,_],El,3).
take([_,_,_,_,El,_],El,4).
take([_,_,_,_,_,El],El,5).

victory(Who,[[Who,_,_,_,_,_],_,_,_,_,_]).
victory(Who,[[_,Who,_,_,_,_],_,_,_,_,_]).
victory(Who,[[_,_,Who,_,_,_],_,_,_,_,_]).
victory(Who,[[_,_,_,Who,_,_],_,_,_,_,_]).
victory(Who,[[_,_,_,_,Who,_],_,_,_,_,_]).
victory(Who,[[_,_,_,_,_,Who],_,_,_,_,_]).

victory(Who,[_,[Who,_,_,_,_,_],_,_,_,_]).
victory(Who,[_,[_,Who,_,_,_,_],_,_,_,_]).
victory(Who,[_,[_,_,Who,_,_,_],_,_,_,_]).
victory(Who,[_,[_,_,_,Who,_,_],_,_,_,_]).
victory(Who,[_,[_,_,_,_,Who,_],_,_,_,_]).
victory(Who,[_,[_,_,_,_,_,Who],_,_,_,_]).

victory(Who,[_,_,[Who,_,_,_,_,_],_,_,_]).
victory(Who,[_,_,[_,Who,_,_,_,_],_,_,_]).
victory(Who,[_,_,[_,_,Who,_,_,_],_,_,_]).
victory(Who,[_,_,[_,_,_,Who,_,_],_,_,_]).
victory(Who,[_,_,[_,_,_,_,Who,_],_,_,_]).
victory(Who,[_,_,[_,_,_,_,_,Who],_,_,_]).

victory(Who,[_,_,_,[Who,_,_,_,_,_],_,_]).
victory(Who,[_,_,_,[_,Who,_,_,_,_],_,_]).
victory(Who,[_,_,_,[_,_,Who,_,_,_],_,_]).
victory(Who,[_,_,_,[_,_,_,Who,_,_],_,_]).
victory(Who,[_,_,_,[_,_,_,_,Who,_],_,_]).
victory(Who,[_,_,_,[_,_,_,_,_,Who],_,_]).

victory(Who,[_,_,_,_,[Who,_,_,_,_,_],_]).
victory(Who,[_,_,_,_,[_,Who,_,_,_,_],_]).
victory(Who,[_,_,_,_,[_,_,Who,_,_,_],_]).
victory(Who,[_,_,_,_,[_,_,_,Who,_,_],_]).
victory(Who,[_,_,_,_,[_,_,_,_,Who,_],_]).
victory(Who,[_,_,_,_,[_,_,_,_,_,Who],_]).

victory(Who,[_,_,_,_,_,[Who,_,_,_,_,_]]).
victory(Who,[_,_,_,_,_,[_,Who,_,_,_,_]]).
victory(Who,[_,_,_,_,_,[_,_,Who,_,_,_]]).
victory(Who,[_,_,_,_,_,[_,_,_,Who,_,_]]).
victory(Who,[_,_,_,_,_,[_,_,_,_,Who,_]]).
victory(Who,[_,_,_,_,_,[_,_,_,_,_,Who]]).

ask1:-
message("Squidward said","Okay, you win.",!).


ask2:-
message("Squidward said","You're pathetic.",!).


ask3:-
message("Squidward said","It's draw.",!).


opposit(b,w).
opposit(w,b).

%--------------------------------------end--------------------------------

Masih belum sempurna, but I have done my best.

Disuruh bikin makalah, isi makalahnya adalah initial state, rule, goal, konsep AI, dsb (bisa lihat contoh pada link download yang saya berikan).
Waktu sidang, disuruh juga bikin Powerpoint untuk mempresentasikan game kita. Kita disidang secara private (satu mahasiswa, satu kakak penyidang). Yang ditanyain waktu sidang? Gak begitu sulit kok kalo dapet kakak penguji yang enak. Kuncinya adalah jujur dan JANGAN COPY PASTE atau kita bakal diGAGALIN. Kalo dapet listing program game, EDIT. Jangan TERIMA JADI gitu aja. Kemaren gue cuma ditanyain gimana cara menang dari AI (gamenya Othello jadi gak begitu sulit untuk mengalahkan AI). Terus ditanyain juga gimana supaya draw. Kalo gak bisa nunjukin draw, berarti ditanyain LISTING. Karena gue ga bisa bikin draw, akhirnya gue ditanya-tanyain listingnya deh, uh.
Pertama ditanya apa arti rect, apa arti for, apa arti ask1, apa arti sit(H), jawab aja sebisanya dan jangan sok tau kalo emang gatau hehe. Pas gue ditanya tentang konsep AI, gue bingung. Gue bilang aja...

"untuk kodingan AI saya gabegitu paham, soalnya saya hanya mengembangkan game ini, bukan yang bikin. Tapi saya ngerti gimana supaya AI nya bisa jalan. Jadi dia pake algoritma minimax, memilih jalan yang terbaik untuk ngalahin player, atau minimal bikin skor jadi draw. Udah gitu, dia juga dirancang supaya hanya bisa menjepit bidak player, jadi langkah jalanya AI itu pasti teratur, gak sembarangan. Ceritanya kan AI nya pinter, bisa mikir. Gitu kak." -bacot kan? emang harus ngebacot. Huhu..

Next, disuruh masukin gambar, terus disuruh bikin menu, dan yang terakhir disuruh tuker bidak. Kakanya mau supaya bidak punya kita AI yang gerakin, dan bidaknya AI kita yang gerakin. Mau tau apa yang gue lakuin? gue tuker aja gambarnya. Selesai, jadi ketuker kan bidaknya? :)

Sebelum selesai, kakaknya nanya...

"Jujur ya, game kamu ini copas apa engga?"
"Ngga, kak, saya kerjasama sama temen saya."

Dalem hati gue ketawa-tawa, "...Tapi makalahnya saya ada yg copas, kak hehehe."

Segini dulu share dari gue. Mohon maaf banget kalo ada kesalahan dan yang perlu diingat, semua presentasi, format makalah, dsb BELUM TENTU SAMA. Gue cuma mau berbagi pengalaman aja kok.

Thanks to: Kak Addrian (PJ 3IA14), Kartika E. (yang bantuin ngoding), Maretha T. dan Zepri K. (untuk minjemin makalah buat gue contek :p, tapi serius makalahnya gue edit lagi kok. Gak 100% copas hihihi.)

Ini Link untuk Download:

Good Luck!

PS: gausah takut gak lulus kalo emang kita gak copas game. Lagi pula praktikum PKB ini hanya penunjang. Menurut saya sidang hanya syarat kelulusan saja.

5 comments:

izin download Ka, kebetulan saya mendapatkan tugas membuat contoh kecerdasan buatan (Mata Kuliah Sistem Instrumentasi Cerdas)..

mudah2an bermanfaat bagi kita semua..

silahkan, diedit ya. karena yang make bukan kita aja lho :p

kk,, kok ga bisa di download ya ? gmana kk ? mohon pencerahannya...

file sudah bisa di-download kembali.

Post a Comment