% ==============Mänija programmi vormistamise reeglid:=======================
% 1) Programm peab olema vormistatud mooduli kujul
%    :- module(mooduli_nimi, mooduli_peapredikaat/1). 
%    kus peapredikaadi parameetriks on selle programmi nuppude värv
% 2) Moodulis ei tohi olla defineeritud staatilisi fakte ruut/3 ja  definitsiooni :- dynamic ruut/3.
% 3) Mängija programmist ei tohi väljuda fail-ga
% 4) Backtrack-iga ei tohi minna mängija programmi sisse. 
%    Seetõttu on soovitav kasutada mängija peapredikaadi järgmist struktuuri:
%   	main_pgm(Color):-
%       		...., !.
%   	main_pgm(_).
%===============Arbiiteri kohandamine mängijatele====================
%   vt. predikaadi "players_turn/3" kommentaare allpool
%=================Mängu käivitamine============================
% Laadida esmalt mällu arbiter.pl ja seejärel mängijate programmide failid
% Kutsuda välja predikaat "turniir/0"
%==========================================================
:- module(arbiter,[turniir/0,ruut/3]).
:-dynamic ruut/3.

players_turn(1,2,main):- !. % <------!!!   Siia tuleb 3. parameetriks kirjutada programmi nimi, mis mängib MUSTADEGA
players_turn(2,1,checkers).            % <------!!!   Siia tuleb 3. parameetriks kirjutada programmi nimi, mis mängib VALGETEGA

%---------MÄNGU ALGSEIS-------------
% Valged
ruut(1,1,1).
ruut(1,3,1).
ruut(1,5,1).
ruut(1,7,1).
ruut(2,2,1).
ruut(2,4,1).
ruut(2,6,1).
ruut(2,8,1).
ruut(3,1,1).
ruut(3,3,1).
ruut(3,5,1).
ruut(3,7,1).
% Tühjad ruudud
ruut(4,2,0).
ruut(4,4,0).
ruut(4,6,0).
ruut(4,8,0).
ruut(5,1,0).
ruut(5,3,0).
ruut(5,5,0).
ruut(5,7,0).
% Mustad
ruut(6,2,2).
ruut(6,4,2).
ruut(6,6,2).
ruut(6,8,2).
ruut(7,1,2).
ruut(7,3,2).
ruut(7,5,2).
ruut(7,7,2).
ruut(8,2,2).
ruut(8,4,2).
ruut(8,6,2).
ruut(8,8,2).
%-----------------------------------------
turniir:-
	assert(arv(0)),
    abolish(colorCC/1),
    assert(colorCC(2)),
    reset_seis,
    repeat,
    retract(colorCC(Color)),
    players_turn(Color,ColorN,Player),
    assert(colorCC(ColorN)),
     Turn=..[Player,ColorN],
     Turn,
	retract(arv(NN)), NN1 is NN + 1,assert(arv(NN1)),
    nl,nl,write('Player\'s  '),write(ColorN),write(' turn:'),nl,
     show_board(1),
    check_fp,
    reset_seis,
    fixpoint(yes),
    players_turn(_,Color,Winner),
    nl, write('The winner is program \"'),write(Winner), write('\"'),
    arv(NNN),nl,write('Total number of moves is '), write(NNN).

check_fp:-
    abolish(fixpoint/1),
    assert(fixpoint(yes)),
    ruut(X,Y,Color),
    check_fp1(X,Y,Color),
    fail.
check_fp.

check_fp1(X,Y,Color):-
    retract(ruut_o(X,Y,Color)),!.   % Kas leidub samade parameetritega ruut
check_fp1(X,Y,Color):-
    retract(fixpoint(_)),
    assert(fixpoint(no)),!.

reset_seis:-
    abolish(ruut_o/3),
    ruut(X,Y,Color),
    assert(ruut_o(X,Y,Color)),
    fail.
reset_seis.

% ------------Mängulaua seisu kuvamine--------------------
show_board(9):- !.
show_board(X):-
    write('|'), show_board1(X,1),   write('|'),nl,
    X1 is X + 1,!,
    show_board(X1).

show_board1(X,9):- !.
show_board1(X,Y):-
    (ruut(X,Y,Color), write(Color) ; write(' ')),
    Y1 is Y + 1,!,
    show_board1(X,Y1).
%------------------------------------------------------------

