Senin, 21 Mei 2012

ALGORITMA GAME MATCHESFISH PADA STRAWBERRY PROLOG

        Berhubung pada mata kuliah PKB (Pengantar Kecerdasaan Buatan) saya membuat game sederhana matches, yang kemudian saya beri nama MATCHESFISH, maka kali ini saya akan membahas sedikit tentang algoritma game matchesfish tersebut dengan menggunakan strawberry prolog.
Konsep permainan yang diterapkan dalam permainan ini adalah, pemain atau lawan harus lebih dahulu mengambil ikan dan dalam pengambilan ikan tidak dibatasi, hanya saja jika kita ingin mengambil maksimal ikan tersebut bisa dilakukan dengan cara pengambilan di dalam kolom secara keseluruhan tergantung isi dari masing-masing kolom tersebut. Hal yang harus dilakukan adalah membuat lawan untuk tidak mendahului pemain sebelum pemain melakukan pengambilan pada ikan tersebut. Permainan selesai jika pengguna  (user) kalah dan lawan (komputer) berhasil untuk tidak mengambil ikan yang paling akhir.  serta pengguna (user) menang, jika berhasil untuk tidak mengambil ikan yang paling akhir. Pengguna (user) dapat memilih ikan yang telah di sediakan secara bebas dan lawan (komputer)  juga bisa melakukan hal yang sama. Sehingga pengguna (user)  dan lawan (komputer) dapat mengambil ikan secara bebas (kolom). Algoritma Permainan

Berikut ini adalah algoritma yang dipakai dalam permainan ini :

    Memilih salah satu beberapa dari 24 ikan yang susunannya terdiri dari kiri ke kanan (urutan ikan 5,4,3,3,4,5) pada kondisi awal sebelum diubah. ikan yang telah di sediakan, pengguna (user) atau lawan (komputer) dapat memilih sesuai dengan yang di inginkan.
 Dengan cara mengklik kiri pada mouse dan arahkan kursor kearah ikan yang ingin di ambil.
    Jika pengguna (user) bermain sebagai pemain (player) pertama dan sudah memilih ikan yang di inginkan untuk di ambil, maka berikutnya lawan (komputer) yang memilih ikan yang di inginkan untuk diambil.
    Jika ikan yang di sediakan telah habis maka akan dilihat siapa yang mengambil ikan yang paling akhir untuk menentukan menang atau tidaknya pengguna (user) ataaupun lawan (komputer) karena syarat ketentuan permainan ini ialah akan menang jika tidak mengambil ikan yang paling akhir dan akan kalah jika mengambil ikan yang paling akhir.
     Jika pengguna (user) bermain cepat dalam pengambilan ikan maka lawan (komputer) akan menyamakan kecepatan seperti pengguna (user) dalam proses pengambilan ikan.
    Jika lawan (komputer) memenangkan permainan ini maka keluar message "Sorry","kamu belum beruntung kawan Jika pengguna (user) yang memenangkan permainan ini maka akan keluar message "Selamat","kamu pemenang nya".
     Permainan selesai bila 24 ikan telah habis baik diambil pengguna (user) ataupun lawan (komputer). Dan akan menampilkan message menang atau tidaknya dalam permainan ini.

Berikut adalah coding dari game matches :

?-
  G_Comp_First=0,
  G_Take_Last=0,
  %G_Yellow is brush(rgb(255,200,0)),
  %G_Red is brush(rgb(255,0,0)),
  G_White is brush(rgb(127,220,228)),
  G_bekgron is bitmap_image("image\\bg.bmp",_),
  G_fish is bitmap_image("image\\fish.bmp",_),
  font(8,17,"Haettenschweiler"),
 
Perintah di atas adalah untuk mengatur warna brush adalah putih keabu - abuan, background dengan nama wb dengan tipe image bmp, untuk menampilkan icon ikan, untuk menampilkan image tbd jika kondisi pemain menang dan untuk menampilkan image tbd jika kondisi pemain kalah .

  pen(0,0),       
  set(pos([5,4,3,3,4,5])),
  window_n( G_Main, _, win_func, "MatchesFish (Jangan Jadi Ikan Terakhir)", 100,100,650,360,_,_,rgb(255,255,255)),
  message("Selamat Bermain","Ini Adalah Game MatchesFish",i).

perintah di atas untuk mengatur posisi icon ikan yaitu 8 bar dan mengatur posisi window dan warna window.

win_func(init) :-
  menu( normal, _, _, menu_new(_), "&Mulai Game"),
  menu( normal, _, _, menu_options(_), "&Pengaturan"),
  menu( normal, _, _, menu_help(_), "&Bantuan"),
  menu( normal, _, _, menu_about(_), "&About Me"),
  menu( normal, _, _, menu_exit(_), "&Keluar").

perintah di atas untuk membuat menu mulai game, pengaturan, bantuan, about me, dan exit.

win_func(paint):-
  draw_bitmap(0,0,G_bekgron,_,_),
  pos(Pos),
  el(Pos,El,N),
  for(I,1,El),

perintah di atas digunakan untuk pembuatan object dan warna

  X is 50+100*N,
  Y is 290- 40*I,
  text_out(470, 10, "Sisa Waktu"),
  draw_bitmap(X,Y,G_fish,_,_),
  fail.

untuk mendeklarasikan jarak masing - masing item dan ada waktu limit bermain

win_func(mouse_click(X,Y)):-
  X1 is (X- 50)//100,
  Y1 is (280-Y)//40,
  X1=<6,X>=40,
  pos(Pos),
  el(Pos,El,X1),
  El>Y1,
  replace(Pos2, Pos, Y1, X1),
  brush(G_White),
  rect(100*X1+40,0,100*X1+140,265- 30*Y1),
  (Pos2=[0,0,0,0,0,0]->
    set(pos(Pos2)),
    end(0)
  else
    wait(0.5),
    play(Pos3, Pos2),
    (Pos3=[0,0,0,0,0,0]->
      end(1)),
    set(pos(Pos3))),
  update_window(_).

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

untuk deklarasi area mouse click

play(Pos3, Pos2):-
  G_Take_Last=0,
  count_successes(not_trivial(Pos2))<2,
  find_max(Pos2,Max,N),
  New is (Max>1,count_successes(not_empty(Pos2)) mod 3=:=2 -> 1 else 0),
  replace(Pos3, Pos2, New, N).
play(Pos3, Pos2):-
  el(Pos2,A, N),
  R:=0,
  add_xor(R,Pos2,N),
  R  replace(Pos3, Pos2, R, N).
play(Pos3, Pos2):-
  find_max(Pos2,Max,N),
  Max2 is (Max>1, random(2)=:=0 ->
    Max - 2
  else
    Max - 1),
  replace(Pos3, Pos2, Max2, N).

not_empty(Pos):-
  el(Pos,A, _),
  A>0.
not_trivial(Pos):-
  el(Pos,A, _),
  A>1.

el([H|T],H,0).
el([H|T],El,N):-
  el(T,El,N1),
  N is N1+1.

replace([H|T],[_|T],H,0).
replace([H|T2],[H|T],El,N):-
  replace(T2,T,El,N1),
  N is N1+1.

find_max([H],H,0).
find_max([H|T],A, N) :-
  find_max(T,A1,N1),
  (A1
    A is H,
    N is 0
  else
    A is A1,
    N is N1+1).

add_xor(_,[],_):-!.
add_xor(R,[H|T],0):- !,
  add_xor(R, T, -1).
add_xor(R,[H|T],N):-
  N1 is N- 1,
  R:=R xor H,
  add_xor(R, T, N1).

end(Flag):-

perintah di atas merupakan inti dari program yaitu AI dari game matches itu sendiri.

Flag=G_Take_Last->
    message("Sorry","kamu belum beruntung kawan",i)
  else
    message("Selamat","kamu pemenang nya",!).

Notif pemberitahuan kamu menang atau kalah dalam game ini

%Deklarasi waktu
time_func(end) :-
  G_Time=0, !,
  kill_timer(_, G_Timer),
  message("Limit","Maaf Waktu Kamu Habis",i),
  message("Game Berakhir","Kalian Seri",i),
  message("Ingin Coba Lagi ?","Klik Mulai Game",i),
  close_window(_),
  fail.

time_func(end) :-
  G_Time2 :=1,
  G_Time2 :=G_Time,
  G_Time := G_Time - 1,
color_text(_, rgb(0, 0, 0)),
font(8,17,"Haettenschweiler"),
  text_out(500, 30, G_Time+"   "),
  fail.

time_func(end) :-
  G_Time2:=G_Time2 - 1,
  fail.

perintah di atas memberi waktu limit 10 detik, bila kamu bermain lebih dari waktu tersebut maka kamu dinyatakan seri.

%Deklarasi menu about
menu_about(press):-
    message("Tentang Saya"," Game Prolog  : MatchesFish \n Kelas              : 3IA15 \n NPM               : 52409878 \n Create By      : Deni Andre Sucianto \n UNIVERSITAS GUNADARMA", i).

perintah di atas tentang isi dari kolom about me.