Selasa, 16 Juni 2015

Manual Book GothelloGreen

INITIAL STATE
GothelloGreen merupakan suatu permainan Reversy atau biasa disebut Othello yang ada pada Strawbery Prolog. Pada game Othello menggunakan warna hitam putih sebagai pembeda untuk bidak pemain dan komputer. Sedangkan pada game GothelloGreen ini menjelaskan sebuah kotak-kotak 7 x 7 yang didalamnya terdapat tiga bidak yang bergambar Pohon dan tiga bidak yang bergambar Api, saya mengganti background game dengan design yang saya telah edit menggunakan paint, oleh karena itu game yang saya buat dinamakan GothelloGreen. Judul game yang saya buat terinspirasi dengan berita-berita kebakaran hutan di Indonesia. Dengan game ini pemain harus memperbanyak pohon-pohon agar hutan di Indonesia tetap lestari.

 
Gambar 1.1 Tampilan Splash Screen dan Timer

       Gambar 1.2 Tampilan Splash Screen dan Timer
Permainan ini menggunakan konsep AI atau Artificial Intelligence atau kecerdasan buatan. Kecerdasan buatan yang terdapat pada game ini berada pada komputer yang akan berperan sebagai lawan. Komputer akan selalu berusaha untuk mengalahkan pemain dengan cara menutup langkah pemain dengan membuat garis. Komputer mempunyai strategi sendiri agar menjadi pemenang untuk mengalahkan pemain.

Permainan GothelloGreen ini didalamnya terdapat beberapa button, yang ada di tampilan pada Window Menu terdapat tiga button yaitu button pertama Start untuk memulai permainan bila di klik maka akan membuka Window Game, button kedua About bila di klik akan menampilkan window tentang developed, ketiga button Exit bila di klik maka window akan keluar.

Pada button Start jika di klik akan memunculkan Window Game, pada Window Game terdapat Menu dan Back. Jika Menu di klik maka terdapat tiga pilihan, pilihan petama New Game untuk memulai permainan baru, kedua How To Play untuk menampilkan cara bermain permainan GothelloGreen, dan yang ketiga Exit untuk meninggalkan Window Game. Pada Back jika di klik akan kembali ke Window Menu.

Gambar 1.3 Tampilan Button About


Gambar 1.4 Tampilan Window Game

 Gambar 1.5 Bidak Api ( AI )              Gambar 1.6 Bidak Pohon ( User )

Gambar 1.7 Menu dan Back pada Window Game

 
Gambar 1.8 Tampilan Window Game

RULES
Rules atau aturan main yang digunakan pada permainan GothelloGreen. Cara bermainnya pun tidak jauh berbeda dengan Othello pada umumnya. Dan berikut adalah aturan permainan tersebut:

1.      Pada awal permainan diletakkan enam buah bidak berbentuk kotak, yaitu tiga bidak bergambar Pohon sebagai user dan tiga bidak bergambar Api sebagai AI di tengah-tengah papan dengan susunan seperti di bawah ini.

    Gambar 2.1 Tampilan awal dengan 6 bidak

2.      Letakkan disisi bidak dengan cara mengapit bidak lawan yang ada di papan dimana pada ujung dan pangkalnya harus ada bidak kepunyaan si pemain sebagai syarat untuk membaliknya agar menjadi kepunyaan si pemain. Dilakukan secara horizontal, vertical maupun diagonal.

         Gambar 2.2 Syarat peletakan bidak

3.      Bidak yang terjepit akan menjadi milik pemain yang menjepitnya.

4.      Jika pada semua kotak sudah terisi bidak kepunyaan pemain dan lawan diantara mereka mempunyai bidak yang sama banyak maka permainan dinyatakan permainan seri.

5.      Kondisi pemain menang apabila bidak bergambar pohon lebih banyak dari bidak bergambar api kepunyaan komputer.

6.      Kondisi pemain kalah apabila bidak pohon lebih sedikit dibandingkan bidak api kepunyaan komputer.

7.      Pemenang adalah pemain yang memiliki bidak terbanyak pada papan permainan dan permainan berakhir.



GOAL

Goal atau tujuan untuk menyelesaikan permainan GothelloGreen adalah dengan memenuhi daerah kotak papan permainan dengan bidak user lebih banyak dibandingkan bidak AI. Jika seorang pemain tidak dapat meletakan bidak karena seluruh kotak telah terisi atau tidak ada posisi yang diperbolehkan untuk meletakkan bidak, maka permainan berakhir. Pemenangnya adalah pemain yang memiliki bidak paling banyak di atas papan.
Pada game ini juga mempunyai goal atau tujuan untuk dapat memenangkan permainan dengan mengumpulkan bidak paling banyak dalam kotak yang tersedia. Pemain dengan bidak Pohonnya banyak maka akan memenangkan permainan. Berikut ini contoh pemain yang dapat memenangkan permainan:

Gambar 3.1 Tampilan Pemain Menang


Pemain pada game ini kalah apabila memiliki jumlah bidak Pohon lebih sedikit dari pada bidak Api. Dan berikut ini contoh pemain yang kalah pada permainan GothelloGreen ini:

Gambar 3.2 Tampilan Pemain Saat Kalah




KONSEP AI dan ALGORITMA

Kecerdasan buatan dapat diterapkan atau diimplementasikan kedalam berbagai bentuk aplikasi, yang paling mudah dan digemari oleh banyak orang misalnya pada sebuah permainan atau games. AI (Artificial Intelligence) adalah salah satu bagian ilmu komputer yang membuat agar mesin/komputer dapat melakukan pekerjaan seperti layaknya dan sebaik yang dilakukan oleh manusia. Permainan ini berbasis Artificial Intelligience (kecerdasan buatan). Pada permainan ini, kecerdasan buatan yang terkandung di dalamnya adalah AI yang dibuat untuk menjadi lawan user. Dan pada game ini manusia dibutuhkan kecerdasan, ketelitian untuk menguji pemikiran manusia untuk dapat dikatakan cerdas.

Jenis algoritma yang diterapkan dalam permainan GothelloGreen adalah Algoritma Minimax. Algoritma Minimax merupakan algoritma yang digunakan untuk menentukan pilihan agar memperkecil  kemungkinan kehilangan nilai maksimal.  Algoritma ini diterapkan dalam permainan yang melibatkan dua pemain dan permainan yang menggunakan strategi atau logika.

Algoritma Minimax pada GothelloGreen diterapkan oleh AI untuk dapat menentukan langkah apa yang sebaiknya diambil, agar langkah yang diambil tersebut bertujuan untuk membuat AI memenangkan permainan ini atau minimal membuat skor pemain menjadi sama.


LISTING PROGRAM
%=========================================================================%
% This game developed by      Name        : Karyna Khaerani
%                             NPM         : 54412038
%                             Class       : 3IA12
%                             Fakultas    : Teknik Industri
%                             Jurusan     : Teknik Informatika
%
%                             Gunadarma University
%=========================================================================%

?-

%========================= Background ====================================%
G_background1 is bitmap_image("pictures/backgroundsplashtimer.bmp",_),
G_background2 is bitmap_image("pictures/backgroundmenu.bmp",_),
%=========================================================================%


%========================= Timer dan Splash Screen =======================%
window(G_pertama,_,window_pertama(_),"Window Timer and Splash Screen",(100,200,800,400)).

window_pertama(init):-
      G_batas := 1,
      G_waktu is set_timer(_,1.0,fungsi_timer).

window_pertama(paint):-
      draw_bitmap(0,0,G_background1,_,_).

fungsi_timer(end):-
      G_batas := G_batas +1,
      (G_batas = 2 -> close_window(G_pertama),

window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500)).
window_kedua(paint):-
      draw_bitmap(0,0,G_background2,_,_).
%=========================================================================%

%=============================== Button Window Menu ==============================%
window_kedua(init):-
       button(_,_,tombol_1(_),"Start",450,200,125,30),
       button(_,_,tombol_2(_),"About",450,250,125,30),
       button(_,_,tombol_3(_),"Exit",450,300,125,30).
%=================================================================================%


%================================== Button Start =================================%
tombol_1(press):-
       close_window(G_kedua),
       beep("sound//simplesound"),
       G_title is bitmap_image("pictures/game4.bmp",_),
       set(sit([[n,n,n,n,n,n,n],[n,n,n,n,n,n,n],[n,n,n,n,n,n,n],[n,n,w,b,w,n,n],[n,n,b,w,b,n,n],[n,n,n,n,n,n,n],[n,n,n,n,n,n,n]])),
       pen(3,rgb(0,255,0)),
       window(G_ketiga,_,window_ketiga(_),"Window Game GothelloGreen",100,50,1024,650).
window_ketiga(paint):-
       draw_bitmap(0,0,G_title,_,_),
fail.
%=================================================================================%

%================================= Deklarasi Menu Game ===========================%
window_ketiga(init):-
menu(pop_up,_,_,menu_game(_),"&Menu"),
menu(normal,_,_,menu_back(_),"&Back").

menu_game(init):-
menu(normal,_,_,menu_newgame(_),"&New Game"),
menu(normal,_,_,menu_htp(_),"&How To Play"),
menu(normal,_,_,menu_exit(_),"&Exit").
%=================================================================================%


%================================= Button New Game ===============================%
menu_newgame(press):-
       close_window(G_ketiga),
       G_title is bitmap_image("pictures/game4.bmp",_),
       set(sit([[n,n,n,n,n,n,n],[n,n,n,n,n,n,n],[n,n,n,n,n,n,n],[n,n,w,b,w,n,n],[n,n,b,w,b,n,n],[n,n,n,n,n,n,n],[n,n,n,n,n,n,n]])),
       pen(3,rgb(0,255,0)),
       window(G_ketiga,_,window_ketiga(_),"Window Game GothelloGreen",100,50,1024,650).
window_ketiga(paint):-
       draw_bitmap(0,0,G_title,_,_),
fail.
%=================================================================================%


%============================= Button Back Menu ==================================%
menu_back(press):-
       close_window(G_ketiga),
       window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500).
%=================================================================================%


%=========================== Button How To Play Menu =============================%
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).
%=================================================================================%



%=========================== Button Exit Menu ====================================%
menu_exit(press):-
       message("Pesan","Good Bye !!!",i),
       beep("sound//exit"),
       close_window(G_ketiga).
%=================================================================================%



%============================= Garis Game ========================================%
window_ketiga(paint):-
     brush(rgb(255,255,255)),
     rect(50,50,400,400),
     for(I,0,7),
     X is I * 50 + 50,
     line(X,50,X,400),
     line(50,X,400,X),
     fail.
%=================================================================================%


%=============================== Bidak AI ========================================%
window_ketiga(paint):-    
     brush("pictures//fire.bmp"),
     sit(H),
     for(J,0,7),
     for(I,0,7),
     take(H,Line,J),
     take(Line,b,I),
     X is I*50 + 50,
     Y is J*50 + 50,
     X1 is X + 50,
     Y1 is Y + 50,
     rect(X,Y,X1,Y1),
     fail.
%=================================================================================%


%================================= Bidak player ==================================%
window_ketiga(paint):-    
     brush("pictures//tree.bmp"),
     sit(H),
     for(J,0,7),
     for(I,0,7),
     take(H,Line,J),
     take(Line,w,I),
     X is I*50 + 50,
     Y is J*50 + 50,
     X1 is X + 50,
     Y1 is Y + 50,
     rect(X,Y,X1,Y1),
     fail.
%=================================================================================%



%=========================== Kondisi WIN atau Lose ===============================%
window_ketiga(paint):-
brush(rgb(128,255,255)),
sit(H),
N1 is count_successes(victory(w,H)),
N2 is count_successes(victory(b,H)),
text_out(425, 525, "Tree : "+print(N1)+" "),
text_out(50, 525, "Fire : "+print(N2)+" "),

(N1>N2, N1+N2<49 ->
text_out(155,450, "      Info : Yeeyy, You Win        ")
else(N1>N2, N1+N2 =:=49 ->
ask1
else (N1=\= 2, N2=\= 2, N1=N2, N1+N2<49->
text_out(145,450, "      Info : Heemmmm, Draw    ")
else (N1 = N2, N1+N2 =:=49 ->
ask3
else (N1<N2, N1+N2<49 ->
text_out(150,450, "     Info : Sorry, You Lose     ")
else (N1 < N2, N1+N2=:=49 ->
ask2
)))))).
%=================================================================================%


%=================================== Pesan =======================================%
ask1:-
message("End Game","Congratulations...",i),
close_window(G_ketiga),
window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500).


ask2:-
message("You Lose","On Fire",i),
close_window(G_ketiga),
window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500).


ask3:-
message("End Game","Fire and Tree Balance",i),
close_window(G_ketiga),
window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500).
%=================================================================================%


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

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,6):-
  take2(Sit,El,0,6).

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

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

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,G],[_,B,C,D,E,F,G],New,0).
replace([A,New,C,D,E,F,G],[A,_,C,D,E,F,G],New,1).
replace([A,B,New,D,E,F,G],[A,B,_,D,E,F,G],New,2).
replace([A,B,C,New,E,F,G],[A,B,C,_,E,F,G],New,3).
replace([A,B,C,D,New,F,G],[A,B,C,D,_,F,G],New,4).
replace([A,B,C,D,E,New,G],[A,B,C,D,E,_,G],New,5).
replace([A,B,C,D,E,F,New],[A,B,C,D,E,F,_],New,6).


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

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




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


%=================================== Button About ================================%
tombol_2(press):-
       close_window(G_kedua),
       beep("sound//simplesound"),
       G_title is bitmap_image("pictures/about.bmp",_),
       window(G_keempat,_,window_keempat(_),"Window About",100,100,600,400).
      
window_keempat(paint):-
       draw_bitmap(0,0,G_title,_,_),
fail.

window_keempat(init):-
       menu(normal,_,_,menu_back(_),"&Back").

menu_back(press):-
       close_window(G_keempat),
       window(G_kedua,_,window_kedua(_),"Window Menu",100,200,666,500).
fail.
%=================================================================================%

      
                    
%================================ Button Exit ====================================%
tombol_3(press):-
       beep("sound//simplesound"),
       message("Pesan","Good Bye !!!",i),
       beep("sound//exit"),
       close_window(G_kedua).
%=================================================================================%






GLOSARIUM

Strawberry Prolog
Strawberry Prolog adalah bahasa pemrograman Prolog. Sintaksnya sangat dekat dengan ISO-Prolog tapi itu memiliki banyak ekstensi yang bukan bagian dari standar. Gagasan utama dari Strawberry Prolog adalah sangat mudah digunakan dan itulah mengapa beberapa universitas menggunakannya untuk prolog kursus mereka.

Algoritma
Algoritma adalah kumpulan perintah-perintah untuk menyelesaikan suatu masalah. Algoritma akan dapat selalu berakhir untuk semua kondisi awal yang memenuhi kriteria. Algoritma sering mempunyai langkah pengulangan atau memerlukan keputusan sampai tugasnya selesai.

Algoritma minimax
Merupakan basis dari semua permainan berbasis AI seperti permainan catur misalnya. AI permainan catur tentunya sudah sangat terkenal dimana AI tersebut bahkan dapat mengalahkan juara dunia sekalipun. Pada algoritma minimax, pengecekan akan seluruh kemungkinan yang ada sampai akhir permainan dilakukan.

Artificial Intelligence
Kecerdasan buatan dapat diterapkan atau diimplementasikan kedalam berbagai bentuk aplikasi, yang paling mudah dan digemari oleh banyak orang misalnya pada sebuah permainan atau games. AI (Artificial Intelligence) adalah salah satu bagian ilmu komputer yang membuat agar mesin/komputer dapat melakukan pekerjaan seperti layaknya dan sebaik yang dilakukan oleh manusia.

Initial States
Initial States merupakan sebuah kondisi awal pada sebuah object sebelum ada perubahan keadaan.

Othello atau Reversy
Permainan yang terdapat pada Strawberry Prolog. Reversy adalah permainan dengan memperebutkan daerah papan dengan cara membalik bidak lawan menjadi bidak sendiri.

  
DAFTAR PUSTAKA