Senin, 07 Juli 2014

Progres Game Kriting Wajik

KECERDASAN BUATAN
Kecerdasan Buatan dimunculkan oleh seorang professor dari Massachusetts Institute of Technology (MIT) yang bernama John McCarthy pada tahun 1956 pada saat Dart Mouth Conference yang dihadiri oleh para peneliti AI.
  • Definisi Kecerdasan Buatan
Banyak cara untuk mendefinisikan Kecerdasan Buatan, diantaranya adalah:
ü  Suatu studi yang mengupayakan bagaimana agar computer berlaku cerdas.
ü  Studi yang membuat komputer dapat menyelesaikan persoalan yang sulit.
Kecerdasan Buatan (Artificial Intelligence) adalah Teknologi yang mensimulasikan kecerdasan manusia, yaitu bagaimana mendefinisikan dan mencoba menyelesaikan persoalan menggunakan komputer dengan meniru bagaimana manusia menyelesaikan dengan cepat.
Kecerdasan diciptakan dan dimasukkan ke dalam suatu mesin (komputer) agar dapat melakukan pekerjaan seperti yang dapat dilakukan manusia. Beberapa macam bidang yang menggunakan kecerdasan buatan antara lain sistem pakar, permainan komputer (games), logika fuzzyjaringan syaraf tiruan dan robotika.

INITIAL STATE
Initial state dalam game TicTacToe 5x5 ini akan menampilkan arena permainan dengan papan kotak-kotak yang berdimensi 5x5, dimana terdapat 5 baris dan 5 kolom. Objek yang akan bermain dalam game ini adalah “user” atau pemain dan komputer yang telah diberi AI. TicTacToe yang saya buat ini sedikit berbeda dengan kebanyakan game sejenis yang ada. Pada permainan TicTacToe yang umum biasanya menggunakan X dan O sebagai simbol dari pemain dan komputer. Sedangkan pada game yang buat akan sedikit dimodifikasi karena saya menggunakan tema TinkerBell dengan simbol X dan O yang diganti dengan gambar Kriting  danWajik
Penggunaan tema game yang berbeda dari yang umum digunakan dimaksudkan untuk menghilangkan kejenuhan pada pemainnya. Karena game ini merupakan salah satu permainan asah otak yang baik diterapkan kepada anak-anak dalam masa perkembangannya, maka mengganti tema game saya pilih untuk lebih menarik minat pemainnya.


Didalam game ini terdapat menu yang terdapat dibagian atas kotak permainan, antara lain :
  1. New Game       : jika menu ini di klik maka menandakan pemain sudah siap untukmemulai permainan, dan waktu akan berjalan mundur selama 15 detik.
  2. Help                 : jika menu ini di klik maka akan ada kotak dialog sebagai penjelasanyang harus dilakukan dalam game ini.

  1. Exit                  : untuk keluar dari permainan.
  2. Music               : jika menu ini di klik maka akan terdengar backsound saat kita memainkan game ini.
  3. Stop                 : jika menu ini di klik maka backsound saat kita memainkan game ini akan berhenti
Tampilan saat Game dijalankan



Tampilam Awal Game



Tampilan Tanpa New Game



Tampilan New Game






















Tampilan Menu Help



Tampilan Waktu Habis




















Listing Program


win_deep(0). % You can change this two numbers to make the AI more clever
nolose_deep(0).

?- 
G_BG is bitmap_image("latar4.bmp",_),
G_A is bitmap_image("kriting.bmp",_),
G_B is bitmap_image("wajik.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]])),
  set(lose_flag(false)),
  brush(system_color(window)),
  window_n( _, _, win_func,"Kriting Wajik", 10, 10, 430, 450,_,_,rgb(0,0,0)),
  message("Mulai permainan","untuk memulai permainan klik new game",i).

win_func(init) :-
  window_brush(_,rgb(100,250,250)),
  menu( normal, _, _, menu_new(_), "&New Game"),
  menu( normal, _, _, menu_help(_), "&Help"),
  menu( normal, _, _, menu_exit(_), "&Exit"),
  menu(normal,_,_,music(_),"&music"),
  menu(normal,_,_,stop(_),"&stop").

music(press) :-
  execute("sound\\1.exe"),
  fail.

stop(press) :-
  execute("sound\\d.bat"),
  close_window(parent(_)).

menu_new(press) :-
  G_Interval:=1,
  G_Time:=25,
  G_Time2:=1,
  G_Timer := set_timer(_, G_Interval, time_func),
  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]])),
  set(lose_flag(false)),
  update_window(_).
%Deklarasi waktu
time_func(end) :-
  G_Time=0, !,
  kill_timer(_, G_Timer),
  message("waktu habis","maaf waktu anda habis",i),
  close_window(_),
  execute("sound\\d.bat"),
  fail.

time_func(end) :-
   G_Time2 :=1,
   G_Time2 :=G_Time,
  G_Time := G_Time - 1,
color_text(_, rgb(0,0,0)),
font(12,20,"Arial"),
   text_out(185,5, "Time Left  "+ G_Time),
   fail.

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

menu_help(press) :-
  message("Options","Membuat Garis Lurus Vertical, Horizontal atau Diagonal", i).

menu_exit(press) :-
  execute("sound\\d.bat"),
  close_window(_).


put_mark(Mark) :-
   pos(Current_Pos),
   member(Current_Pos, L, Y),
   member(L, Mark, X),
   X1 is 40 + 60*X, Y1 is 40 + 60*Y, X2 is X1 + 40, Y2 is Y1 +40, 
   write_mark(Mark, X1, Y1, X2, Y2),
   fail.
put_mark(_).

write_mark(x, X1, Y1, X2, Y2) :-
  %line(X1, Y1, X2, Y2),
  %line(X2, Y1, X1, Y2).
  draw_bitmap(X1, Y1, G_B, _, _).

write_mark(o, X1, Y1, X2, Y2) :-
  %ellipse(X1, Y1, X2, Y2).
  draw_bitmap(X1, Y1, G_A, _, _).


win_func(paint) :-  
   pen(2, rgb(255, 255, 255)),   % grey
   draw_bitmap(0, 0, G_BG, _, _),
   line(30, 30, 30, 330),
   line(30, 330, 330, 330),
   line(30, 270, 330, 270),
   line(330, 330, 330, 30),
   line(330, 30, 30, 30),
   line(90, 30, 90, 330),
   line(150, 30, 150, 330),
   line(210, 30, 210, 330),
   line(30, 90, 330, 90),
   line(30, 150, 330, 150),
   line(30, 210, 330, 210),
   line(270,30, 270,330),

   pen(4, rgb(255, 128, 192)),   % pink
   put_mark(x),
   pen(4, rgb(0, 128, 255)),   % blue
   put_mark(o),
   
   fail.

win_func(mouse_click(X, Y)) :- 
  lose_flag(false),
  X>30, Y>30,
  X<330, Y<330,
  X1 is (X - 30)//60,
  Y1 is (Y - 30)//60,
  pos(Current_Pos),
  member(Current_Pos, L, Y1),
  member(L, f, X1),
  !,
  replace(L2, L, x, X1),
  replace(Current_Pos2, Current_Pos, L2, Y1),
  set(pos(Current_Pos2)),
  not(win_func(paint)),
  think(Current_Pos2).

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

think(Pos) :-
  victory(x, Pos), !,
  set(lose_flag(true)),
  beep("sound\\tepuk.wav"),
  message("Selamat","Anda Menang", !).

think(Pos) :-
  try_to_win(Pos), !.

think(Pos) :-
  retractall(last_good_move(_)), try_nolose(Pos).

think(_) :-
  last_good_move(Sit2), !,
  set(pos(Sit2)),
  not(win_func(paint)).

think(Pos) :-
  move(o, Pos, Sit2),
  nolose(x, Sit2, Deep), !, % Tries to make the lose farther
  set(pos(Sit2)),
  not(win_func(paint)).

think(Pos) :-
  move(o, Pos, Sit2),
  set(pos(Sit2)),
  not(win_func(paint)).

try_nolose(Pos) :-
  move(o, Pos, Sit2),
  nolose_deep(Deep),
  nolose(x, Sit2, Deep),
  set(last_good_move(Sit2)),
  random(3)=:=0, !, fail. % this makes the game more interesting

try_to_win(Pos) :-
  move(o, Pos, Sit2),
  is_it_win(Sit2).

is_it_win(Sit2) :-
  victory(o, Sit2),
  set(pos(Sit2)),
  not(win_func(paint)),
  set(lose_flag(true)),
  beep("sound\\ketawa.wav"),
  message("Maaf","Anda Kalah", s).

is_it_win(Sit2) :-
  win_deep(Deep),
  win(x, Sit2, Deep),
  set(pos(Sit2)),
  not(win_func(paint)).

member([Element, _, _, _, _], Element, 0).
member([_, Element, _, _, _], Element, 1).
member([_, _, Element, _, _], Element, 2).
member([_, _, _, Element, _], Element, 3).
member([_, _, _, _, Element], Element, 4).


replace([Element, A, B, C, D], [_, A, B, C, D], Element, 0).
replace([A, Element, B, C, D], [A, _, B, C, D], Element, 1).
replace([A, B, Element, C, D], [A, B, _, C, D], Element, 2).
replace([A, B, C, Element, D], [A, B, C, _, D], Element, 3).
replace([A, B, C, D, Element], [A, B, C, D, _], Element, 4).


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

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

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

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

win( o, Sit, Deep) :- move(o, Sit, Sit2), win(x, Sit2, Deep).
win( x, Sit, _) :- victory(o, Sit).
win( x, Sit, 0) :- !, fail.
win( x, Sit, Deep) :- Deep1 is Deep - 1, not(nowin( x, Sit, Deep1)).

nowin(x, Sit, _) :- not(move(Sit)). % the last move belongs to O
nowin(x, Sit, Deep) :- move(x, Sit, Sit2), nowin(o, Sit2, Deep).
nowin(o, Sit, _) :- victory(x, Sit).
nowin(o, Sit, Deep) :- not(win(o, Sit, Deep)).

lose( x, Sit, Deep) :- move(x, Sit, Sit2), lose(o, Sit2, Deep).
lose( o, Sit, _) :- victory(x, Sit).
lose( o, Sit, 0) :- !, fail.
lose( o, Sit, Deep) :- Deep1 is Deep - 1, not(nolose( o, Sit, Deep1)).

nolose(o, Sit, Deep) :- move(o, Sit, Sit2), nolose(x, Sit2, Deep).
nolose(x, Sit, _) :- victory(o, Sit).
nolose(x, Sit, _) :- not(move(Sit)). % the last move belongs to O
nolose(x, Sit, Deep) :- not(lose(x, Sit, Deep)).

move(P, Sit, Sit2) :- 
  member(Sit, L, Y),
  member(L, f, X),
  replace(L2, L, P, X),
  replace(Sit2, Sit, L2, Y).

move(Sit) :- 
  member(Sit, L, _),
  member(L, f, _).

Goal

            Tujuan (goal) untuk menyelesaikan permainan ini adalah membuat sebuah garis lurus yang terdiri 5 kotak deretan simbol secara vertical, horizontal maupun diagonal.
Terdapat beberapa kondisi yang mungkin terjadi pada permainan ini, yaitu :
  1. KONDISI MENANG
Kondisi menang terjadi apabila kita berhasil membentuk sebuah garis lurus yang terdiri dari 5 buah simbol Kucing, baik secara horizontal, vertikal maupun diagonal.




  1. KONDISI KALAH
Kondisi kalah yang pertama terjadi apabila kita tidak berhasil membentuk 5 buah simbol Kucing secara horizontal, vertikal ataupun diagonal. Atau kondisi dimana AI menang terlebih dahulu.


  1. KONDISI SERI
Kondisi seri terjadi apabila semua kotak telah terisi tetapi belum ada yang bisa membentuk 5 buah simbol secara berurutan secara vertikal, horizontal maupun diagonal. 



Daftar Pustaka

Manual Book Game Kriting Wajik

 A.  Initial Game

§  Bahasa dan Program Editor
Game “Kriting Wajik” adalah game yang diadaptasi dari game Tic Tac Toe lalu saya kembangkan dengan menggunakan bahasa pemrograman Prolog. Prolog adalah bahasa pemrograman logika atau disebut juga sebagai bahasa non-procedural. Namanya diambil dari bahasa Perancis programmation en logique (pemrograman logika). Bahasa ini diciptakan oleh Alain Colmerauer dan Robert Kowalski sekitar tahun 1972 dalam upaya untuk menciptakan suatu bahasa pemrograman yang memungkinkan pernyataan logika alih-alih rangkaian perintah untuk dijalankan komputer.
Dalam hal ini saya menggunakan Strawberry Prolog sebagai program editor. Alasan kami menggunakan strawberry prolog ini karena menurut kami editor ini mudah untuk digunakan dan mudah untuk mengimplementasikan AI secara sederhana dan merupakan aplikasi light edition yang artinya program ini dapat dijalankan langsung tanpa perlu diinstal. Strawberry Prolog dihasilkan oleh Institut Matematika dan Informatika pada Akademi Ilmu Pengetahuan Bulgaria . Versi pertama dirilis pada tahun 1996. Pemimpin tim Strawberry Dimiter Dobrev.

§  Tampilan Menu Utama



Pada tampilan utama game Kriting Wajik terdapat tiga tombol yang masing-masing fungsinya yaitu sebagai berikut :
Ø  Mulai                 = Tombol ini berfungsi untuk masuk ke jendela untuk memainkan game
                               Kriting Wajik.
Ø  Cara Bermain    = Tombol ini berfungsi untuk masuk ke jendela cara bermain yang di
                             dalamnya terdapat cara memainkan game Kriting Wajik.
Ø  Keluar               = Tombol ini berfungsi untuk keluar dari game Kriting Wajik.

§  Tampilan Main



Pada tampilan main game Kriting Wajik terdapat sisa waktu, arena bermain, dan menu dengan submenu Mulai Baru, Cara Main, About, dan Keluar. Fungsi-fungsinya yaitu sebagai berikut:
Ø  Sisa Waktu          = berfungsi untuk menghitung mundur waktu jika waktu habis maka
                                  permainan selesai.
Ø  Arena Bermain = tempat untuk memainkan game Kriting Wajik.
Ø  Menu                    =     -      Mulai Baru : berfungsi untuk mamulai permainan dari awal.
-          Cara Main  : berfungsi untuk masuk ke jendela Cara Bermain.
-          About         : berfungsi untuk menampilkan tentang game.
-          Keluar         : berfungsi untuk keluar dari game Kriting Wajik.

§  Tampilan Cara Bermain


         

Pada tampilan cara bermain yaitu menjelaskan tentang cara memainkan game Kriting Wajik. Di dalamnya juga terdapat dua tombol yaitu Kembali Ke Menu dan Main yang masing-masing fungsinya adalah sebagai berikut :
Ø  Kembali Ke Menu            = berfungsi untuk kembali ke layar utama game Kriting Wajik.
Ø  Main                                 = berfungsi untuk masuk ke layar main.

II.                                                  B.  Rules (Peraturan Permainan)

Game Kriting Wajik adalah game yang diadaptasi dari game Tic Tac Toe. Game TicTacToe adalah sebuah game 2 dimensi yanng bertujuan untuk melatih otak dan untuk hiburan semata.

Peraturan Permainan :

1.       Game ini hanya dapat dimainkan oleh satu pemain melawan satu AI.

2.       Pemain menggunakan logo Kriting sedangkan AI menggunakan logo Wajik.

3.       Pemain mengisi kotak terlebih dahulu dalam permainan.

4.       Pemain dan AI saling bergantian untuk mengisi kotak.

5.       Isi kotak yang masih kosong, tidak bisa mengisi kotak yang telah diisi sebelumnya.

6.       Cara menyusun untuk memenangkan permainan bisa dengan vertikal, horizontal maupun diagonal sebanyak sepuluh (10).

7.       Jika waktu habis, maka permainan akan selesai dan permainan dianggap seri.

8.       Pemenang adalah yang paling cepat menyusun Kriting ataupun Wajik sebanyak sepuluh.

III.                                               C. GOAL

v  Tampilan Saat Menang
Untuk memenangkan permainan ini hanya dengan menyusun logo kriting sebanyak sepuluh dengan cara diagonal, vertical, maupun horizontal dan akan memunculkan kotak dialog yang mengatakan “Anda Menang”.

v  Tampilan Saat Kalah


Jika logo wajik disusun lebih dulu oleh AI sebanyak sepuluh maka pemain akan kalah dan akan muncul kotak dialog yang mengantakan “Yah Kalah”.



            D.              Konsep Algoritma

Kecerdasan buatan atau yang sering disebut dengan AI pada game ini terletak pada komputer yang akan bertindak sebagai lawan. Algoritma yang digunakan pada game ini yaitu algoritma Minimax. Komputer akan selalu berusaha mengalahkan user. Komputer dapat menyusun strateginya sendiri agar menjadi pemenangKeuntungan yang didapat dengan menggunakan algoritma minimax ini yaitu algoritma minimax mampu menganalisis segala kemungkinan posisi permainan untuk menghasilkan keputusan yang terbaik karena algoritma minimax ini bekerja secara rekursif dengan mencari langkah yang akan membuat lawan mengalami kerugian minimum.

Semua strategi lawan akan dihitung dengan algoritma yang sama dan seterusnya. Ini berarti, pada langkah pertama komputer akan menganalisis seluruh pohon permainan. Dan untuk setiap langkahnya, komputer akan memilih langkah yang paling membuat lawan mendapatkan keuntungan minimum, dan yang paling membuat komputer itu sendiri mendapatkan keuntungan maksimum. Dalam penentuan keputusan tersebut dibutuhkan suatu nilai yang merepresentasikan kerugian atau keuntungan yang akan diperoleh jika langkah tersebut dipilih. Untuk itulah disini digunakan sebuah fungsi heurisitic untuk mengevaluasi nilai sebagai nilai yang merepresentasikan hasil permainan yang akan terjadi jika langkah tersebut dipilih. Biasanya pada permainan tac tic toe ini digunakan nilai 1,0,-1 untuk mewakilkan hasil akhir permainan berupa menang, seri, dan kalah. Dari nilai-nilai heuristic inilah komputer akan menentukan simpul mana dari pohon permainan yang akan dipilih, tentunya simpul yang akan dipilih tersebut adalah simpul dengan nilai heuristic yang akan menuntun permainan ke hasil akhir yang menguntungkan bagi komputer. Dan algoritma greedy juga termasuk di dalamnya.

Algoritma greedy merupakan metode yang paling populer untuk memecahkan masalah optimasi. Algoritma greedy membentuk solusi langkah per langkah.Pendekatan yang digunakan di dalam algoritma greedy adalah membuat pilihan yang tampak memberi perolehan terbaik, yaitu dengan membuat pilihan optimum local pada setiap langkah dengan harapan akan mengarah ke solusi optimum global.Prinsip algoritma greedy pada setiap langkah ialah mengambil pilihan terbaik yang dapat diperoleh saat itu tanpa memperhatikan konsekuensi ke depan, dan berharap bahwa dengan memilih optimum lokal pada setiap langkah akan menghasilkan optimum global pada akhir proses.Persoalan optimasi algoritma greedy disusun oleh elemen-elemen berikut :

1.   Himpunan kandidat, yang berisi elemen-elemen pembentuk solusi.
2.   Himpuan solusi, berisi kandidat-kandidat yang terpilih sebagai solusi persoalan.
3.   Fungsi seleksi, dinyatakan dengan predikat SELEKSI memilih kandidat yang
      paling memungkinkan mencapai solusi optimal pada setiap langkah.

4.   Fungsi kelayakan, dinyatakan dengan predikat LAYAK, memeriksa apakah suatu
kandidat yang telah dipilih dapat memberikan solusi yang layak dengan tidak melanggar constraints yang ada.
5.   Fungsi objektif, yang memaksimumkan atau meminimumkan nilai solusi.Prinsip
algoritma greedy pada setiap langkah ialah mengambil pilihan terbaik yang dapat diperoleh saat itu tanpa memperhatikan konsekuensi ke depan, dan berharap bahwa dengan memilih optimum lokal pada setiap langkah akan menghasilkan optimum global pada akhir proses.

E. Glosarium

1.      Strawberry Prolog                   : Adalah dialek dari Prolog bahasa pemrograman . Sintaksnya sangat dekat dengan ISO-Prolog tapi itu memiliki banyak ekstensi yang bukan bagian dari standar.

2.      AI (Artificial Intelegent)          : Biasa disebut dengan Kecerdasan Buatan adalah kecerdasan yang diciptakan dan dimasukkan ke dalam suatu mesin, dalam   hal ini adalah computer agar dapat melakukan pekerjaan seperti yang dapat dilakukan oleh manusia.

3.      Algoritma greedy                    : Merupakan metode yang paling populer untuk memecahkan masalah optimasi.

           4.      Kriting                                    : Logo kriting diambil dari logo kartu bridge.

           5.      Wajik                                      : Logo wajik diambil dari logo kartu bridge.


           Daftar Pustaka
           M09Algoritma%20Greedy.pdf