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:
- 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.
- Komputer akan memulai permainan setelah pemain (user) memulai permainan terlebih dahulu
- Komputer diberi pembelajaran untuk menghalangi jalan pemain untuk mencapai Goal (Tujuan) dengan cara menghalangi jalan milik pemain agar tidak memilih object tersebut
- Komputer diberi pembelajaran untuk memenangkan permainan ini
- 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
- http://cherinblog.blogspot.com/2012/05/algorithms-game-pada-permainan-tic-tac.html
- http://eckohoppus.wordpress.com/2010/11/29/manual-book-tik-tak-tu/
- 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.