#!/usr/www/users/dimiter/cgi-bin/strawberry ?- X is scan(get_environment_arg(0, getenv("QUERY_STRING"))), go(X). go(new):- say([[[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]]], "It's your move.", yes). go(X):- Y is scan(get_environment_arg(1, getenv("QUERY_STRING"))), Pos is scan(get_environment_arg(2, getenv("QUERY_STRING"))), C is scan(get_environment_arg(3, getenv("QUERY_STRING"))), play(X, Y, Pos, C). play(X1, Y1, Pos, [X, Y]):- findZ(X,Y,Z1), member3(Pos,f,X1,Y1,Z1), !, move(Pos2,Pos,x,X1,Y1,Z1), think(Pos3,Pos2). play(X, Y, Pos, C):- say(Pos, "Please, click one of the white balls.", yes). think(Pos2,Pos):- victory(x,Pos), say(Pos, "Congratulations! You are the winner.", no). think(Pos2,Pos):- member3(Pos,f,X,Y,Z), move(Pos2,Pos,o,X,Y,Z), win(x,Pos2,1), advice(Pos2). think(Pos2,Pos):- member3(Pos,f,X,Y,Z), move(Pos2,Pos,o,X,Y,Z), nolose(x,Pos2,1), say(Pos2, "It's your move.", yes). think(Pos2,Pos):- member3(Pos,f,X,Y,Z), move(Pos2,Pos,o,X,Y,Z), say(Pos2, "Go on, you have big chances in this game.", yes). advice(Pos) :- victory(o,Pos), !, say(Pos, "Sorry but this time you lost.", no). advice(Pos) :- say(Pos, "Give up. You have no chance.", yes). 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):- (X- 13)**2 + (Y- 13)**2<144,!. findZ(X,Y,1):- (X- 26)**2 + (Y- 26)**2<144,!. findZ(X,Y,2):- (X- 39)**2 + (Y- 39)**2<144. 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). victory2(Who,[[Who,Who,Who],_,_]). victory2(Who,[_,[Who,Who,Who],_]). victory2(Who,[_,_,[Who,Who,Who]]). victory2(Who,[[Who,_,_],[Who,_,_],[Who,_,_]]). victory2(Who,[[_,Who,_],[_,Who,_],[_,Who,_]]). victory2(Who,[[_,_,Who],[_,_,Who],[_,_,Who]]). victory2(Who,[[Who,_,_],[_,Who,_],[_,_,Who]]). victory2(Who,[[_,_,Who],[_,Who,_],[Who,_,_]]). victory(Who,Pos):- member(Pos,Page,_), victory2(Who,Page). victory(Who,Pos):- member(Pos,Page0,0), member2(Page0,Who,X,Y), member(Pos,Page1,1), member2(Page1,Who,X,Y), member(Pos,Page2,2), member2(Page2,Who,X,Y). victory(Who,Pos):- member(Pos,Page0,0), member2(Page0,Who,X,0), member(Pos,Page1,1), member2(Page1,Who,X,1), member(Pos,Page2,2), member2(Page2,Who,X,2). victory(Who,Pos):- member(Pos,Page0,0), member2(Page0,Who,X,2), member(Pos,Page1,1), member2(Page1,Who,X,1), member(Pos,Page2,2), member2(Page2,Who,X,0). victory(Who,Pos):- member(Pos,Page0,0), member2(Page0,Who,0,Y), member(Pos,Page1,1), member2(Page1,Who,1,Y), member(Pos,Page2,2), member2(Page2,Who,2,Y). victory(Who,Pos):- member(Pos,Page0,0), member2(Page0,Who,2,Y), member(Pos,Page1,1), member2(Page1,Who,1,Y), member(Pos,Page2,2), member2(Page2,Who,0,Y). victory(Who,[[[Who,_,_],_,_],[_,[_,Who,_],_],[_,_,[_,_,Who]]]). victory(Who,[[_,_,[_,_,Who]],[_,[_,Who,_],_],[[Who,_,_],_,_]]). victory(Who,[[[_,_,Who],_,_],[_,[_,Who,_],_],[_,_,[Who,_,_]]]). victory(Who,[[_,_,[Who,_,_]],[_,[_,Who,_],_],[[_,_,Who],_,_]]). win(x,Pos,Deep):- victory(o,Pos). win(x,_,0):- !, fail. win(x,Pos,Deep):- Deep1 is Deep - 1, not(nowin(x,Pos,Deep1)). win(o,Pos,Deep):- move(Pos2,Pos,o), win(x,Pos2,Deep). nowin(x, Pos,Deep) :- move(Pos2, Pos, x), nowin(o, Pos2,Deep). nowin( o, Pos,Deep) :- victory(x, Pos). nowin(o, Pos,Deep) :- not(member3(Pos,f,_,_,_)). % the last move belongs to X nowin(o, Pos,Deep) :- not(win(o, Pos,Deep)). nolose(x,Pos,Deep):- victory(o,Pos). nolose(o,Pos,Deep):- not(member3(Pos,f,_,_,_)). nolose(o,Pos,Deep):- move(Pos2,Pos,o), nolose(x,Pos2,Deep). nolose(x,Pos,Deep):- not(lose(x,Pos,Deep)). lose(o,Pos,Deep):- victory(x,Pos). lose(o,_,0):- !, fail. lose(x,Pos,Deep):- move(Pos2,Pos,x), Deep1 is Deep- 1, lose(o,Pos2,Deep1). lose(o,Pos,Deep):- not(nolose(o,Pos,Deep)). say(Pos, Message, Continue):- set_content_type("text/html"), write(" Tick-Tack-Toe 3x3x3 "), B is random(1), banner(B), write("

"), for(Y, 0, 2), write(" "), for(X, 0, 2), write(" "), X=2, write(" "), Y=2, write("
"), member3(Pos, E0, X, Y, 0), member3(Pos, E1, X, Y, 1), member3(Pos, E2, X, Y, 2), link(Continue, Pos, X, Y), write("

"), write("

"), write(Message), write("



"), ( (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]]]) -> write(""); write("") ), write(""), write(""), write(""), write("

Tick-Tack-Toe 3x3x3 (Make line)




"), B1 is random(1), banner(B1), write(" "). link(yes, Pos, X, Y):- !, write(""). link(_, _, _, _). banner(0) :- write("

").