?-
set(pos([[f,f,f], [f,f,f], [f,f,f]])),
set(lose_flag(false)),
brush(system_color(window)),
window( _, _, win_func(_), "Tick-Tack-Toe", 200, 100, 248, 268).
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) :-
ellipse(X1,Y1,X2,Y2),
line(((X2-X1)//2)+X1, ((Y2-Y1)//2)+Y1, X2, Y2).
write_mark(o, X1, Y1, X2, Y2) :-
X3 is X2-X1,
X4 is X3*1//5,
Y3 is Y2-Y1,
X5 is X3*4//5,
line(X1,Y1,X4+X1,Y2,X3//2+X1,Y3//2+Y1,X5+X1,Y2,X2,Y1).
win_func(paint) :-
pen(2, rgb(0, 0, 0)), % black
line(30, 30, 30, 210),
line(30, 210, 210, 210),
line(210, 210, 210, 30),
line(210, 30, 30, 30),
line(90, 30, 90, 210),
line(150, 30, 150, 210),
line(30, 90, 210, 90),
line(30, 150, 210, 150),
pen(4, rgb(255, 0, 0)), % red
put_mark(x),
pen(4, rgb(0, 0, 255)), % blue
put_mark(o),
fail.
win_func(mouse_click(X, Y)) :-
lose_flag(false),
X>30, Y>30,
X<210, Y<210,
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) :-
try_to_win(Pos), !.
think(Pos) :-
try_nolose(Pos), !.
try_nolose(Pos) :-
move(o, Pos, Sit2),
nolose(x, Sit2),
set(pos(Sit2)),
not(win_func(paint)).
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)),
message("Sorry","You cannot win against the AI.",s).
is_it_win(Sit2) :-
win(x, Sit2),
set(pos(Sit2)),
not(win_func(paint)).
member([Element, _, _], Element, 0).
member([_, Element, _], Element, 1).
member([_, _, Element], Element, 2).
replace([Element, A, B], [_, A, B], Element, 0).
replace([A, Element, B], [A, _, B], Element, 1).
replace([A, B, Element], [A, B, _], Element, 2).
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, _, _]]).
win( o, Sit) :- move(o, Sit, Sit2), win(x, Sit2).
win( x, Sit) :- victory(o, Sit).
win( x, Sit) :- not(nowin( x, Sit)).
nowin(x, Sit) :- move(x, Sit, Sit2), nowin(o, Sit2).
nowin( o, Sit) :- victory(x, Sit).
nowin(o, Sit) :- not(move(Sit)). % the last move belongs to X
nowin(o, Sit) :- not(win(o, Sit)).
lose( x, Sit) :- move(x, Sit, Sit2), lose(o, Sit2).
lose( o, Sit) :- victory(x, Sit).
lose( o, Sit) :- not(nolose( o, Sit)).
nolose(o, Sit) :- not(move(Sit)). % the last move belongs to X
nolose(o, Sit) :- move(o, Sit, Sit2), nolose(x, Sit2).
nolose( x, Sit) :- victory(o, Sit).
nolose(x, Sit) :- not(lose(x, Sit)).
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, _).
Tidak ada komentar:
Posting Komentar