Selasa, 16 Juli 2013

GAME TICK- TACK- TOE 3x3x3 OF STRAWBERRY PROLOG

1. Tentang Game Tick-Tack-Toe 3x3x3
       Pada kesempatan kali ini saya akan akan menjelaskan beberapa hal yang berkaitan dengan permainan Tick-Tack-Toe. Saya melakukan pengembangan game Tick-Tack-Toe 3x3x3 menggunakan software ”Strawberry Prolog”. Game Tick-Tack-Toe yang saya kembangkan berbasis tiga dimensi. Game ini adalah sebuah game yang berbasis AI (Artificial Intelligent) atau Kecerdasan Buatan. Kecerdasan buatan yang terdapat pada game ini adalah pada komputer yang akan bertindak sebagai lawan. Komputer akan bermain layaknya seorang manusia. Komputer akan selalu berusaha mengalahkan pemain dengan cara menutup langkah pemain untuk  membentuk suatu garis. Komputer dapat menyusun strateginya sendiri agar menjadi seorang pemenang.
          Sebelum saya membahas tatacara permainan pada Game Tick-Tack-Toe saya akan membahas secara singkat tentang awal mulanya Game Tick-Tack-Toe. Game Tick-Tack-Toe sangat dikenal diseluruh penjuru dunia. Di Indonesia sendiri game ini lebih dikenal dengan permainan catur jawa. Tick-Tack-Toe sendiri berasal dari kekaisaran romawi sekitar abad sebelum masehi.Permainan ini dimainkan oleh dua orang pemain dengan menggunakan tiga bidak. Pemain harus membentuk satu barisan dengan bidak- bidak yang dimiliki pada lembar kertas papirus. Namun, menurut Claudia Zaslavsky dalam buku Tic Tac Toe: And Other Three-In-A Row Games from Ancient Egypt to the Modern Computer, Tic-Tac-Toe berasa Mesir kuno. Namun bagaimana permainan ini mulai disebut dengan nama Tic Tac Toe? Pada tahun 1884, anak-anak bermain di sebuah batu tulis dimana mereka menutup mata sambil mencoretkan batu dengan dua simbol "X" dan "O" membentuk satu barisan namun disertai suara Tic dan Tac dari anak-anak. Pada tahun 1952, Tic Tac Toe mulai diminati karena untuk pertama kalinya masuk ke dunia video game OXO (or Noughts and Crosses) untuk komputer EDSAC. Pemain bisa memainkan Tic-Tac-Toe dengan melawan komputer bahkan dapat multiplay melawan manusia. Pada tahun 1975, Tic Tac Toe juga digunakan oleh siswa MIT untuk menunjukkan kekuatan komputasi dari elemen Tinkertoy yang saat ini dipamerkan di Museum of Science, Boston.

2.      Bahasa Pemrograman untuk Tick-Tack-Toe
          Game  Tick-Tack-Toe 3x3x3 menggunakan bahasa pemrograman Prolog. Software yang digunakan adalah Strawberry Prolog sebagai program editor. Karena bahasa ini mudah untuk membuat dan mengeditnya sesuai dengan versi kita. Selain itu, kita dapat dengan mudah mengimplementasikan AI secara sederhana dan merupakan aplikasi “light edition”  yang artinya program ini dapat langsung dijalankan tanpa harus diinstal terlebih dahulu.

3.      Bentuk Permainan
          Pada permainan Tick-Tack-Toe 3x3x3 yang saya kembangkan menggunakan papan yang terdapat 27 object yang terdiri dari 3 kolom dan 3 baris. Dimana setiap object memiliki tiga lapisan (tiga dimensi). Pada permainan ini terdapat dua object yang berperan, yaitu pemain dengan komputer atau AI. Dengan ketentuan warna pada masing-masing object. Pemain menggunakan warna merah muda, sedangkan komputer atau AI menggunakan warna hijau.
Game Tick-Tack-Toe ini akan mengasah pikiran pemainnya. Karena pemain dipaksa untuk menerapkan strategi bila ingin memenangkan permainan. Game ini hanya dimainkan oleh satu orang pemain dan yang menjadi lawannya adalah komputer. Pada saat game ini dimainkan oleh seorang pemain (user), game akan berfikir bagaimana caranya untuk mengalahkan pemain (user).
 
4.      Aturan Permainan (Rule)
Pada setiap permainan memiliki beberapa aturan, begitu juga dengan permainan Tick-Tack-Toe 3x3x3. Beberapa aturan yang terdapat pada permainan ini yaitu:
  1. Pemain (User) memulai permainan terlebih dahulu, dan diberi kebebasan untuk memilih letak  object pada papan permainan, dengan cara meng-klik object dimanapun sesuai yang di inginkan.
  2. Komputer akan memulai permainan setelah pemain (user) memulai permainan terlebih dahulu
  3. Komputer diberi pembelajaran untuk menghalangi jalan pemain untuk mencapai Goal (Tujuan) dengan cara menghalangi jalan milik pemain agar tidak memilih object tersebut
  4. Komputer diberi pembelajaran untuk memenangkan permainan ini
  5. Pemain (user) maupun komputer (yang berperan sebagai lawan) harus menyusun warna yang sama membentuk satu garis lurus secara vertikal, horizontal, ataupun diagonal untuk memenangkan permainan ini

5.      Tujuan(Goal)
Untuk mencapai Goal(Tujuan) pada game Tick-Tack-Toe 3x3x3 adalah menyusun warna yang sama membentuk garis lurus yang terdiri dari 3 object secara vertikal, horizontal, ataupun diagonal. Kemudian pada saat pemain memiliki poin yang lebih banyak dari komputer atau AI maka pemain telah memenangkan permainan.

     
6.      Algoritma
Pada Game Tick-Tack-Toe ini menggunakan prinsip Algoritma Minimax. Permainan Tick-Tack-Toe ini memiliki sedikit kemungkinan solusi. Sehingga pemain tidak bisa memprediksi untuk setiap kombinasi langkah dari setiap kondisi dan posisi. Untuk memainkan permainan ini pemain membutuhkan strategi untuk memenangkan permainan.

7.      Listing Program
%============================================================%
%         This program is developed by Vibri Ariyaningrum           %
%                          from University of Gunadarma                                 %
%---------------------LISTINGAN MENU-------------------------%
?-
G_image is bitmap_image("coba.bmp",_),
set(pos([[[f,f,f],[f,f,f],[f,f,f]], [[f,f,f],[f,f,f],[f,f,f]], [[f,f,f],[f,f,f],[f,f,f]]])),
pen(5,rgb(0,0,100)),
window(_,_,win_func(_),"Tick-Tack-Toe 3x3x3",200,200,248,268). 
win_func(init) :-
          %background
          %window_brush(_, rgb(200,200,200)),
menu( normal, _, _, menu_new(_), "&New Game"),
menu( normal, _, _, menu_help(_), "&Help"),
menu( normal, _, _, menu_exit(_), "&Exit"),
menu( normal, _, _, menu_about(_), "&About").

menu_new(press) :-
 set(pos([[[f,f,f],[f,f,f],[f,f,f]],[[f,f,f],[f,f,f],[f,f,f]], [[f,f,f],[f,f,f],[f,f,f]]])),
          pen(5,rgb(0,0,100)),
     set(lose_flag(false)),
     brush(system_color(window)),
     update_window(_).
menu_help(press) :-
          message("Help","Arrange with The Same Color", i).
          check_func(press) :-
          set_check_box_value(_,1-get_check_box_value(_)).
         
menu_exit(press) :-
          close_window(_).

win_func(close) :-
beep("ok.wav"),
          not( yes_no("Information","Are you sure want to exit?",?)).
menu_about(press) :-
  shell_execute("DataDiri.txt").

%-----------------------LISTINGAN GAME-----------------------%

win_func(paint):-
   draw_bitmap(0,0,G_image,_,_),
   pos(Pos),
          N1 is count_successes(victory(x,Pos)),
          N2 is count_successes(victory(o,Pos)),
          S is "You: "+print(N1)+",       The computer: "+print(N2),
   text_out(0, 0, S),
   for(X,0,2),
   for(Y,0,2),
   for(Z,2,0,-1),
   member3(Pos,P,X,Y,Z),
   colour(P),
          X1 is 30+60*X+10*Z,
          Y1 is 30+60*Y+10*Z,
          X2 is X1+35,
          Y2 is Y1+35,
  ellipse(X1,Y1,X2,Y2),
fail.
win_func(paint).
  win_func(mouse_click(X,Y)):-
          X>30,
          Y>30,
          X<210,
          Y<210,
          X1 is (X- 30)//60,
          Y1 is (Y- 30)//60,
   pos(Pos),
   findZ(X,Y,Z1,X1,Y1),
   member3(Pos,f,X1,Y1,Z1),
   [X1,Y1,Z1]\=[1,1,1],
   !,
move(Pos2,Pos,x,X1,Y1,Z1),
 set(pos(Pos2)),
win_func(paint),
 Succ is -100,
  (N is count_successes(member3(Pos2,f,_,_,_)), N>8 -> think(Pos2, Succ, 1)
          else
  think(Pos2, Succ, 2)
 ),                                              
  win_func(paint),
  !, fail.
win_func(mouse_click(X,Y)):-
beep.

colour(f):-
brush(rgb(255,255,255)).
colour(x):-
brush(rgb(255,0,255)).
colour(o):-
brush(rgb(0,255,255)).
member([El,_,_],El,0).
member([_,El,_],El,1).
member([_,_,El],El,2).

  member2(Pos,El,X,Y):-
  member(Pos,Row,Y),
  member(Row,El,X).

  member3(Pos,El,X,Y,Z):-
  member(Pos,Page,Z),
  member(Page,Row,Y),
  member(Row,El,X).

findZ(X,Y,0,X1,Y1):-
          (X- 47- 60*X1)**2 + (Y- 47- 60*Y1)**2<289,!.
findZ(X,Y,1,X1,Y1):-
          (X- 57- 60*X1)**2 + (Y- 57- 60*Y1)**2<289,!.
findZ(X,Y,2,X1,Y1):-
          (X- 67- 60*X1)**2 + (Y- 67- 60*Y1)**2<289.

think(Pos, Succ, _):-
          member3(Pos,f,1,1,1),
          move(Pos2,Pos,o,1,1,1),
          set(pos(Pos2)).
think(Pos, Succ, _):-
 chronometer(T),
   not(member3(Pos,f,_,_,_)),
   N1 is count_successes(victory(x,Pos)),
   N2 is count_successes(victory(o,Pos)),
   (N1>N2->
    beep("good_one_sir.wav"),
          message("Congratulations", "You are the winner!!!!!!", !)
                   else  (N1=N2->
          message("OK", "This game is Draw.", i)
                   else
          message("Sorry", "You lost this time -.-",s)
)).
think(Pos, Succ, Deep):-
   move(Pos2,Pos,o),
   Succ2 is 100,
   min_max(Succ2, Pos2, Deep),
   Succ2>Succ,
   Succ:=Succ2,
   set(pos(Pos2)),
   fail.
think(_, _, _).

min_max(Succ,Pos,Deep):-
          Deep1 is Deep - 1,
          move(Pos2,Pos,x),
          Succ2 is -100,
          max_min(Succ2, Pos2, Deep1),
          Succ2<Succ,
          Succ:=Succ2,
          fail.
min_max(_,_,_).

replace([El,A,B],[_,A,B],El,0).
replace([A,El,B],[A,_,B],El,1).
replace([A,B,El],[A,B,_],El,2).

move(Pos2,Pos,P,X,Y,Z):-
          member(Pos,Page,Z),
          member(Page,Row,Y),
          replace(Row2, Row,P,X),
          replace(Page2, Page,Row2,Y),
          replace(Pos2, Pos,Page2,Z).

move(Pos2,Pos,W):-
          member3(Pos,f,X,Y,Z),
          move(Pos2,Pos,W,X,Y,Z).

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

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

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

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

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

8.      Daftar Pustaka
  1. http://cherinblog.blogspot.com/2012/05/algorithms-game-pada-permainan-tic-tac.html
  2. http://eckohoppus.wordpress.com/2010/11/29/manual-book-tik-tak-tu/
  3. http://techno-nugraha.blogspot.com/2012/05/analisis-game-tic-tac-toe.html

9.          Glosarium
 AI (Artificial Intelligence) atau kecerdasan buatan
Merupakan salah satu bagian ilmu komputer yang membuat agar mesin(komputer) dapat melakukan perkerjaan yang seperti dan sebaik yang dilakukan oleh manusia.

 Algoritma Minimax
Adalah Sebuah procedure pencarian yang melihat kedepan, memperhatikan apa yang akan terjadi, kemudian yang akan digunakan untuk memilih langkah berikutnya.