·
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 :
- New
Game : jika menu ini di klik maka
menandakan pemain sudah siap
untukmemulai permainan,
dan waktu akan berjalan mundur selama 15 detik.
- Help :
jika menu ini di klik maka akan ada kotak dialog sebagai penjelasanyang
harus dilakukan dalam
game ini.
- Exit :
untuk keluar dari permainan.
- Music
: jika menu ini di klik maka akan terdengar backsound saat kita
memainkan game ini.
- 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.
2. 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.
3. 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
- http://en.wikipedia.org/wiki/Tic-tac-toe
- http://bungatiarakaristi.blogspot.com/2012/05/algoritma-permainan-pada-tictactoe-5x5.html
- http://en.wikipedia.org/wiki/Prolog
Nama : Ivan Muhammad Rifai
NPM : 53411756
Kelas : 3IA11