hra(A,BarvC,ZacB):-initpos(A,Pos),!,sachy(ZacB,Pos,BarvC).

pult(I,I).
pult(I,V):-I1 is I +1,pult(I1,V).

initpos(a,[[["K",4,1],["D",5,1],["V",1,1],["V",8,1],["S",3,1],["S",6,1],
            ["J",2,1],["J",7,1],["P",1,2],["P",8,2],["P",2,2],["P",7,2],
	    ["P",3,2],["P",6,2],["P",4,2],["P",5,2],["N",50,50]],
           [["K",4,8],["D",5,8],["V",1,8],["V",8,8],["S",3,8],["S",6,8],
            ["J",2,8],["J",7,8],["P",1,7],["P",8,7],["P",2,7],["P",7,7],
	    ["P",3,7],["P",6,7],["P",4,7],["P",5,7],["N",50,50]]]).
           
initpos(b,[[["K",6,4],["D",7,8]],[["K",8,6]]]).

initpos(c,[[["K",7,1],["D",4,3],["V",1,1],["V",5,1],["S",2,3],["S",7,5],
            ["J",2,1],["P",1,2],["P",2,2],["P",3,3],["P",5,4],["P",6,2],
            ["P",7,2],["P",8,2],["N",0,0]],
           [["K",7,8],["D",4,8],["V",6,8],["V",1,8],["S",2,6],["S",2,7],
            ["J",3,6],["J",6,6],["P",1,6],["P",2,5],["P",3,7],["P",4,4],
            ["P",4,6],["P",6,7],["N",0,0]]]).

initpos([A,B],[A,B]):-vyber(1,["K",_,_],A,_),vyber(1,["K",_,_],B,_),
   kpos([A,B]).

kpos([[],B]):-kpos1(B).
kpos([[X|A],B]):-kpos2(X,A),kpos2(X,B),!,kpos([A,B]).
kpos1([]).
kpos1([X|B]):-kpos2(X,B),kpos1(B).

kpos2(["N",_,_],_).
kpos2([_,X,Y],[]):-out(X,Y,1).
kpos2([_,X,Y],[[_,X,Y]|_]):-!,fail.
kpos2([F,X,Y],[_|T]):-kpos2([F,X,Y],T).

sachy(B,Pos,B):-alfabeta(0,B,Pos,-3000,3000,NewPos,_),!,tah(B,Pos,NewPos,[F,X0,Y0,X1,Y1]),
		write(F),write(X0),write(Y0),write(X1),write(Y1),nl,vypis(NewPos),
		B1 is 1-B,!,smptest(B1,NewPos),sachy(B1,NewPos,B).

sachy(A,Pos,B):-A=:=1-B,repeat,read(P),name(P,T),prev(T,T1),zktah(B,T1,Pos,NewPos),!,vypis(NewPos),!,
                smptest(B,NewPos),sachy(B,NewPos,B).      		

prev([Xo,Yo,Xn,Yn],[X1,Y1,X2,Y2]):-X1 is Xo-96,Y1 is Yo-48,X2 is Xn-96,Y2 is Yn-48.


tah(0,[O,_],[N,_],T):-tah1(O,N,T).
tah(1,[_,O],[_,N],T):-tah1(O,N,T).
tah1([[F,X,Y]|O],[[F,X,Y]|N],T):-tah1(O,N,T).
tah1([[F,X1,Y1]|_],[[F,X,Y]|_],[F,X1,Y1,X,Y]).

smptest(B,Pos):-sach(B,Pos),pat(B,Pos),write("Mat."),nl,!,fail.
smptest(B,Pos):-sach(B,Pos),write("Sach"),nl,!.
smptest(B,Pos):-pat(B,Pos),write("Pat."),nl,!,fail.
smptest(_,_).

zktah(1,[X,Y,Xn,Yn],[A,B],[A1,B1]):-out(X,Y,1),out(Xn,Yn,1),
   vyber(1,[F,X,Y],A,L),!,vyp1(L),vyber(1,[_,Xn,Yn],A,L1),!,vyp2(L1),
   zamen(1,[F,X,Y],[F,Xn,Yn],A,A1),odstran(1,B,[Xn,Yn],B1,_),
   figura0([F,X,Y],[A,B],[],P),!,najdi([A1,B1],P),not(sach(0,[A1,B1])).
   
zktah(0,[X,Y,Xn,Yn],[A,B],[A1,B1]):-out(X,Y,1),out(Xn,Yn,1),
   vyber(1,[F,X,Y],B,L),!,vyp1(L),vyber(1,[_,Xn,Yn],B,L1),!,vyp2(L1),
   zamen(1,[F,X,Y],[F,Xn,Yn],B,B1),odstran(1,A,[Xn,Yn],A1,_),
   figura1([F,X,Y],[A,B],[],P),!,najdi([A1,B1],P),not(sach(1,[A1,B1])).

najdi(A1,[A1|_]).
najdi(A1,[_|T]):-najdi(A1,T).

vyp1(0):-write("Spatny tah"),fail.
vyp1(1).
vyp2(1):-write("Spatny tah"),fail.
vyp2(0).


/* ALFA-BETA */

alfabeta(Tah,Hrac,[A,B],Alfa,Beta,GoodPos,Val):- Tah<3,Barva is (Tah+Hrac) mod 2,
   is_king(A),is_king(B),moves(Barva,[A,B],Poslist),!,
   boundedbest(Poslist,Alfa,Beta,GoodPos,Val,Tah,Hrac);staticval(Hrac,[A,B],Val),write(".").
boundedbest([Pos|Poslist],Alfa,Beta,GoodPos,GoodVal,Tah,Hrac):-Pom is Tah+1,
   alfabeta(Pom,Hrac,Pos,Alfa,Beta,_,Val),goodenough(Poslist,Alfa,Beta,Pos,Val,
                                          	   GoodPos,GoodVal,Tah,Hrac).
goodenough([],_,_,Pos,Val,Pos,Val,_,_).
goodenough(_,Alfa,Beta,Pos,Val,Pos,Val,Tah,_):-(Tah mod 2)=:=0,Val>Beta,!;
   (Tah mod 2)=:=1,Val < Alfa,!.
goodenough(List,Alfa,Beta,Pos,Val,GoodPos,GoodVal,Tah,Hrac):-
   newbounds(Alfa,Beta,Tah,Val,NewAlfa,NewBeta),
   boundedbest(List,NewAlfa,NewBeta,Pos1,Val1,Tah,Hrac),
   betterof(Pos,Val,Pos1,Val1,GoodPos,GoodVal,Tah).
newbounds(Alfa,Beta,Tah,Val,Val,Beta):-(Tah mod 2)=:=0,Val>Alfa,!.
newbounds(Alfa,Beta,Tah,Val,Alfa,Val):-(Tah mod 2)=:=1,Val<Beta,!.
newbounds(Alfa,Beta,_,_,Alfa,Beta).
betterof(Pos,Val,_,Val1,Pos,Val,Tah):-(Tah mod 2)=:=0,Val>Val1,!;
   (Tah mod 2)=:=1,Val<Val1,!.
betterof(_,_,Pos1,Val1,Pos1,Val1,_).

/* ohodnoceni pozice */

staticval(0,[A,B],Val):-staticval1(A,0,Val1),staticval1(B,0,Val2),Val is Val1 - Val2.
staticval(1,[A,B],Val):-staticval1(A,0,Val1),staticval1(B,0,Val2),Val is Val2 - Val1.
staticval1([],Val,Val).
staticval1([["D",_,_]|Y],Val,Val1):- Val2 is Val + 10, staticval1(Y,Val2,Val1).
staticval1([["K",_,_]|Y],Val,Val1):- Val2 is Val + 2000, staticval1(Y,Val2,Val1).
staticval1([["V",_,_]|Y],Val,Val1):- Val2 is Val + 5, staticval1(Y,Val2,Val1).
staticval1([["S",_,_]|Y],Val,Val1):- Val2 is Val + 3, staticval1(Y,Val2,Val1).
staticval1([["J",_,_]|Y],Val,Val1):- Val2 is Val + 3, staticval1(Y,Val2,Val1).
staticval1([["P",_,_]|Y],Val,Val1):- Val2 is Val + 1, staticval1(Y,Val2,Val1).
staticval1([["N",_,_]|Y],Val,Val1):- staticval1(Y,Val,Val1).

/* testy */

out(X,Y,L):- X>=1,X=<8,Y>=1,Y=<8,L=1.
out(X,Y,L):- (X<1;X>8;Y<1;Y>8),L = 0.

mojef(0,_,_,0).
mojef(1,[],_,1).
mojef(1,[[_,X,Y]|_],[X,Y],0).
mojef(1,[_|Z],S,L):-mojef(1,Z,S,L).

is_king([["K",_,_]|_]).
is_king([_|Y]):-is_king(Y).

king([["K",X,Y]|Z],[X,Y],Z).
king([X|Y],K,[X|Z]):-king(Y,K,Z).

vyber(0,_,_,0).
vyber(1,[F,X,Y],[[F,X,Y]|_],1).
vyber(1,[F,X,Y],[_|Z],L):-vyber(1,[F,X,Y],Z,L).
vyber(1,_,[],0).

/* test na sach */

sach(0,[A,B]):-king(A,K,A1),!,sach1(B,K,A1,B,0).
sach(1,[B,A]):-king(A,K,A1),!,sach1(B,K,A1,B,1).
sach1([[F,X1,Y1]|_],[X2,Y2],A,B,Barva):-X is X2-X1,Y is Y2-Y1,fig(F,[X,Y],[X1,Y1],A,B,Barva).
sach1([_|Z],P,A,B,Barva):-sach1(Z,P,A,B,Barva).
fig("K",[X,Y],_,_,_,_):-X>=(-1),X=<1,Y>=(-1),Y=<1.
fig("J",[1,2],_,_,_,_).
fig("J",[-1,2],_,_,_,_).
fig("J",[1,-2],_,_,_,_).
fig("J",[-1,-2],_,_,_,_).
fig("J",[2,1],_,_,_,_).
fig("J",[-2,1],_,_,_,_).
fig("J",[2,-1],_,_,_,_).
fig("J",[-2,-1],_,_,_,_).
fig("P",[1,1],_,_,_,1).
fig("P",[-1,1],_,_,_,1).
fig("P",[1,-1],_,_,_,0).
fig("P",[-1,-1],_,_,_,0).
fig("D",[X,X],[X1,Y1],A,B,_):-trek1(A,[X1,Y1],X),trek1(B,[X1,Y1],X).
fig("D",[X,0],[X1,Y1],A,B,_):-trek2(A,[X1,Y1],X),trek2(B,[X1,Y1],X).
fig("D",[0,X],[X1,Y1],A,B,_):-trek3(A,[X1,Y1],X),trek3(B,[X1,Y1],X).
fig("D",[X,Y],[X1,Y1],A,B,_):-X=:=(-Y),trek4(A,[X1,Y1],X),trek4(B,[X1,Y1],X).
fig("V",[X,0],[X1,Y1],A,B,_):-trek2(A,[X1,Y1],X),trek2(B,[X1,Y1],X).
fig("V",[0,X],[X1,Y1],A,B,_):-trek3(A,[X1,Y1],X),trek3(B,[X1,Y1],X).
fig("S",[X,X],[X1,Y1],A,B,_):-trek1(A,[X1,Y1],X),trek1(B,[X1,Y1],X).
fig("S",[X,Y],[X1,Y1],A,B,_):-X=:=(-Y),trek4(A,[X1,Y1],X),trek4(B,[X1,Y1],X).
fig("N",_,_,_,_,_):-!,fail.

trek1([],_,_).
trek1([[_,X2,Y2]|_],[X1,Y1],Z):-X is X2-X1,(Y2-Y1)=:=X,(X*Z)>0,abs(Z)>abs(X),!,fail.
trek1([_|A],P,X):-trek1(A,P,X).

trek2([],_,_).
trek2([[_,X2,Y2]|_],[X1,Y1],Z):-X is X2-X1,(Y2-Y1)=:=0,(X*Z)>0,abs(Z)>abs(X),!,fail.
trek2([_|A],P,X):-trek2(A,P,X).

trek3([],_,_).
trek3([[_,X2,Y2]|_],[X1,Y1],Z):-X2-X1=:=0,Y is Y2-Y1,(Y*Z)>0,abs(Z)>abs(Y),!,fail.
trek3([_|A],P,X):-trek3(A,P,X).

trek4([],_,_).
trek4([[_,X2,Y2]|_],[X1,Y1],Z):-X is X2-X1,(Y1-Y2)=:=X,(X*Z)>0,abs(Z)>abs(X),!,fail.
trek4([_|A],P,X):-trek4(A,P,X).

/* test na pat */

pat(0,[A,B]):-king(A,[X,Y],Z),tfigura0(["K",X,Y],[A,B],[],Pos),!,pat0(Pos),
	moves0([["N",X,Y]|Z],[[["N",X,Y]|Z],B],PosL),!,tsach0(PosL,X,Y).
pat(1,[A,B]):-king(B,[X,Y],Z),tfigura1(["K",X,Y],[A,B],[],Pos),!,pat1(Pos),
	moves1([["N",X,Y]|Z],[A,[["N",X,Y]|Z]],PosL),!,tsach1(PosL,X,Y).

pat0([]).
pat0([A|Z]):-sach(0,A),pat0(Z).

pat1([]).
pat1([A|Z]):-sach(1,A),pat1(Z).

tsach0([],_,_).
tsach0([[A,B]|Z],X,Y):-sach(0,[[["K",X,Y]|A],B]),tsach0(Z,X,Y).

tsach1([],_,_).
tsach1([[A,B]|Z],X,Y):-sach(1,[A,[["K",X,Y]|B]]),tsach1(Z,X,Y).

tfigura0(["K",X,Y],Pos,Poslist,Poslist8):-finer(["K",X,Y],Pos,[1,1],Poslist,Poslist1),
  finer(["K",X,Y],Pos,[0,1],Poslist1,Poslist2),
  finer(["K",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  finer(["K",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  finer(["K",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  finer(["K",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  finer(["K",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  finer(["K",X,Y],Pos,[1,0],Poslist7,Poslist8).

tfigura1(["K",X,Y],Pos,Poslist,Poslist8):-cfiner(["K",X,Y],Pos,[1,1],Poslist,Poslist1),
  cfiner(["K",X,Y],Pos,[0,1],Poslist1,Poslist2),
  cfiner(["K",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  cfiner(["K",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  cfiner(["K",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  cfiner(["K",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  cfiner(["K",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  cfiner(["K",X,Y],Pos,[1,0],Poslist7,Poslist8).


/* zamen(zdali,co,zaco,kde,vysledek) */
zamen(0,_,_,Pos,Pos).
zamen(1,A,B,[A|Z],[B|Z]).
zamen(1,A,B,[C|Z],[C|T]):-zamen(1,A,B,Z,T).

/* pridej(zdali,co,kam,vysledek */
pridej(0,_,Poslist,Poslist).
pridej(1,A,Poslist,[A|Poslist]).

/* odstran(zdali,odkud,co,vysledek) */
odstran(0,A,_,A,0).
odstran(1,[],_,[],1).
odstran(1,[[_,X,Y]|Z],[X,Y],Z,0).
odstran(1,[A|Z],B,[A|T],L):-odstran(1,Z,B,T,L).

/* tiskni */
tisk([]).
tisk([A|B]):-vypis(A),staticval(0,A,Val),write(Val),write("\n\n"),tisk(B).

vypis(A):-functor(T,sach,64),zapis(T,A),vypom(T).

zapis(T,[A,B]):-zapis1(A,T,0),zapis1(B,T,1).
zapis1([],_,_).
zapis1([["N",_,_]|B],T,P):-zapis1(B,T,P).
zapis1([[A,X,Y]|B],T,P):-N is (8-Y)*8+(9-X),vm(P,A,A1),arg(N,T,A1),zapis1(B,T,P).
vypom(T):-cara,write("8"),radek(8,0,T),cara,write("7"),radek(8,1,T),cara,write("6"),
          radek(8,2,T),cara,write("5"),radek(8,3,T),cara,write("4"),radek(8,4,T),cara,
          write("3"),radek(8,5,T),cara,write("2"),radek(8,6,T),cara,write("1"),radek(8,7,T),
          cara,write("  a b c d e f g h\n").
cara/*:-write("-----------------\n")*/.
radek(0,_,_):-write("|\n").
radek(X,Y,T):-write("|"),N is Y*8+X,arg(N,T,Z),cwrite(Z),X1 is X-1,radek(X1,Y,T). 
cwrite(Z):-var(Z),write(" ").
cwrite(Z):-nonvar(Z),write(Z).
vm(0,"K","K").
vm(0,"D","D").
vm(0,"S","S").
vm(0,"J","J").
vm(0,"V","V").
vm(0,"P","P").
vm(0,_," ").
vm(1,"K","k").
vm(1,"D","d").
vm(1,"S","s").
vm(1,"J","j").
vm(1,"V","v").
vm(1,"P","p").
vm(1,_," ").


/*_________________________________________________________________*/

/* MOVES */

/* moves(barva,pozice,seznam_pozic) */
moves(0,[A,B],Poslist):-moves0(A,[A,B],Poslist).
moves(1,[A,B],Poslist):-moves1(B,[A,B],Poslist).

moves0([],_,[]).
moves0([A|B],Pos,Poslist):-moves0(B,Pos,Poslist1),figura0(A,Pos,Poslist1,Poslist).

moves1([],_,[]).
moves1([A|B],Pos,Poslist):-moves1(B,Pos,Poslist1),figura1(A,Pos,Poslist1,Poslist).


/* BILY */

bmros(0,_,Poslist,Poslist).
bmros(50,[A,B],Pl,Pl1):-vyber(1,[_,6,1],A,0),vyber(1,[_,6,1],B,0),
  vyber(1,[_,7,1],A,0),vyber(1,[_,7,1],B,0),not(sach(0,[A,B])),
  not(sach1(B,[6,1],A,B,0)),not(sach1(B,[7,1],A,B,0)),
  zamen(1,["K",5,1],["K",7,1],A,A1),zamen(1,["V",8,1],["V",6,1],A1,A2),
  pridej(1,[A2,B],Pl,Pl1).
bmros(50,_,Pl,Pl).

bvros(0,_,Poslist,Poslist).
bvros(50,[A,B],Pl,Pl1):-vyber(1,[_,4,1],A,0),vyber(1,[_,4,1],B,0),
  vyber(1,[_,3,1],A,0),vyber(1,[_,3,1],B,0),vyber(1,[_,2,1],A,0),
  vyber(1,[_,2,1],B,0),not(sach(0,[A,B])),not(sach1(B,[4,1],A,B,0)),
  not(sach1(B,[3,1],A,B,0)),zamen(1,["K",5,1],["K",3,1],A,A1),
  zamen(1,["V",1,1],["V",4,1],A1,A2),pridej(1,[A2,B],Pl,Pl1).
bvros(50,_,Pl,Pl).

figura0(["K",5,1],[A,B],Poslist,Poslist10):-
  finer(["K",5,1],[A,B],[1,1],Poslist,Poslist1),
  finer(["K",5,1],[A,B],[0,1],Poslist1,Poslist2),
  finer(["K",5,1],[A,B],[-1,1],Poslist2,Poslist3),
  finer(["K",5,1],[A,B],[-1,0],Poslist3,Poslist7),
  finer(["K",5,1],[A,B],[1,0],Poslist7,Poslist8),
  vyber(1,["N",X,Y],A,_),bmros(Y,[A,B],Poslist8,Poslist9),
  bvros(X,[A,B],Poslist9,Poslist10).

figura0(["K",X,Y],Pos,Poslist,Poslist8):-
/*  not(sach(0,Pos)),pat(0,Pos),Poslist8=[[[],[]],Poslist];*/
  finer(["K",X,Y],Pos,[1,1],Poslist,Poslist1),
  finer(["K",X,Y],Pos,[0,1],Poslist1,Poslist2),
  finer(["K",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  finer(["K",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  finer(["K",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  finer(["K",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  finer(["K",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  finer(["K",X,Y],Pos,[1,0],Poslist7,Poslist8).

figura0(["D",X,Y],Pos,Poslist,Poslist8):-firek(1,["D",X,Y],Pos,[1,1],Poslist,Poslist1),
  firek(1,["D",X,Y],Pos,[0,1],Poslist1,Poslist2),
  firek(1,["D",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  firek(1,["D",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  firek(1,["D",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  firek(1,["D",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  firek(1,["D",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  firek(1,["D",X,Y],Pos,[1,0],Poslist7,Poslist8).

figura0(["V",X,Y],Pos,Poslist,Poslist4):-firek(1,["V",X,Y],Pos,[1,0],Poslist,Poslist1),
  firek(1,["V",X,Y],Pos,[0,1],Poslist1,Poslist2),
  firek(1,["V",X,Y],Pos,[-1,0],Poslist2,Poslist3),
  firek(1,["V",X,Y],Pos,[0,-1],Poslist3,Poslist4).

figura0(["S",X,Y],Pos,Poslist,Poslist4):-firek(1,["S",X,Y],Pos,[1,1],Poslist,Poslist1),
  firek(1,["S",X,Y],Pos,[-1,1],Poslist1,Poslist2),
  firek(1,["S",X,Y],Pos,[-1,-1],Poslist2,Poslist3),
  firek(1,["S",X,Y],Pos,[1,-1],Poslist3,Poslist4).

figura0(["J",X,Y],Pos,Poslist,Poslist8):-finer(["J",X,Y],Pos,[2,1],Poslist,Poslist1),
  finer(["J",X,Y],Pos,[1,2],Poslist1,Poslist2),
  finer(["J",X,Y],Pos,[-1,2],Poslist2,Poslist3),
  finer(["J",X,Y],Pos,[-2,1],Poslist3,Poslist4),
  finer(["J",X,Y],Pos,[-2,-1],Poslist4,Poslist5),
  finer(["J",X,Y],Pos,[-1,-2],Poslist5,Poslist6),
  finer(["J",X,Y],Pos,[1,-2],Poslist6,Poslist7),
  finer(["J",X,Y],Pos,[2,-1],Poslist7,Poslist8).

figura0(["P",X,Y],Pos,Poslist,Poslist3):-pesec1(["P",X,Y],Pos,Poslist,Poslist1),
  pesec2(["P",X,Y],Pos,Poslist1,Poslist2),pesec3(["P",X,Y],Pos,Poslist2,Poslist3).

figura0(["N",_,_],_,Pos,Pos).

pesec1([F,X,7],[A,B],Pl,Pl1):-Y1 is Y+1,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],["D",X,Y1],A,A1),pridej(L,[A1,B],Pl,Pl1).
pesec1([F,X,Y],[A,B],Pl,Pl2):-Y1 is Y+1,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],[F,X,Y1],A,A1),pridej(L,[A1,B],Pl,Pl1),
  pesec4(L,[F,X,Y],[A,B],Pl1,Pl2).
pesec2([F,X,Y],[A,B],Pl,Pl1):-X1 is X-1,Y1 is Y+1,mojef(1,B,[X1,Y1],L1),L is 1-L1,
  odstran(L,B,[X1,Y1],B1,_),zamen(L,[F,X,Y],[F,X1,Y1],A,A1),pridej(L,[A1,B1],Pl,Pl1).
pesec3([F,X,Y],[A,B],Pl,Pl1):-X1 is X+1,Y1 is Y+1,mojef(1,B,[X1,Y1],L1),L is 1-L1,
  odstran(L,B,[X1,Y1],B1,_),zamen(L,[F,X,Y],[F,X1,Y1],A,A1),pridej(L,[A1,B1],Pl,Pl1).
pesec4(0,_,_,Pl,Pl).
pesec4(1,[_,_,Y],_,Pl,Pl):-Y=\=2.
pesec4(1,[F,X,Y],[A,B],Pl,Pl1):-Y==2,Y1 is Y+2,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],[F,X,Y1],A,A1),pridej(L,[A1,B],Pl,Pl1).

finer(["K",5,1],[A,B],[DX,DY],Pl,Pl1):-X1 is 5+DX,Y1 is 1+DY,out(X1,Y1,L1),
  mojef(L1,A,[X1,Y1],L),odstran(L,B,[X1,Y1],B1,_),zamen(L,["N",_,0],["N",0,0],A,A0),
  zamen(L,[F,5,1],[F,X1,Y1],A0,A1),pridej(L,[A1,B1],Pl,Pl1).

finer([F,X,Y],[A,B],[DX,DY],Pl,Pl1):-X1 is X+DX,Y1 is Y+DY,out(X1,Y1,L1),
  mojef(L1,A,[X1,Y1],L),odstran(L,B,[X1,Y1],B1,_),zamen(L,[F,X,Y],[F,X1,Y1],A,A1),
  pridej(L,[A1,B1],Pl,Pl1).

firek(0,_,_,_,Poslist,Poslist).
firek(1,["V",1,1],[A,B],[DX,DY],Pl,Pl2):-X1 is 1+DX,Y1 is 1+DY,out(X1,Y1,L1),
  vyber(L1,["N",_,P],A,LP),zamen(LP,["N",_,P],["N",0,P],A,A0),
  mojef(L1,A,[X1,Y1],L),odstran(L,B,[X1,Y1],B1,L2),zamen(L,["V",1,1],["V",X1,Y1],A0,A1),
  pridej(L,[A1,B1],Pl1,Pl2),firek(L2,["V",X1,Y1],[A1,B1],[DX,DY],Pl,Pl1).
firek(1,["V",8,1],[A,B],[DX,DY],Pl,Pl2):-X1 is 8+DX,Y1 is 1+DY,out(X1,Y1,L1),
  vyber(L1,["N",_,P],A,LP),zamen(LP,["N",P,_],["N",P,0],A,A0),
  mojef(L1,A,[X1,Y1],L),odstran(L,B,[X1,Y1],B1,L2),zamen(L,["V",1,1],["V",X1,Y1],A0,A1),
  pridej(L,[A1,B1],Pl1,Pl2),firek(L2,["V",X1,Y1],[A1,B1],[DX,DY],Pl,Pl1).
firek(1,[F,X,Y],[A,B],[DX,DY],Pl,Pl2):-X1 is X+DX,Y1 is Y+DY,out(X1,Y1,L1),
  mojef(L1,A,[X1,Y1],L),odstran(L,B,[X1,Y1],B1,L2),zamen(L,[F,X,Y],[F,X1,Y1],A,A1),
  pridej(L,[A1,B1],Pl1,Pl2),firek(L2,[F,X1,Y1],[A1,B1],[DX,DY],Pl,Pl1).

/* CERNY */

cmros(0,_,Poslist,Poslist).
cmros(50,[A,B],Pl,Pl1):-vyber(1,[_,6,8],B,0),vyber(1,[_,6,8],A,0),
  vyber(1,[_,7,8],B,0),vyber(1,[_,7,8],A,0),not(sach(1,[A,B])),
  not(sach1(A,[6,8],B,A,1)),not(sach1(A,[7,8],B,A,1)),
  zamen(1,["K",5,8],["K",7,8],B,B1),zamen(1,["V",8,8],["V",6,8],B1,B2),
  pridej(1,[A,B2],Pl,Pl1).
cmros(50,_,Pl,Pl).

cvros(0,_,Poslist,Poslist).
cvros(50,[A,B],Pl,Pl1):-vyber(1,[_,4,8],B,0),vyber(1,[_,4,8],A,0),
  vyber(1,[_,3,8],B,0),vyber(1,[_,3,8],A,0),vyber(1,[_,2,8],B,0),
  vyber(1,[_,2,8],A,0),not(sach(1,[A,B])),not(sach1(A,[4,8],B,A,1)),
  not(sach1(A,[3,8],B,A,1)),zamen(1,["K",5,8],["K",3,8],B,B1),
  zamen(1,["V",1,8],["V",4,8],B1,B2),pridej(1,[A,B2],Pl,Pl1).
cvros(50,_,Pl,Pl).

figura1(["K",5,8],[A,B],Poslist,Poslist10):-
  cfiner(["K",5,8],[A,B],[1,1],Poslist,Poslist1),
  cfiner(["K",5,8],[A,B],[0,1],Poslist1,Poslist2),
  cfiner(["K",5,8],[A,B],[-1,1],Poslist2,Poslist3),
  cfiner(["K",5,8],[A,B],[-1,0],Poslist3,Poslist4),
  cfiner(["K",5,8],[A,B],[-1,-1],Poslist4,Poslist5),
  cfiner(["K",5,8],[A,B],[0,-1],Poslist5,Poslist6),
  cfiner(["K",5,8],[A,B],[1,-1],Poslist6,Poslist7),
  cfiner(["K",5,8],[A,B],[1,0],Poslist7,Poslist8),
  vyber(1,["N",X,Y],B,_),cmros(Y,[A,B],Poslist8,Poslist9),
  cvros(X,[A,B],Poslist9,Poslist10).

figura1(["K",X,Y],Pos,Poslist,Poslist8):-
/*  not(sach(1,Pos)),pat(1,Pos),Poslist8=[[[],[]],Poslist];*/
  cfiner(["K",X,Y],Pos,[1,1],Poslist,Poslist1),
  cfiner(["K",X,Y],Pos,[0,1],Poslist1,Poslist2),
  cfiner(["K",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  cfiner(["K",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  cfiner(["K",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  cfiner(["K",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  cfiner(["K",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  cfiner(["K",X,Y],Pos,[1,0],Poslist7,Poslist8).

figura1(["D",X,Y],Pos,Poslist,Poslist8):-cfirek(1,["D",X,Y],Pos,[1,1],Poslist,Poslist1),
  cfirek(1,["D",X,Y],Pos,[0,1],Poslist1,Poslist2),
  cfirek(1,["D",X,Y],Pos,[-1,1],Poslist2,Poslist3),
  cfirek(1,["D",X,Y],Pos,[-1,0],Poslist3,Poslist4),
  cfirek(1,["D",X,Y],Pos,[-1,-1],Poslist4,Poslist5),
  cfirek(1,["D",X,Y],Pos,[0,-1],Poslist5,Poslist6),
  cfirek(1,["D",X,Y],Pos,[1,-1],Poslist6,Poslist7),
  cfirek(1,["D",X,Y],Pos,[1,0],Poslist7,Poslist8).

figura1(["V",X,Y],Pos,Poslist,Poslist4):-cfirek(1,["V",X,Y],Pos,[1,0],Poslist,Poslist1),
  cfirek(1,["V",X,Y],Pos,[0,1],Poslist1,Poslist2),
  cfirek(1,["V",X,Y],Pos,[-1,0],Poslist2,Poslist3),
  cfirek(1,["V",X,Y],Pos,[0,-1],Poslist3,Poslist4).

figura1(["S",X,Y],Pos,Poslist,Poslist4):-cfirek(1,["S",X,Y],Pos,[1,1],Poslist,Poslist1),
  cfirek(1,["S",X,Y],Pos,[-1,1],Poslist1,Poslist2),
  cfirek(1,["S",X,Y],Pos,[-1,-1],Poslist2,Poslist3),
  cfirek(1,["S",X,Y],Pos,[1,-1],Poslist3,Poslist4).

figura1(["J",X,Y],Pos,Poslist,Poslist8):-cfiner(["J",X,Y],Pos,[2,1],Poslist,Poslist1),
  cfiner(["J",X,Y],Pos,[1,2],Poslist1,Poslist2),
  cfiner(["J",X,Y],Pos,[-1,2],Poslist2,Poslist3),
  cfiner(["J",X,Y],Pos,[-2,1],Poslist3,Poslist4),
  cfiner(["J",X,Y],Pos,[-2,-1],Poslist4,Poslist5),
  cfiner(["J",X,Y],Pos,[-1,-2],Poslist5,Poslist6),
  cfiner(["J",X,Y],Pos,[1,-2],Poslist6,Poslist7),
  cfiner(["J",X,Y],Pos,[2,-1],Poslist7,Poslist8).

figura1(["P",X,Y],Pos,Poslist,Poslist3):-cpesec1(["P",X,Y],Pos,Poslist,Poslist1),
  cpesec2(["P",X,Y],Pos,Poslist1,Poslist2),cpesec3(["P",X,Y],Pos,Poslist2,Poslist3).
  
figura1(["N",_,_],_,Pos,Pos).

cpesec1([F,X,2],[A,B],Pl,Pl1):-Y1 is Y-1,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],["D",X,Y1],B,B1),pridej(L,[A,B1],Pl,Pl1).
cpesec1([F,X,Y],[A,B],Pl,Pl2):-Y1 is Y-1,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],[F,X,Y1],B,B1),pridej(L,[A,B1],Pl,Pl1),
  cpesec4(L,[F,X,Y],[A,B],Pl1,Pl2).
cpesec2([F,X,Y],[A,B],Pl,Pl1):-X1 is X-1,Y1 is Y-1,mojef(1,A,[X1,Y1],L1),L is 1-L1,
  odstran(L,A,[X1,Y1],A1,_),zamen(L,[F,X,Y],[F,X1,Y1],B,B1),pridej(L,[A1,B1],Pl,Pl1).
cpesec3([F,X,Y],[A,B],Pl,Pl1):-X1 is X+1,Y1 is Y-1,mojef(1,A,[X1,Y1],L1),L is 1-L1,
  odstran(L,A,[X1,Y1],A1,_),zamen(L,[F,X,Y],[F,X1,Y1],B,B1),pridej(L,[A1,B1],Pl,Pl1).
cpesec4(0,_,_,Pl,Pl).
cpesec4(1,[_,_,Y],_,Pl,Pl):-Y=\=7.
cpesec4(1,[F,X,Y],[A,B],Pl,Pl1):-Y==7,Y1 is Y-2,mojef(1,A,[X,Y1],L1),mojef(L1,B,[X,Y1],L),
  zamen(L,[F,X,Y],[F,X,Y1],B,B1),pridej(L,[A,B1],Pl,Pl1).


cfiner([F,X,Y],[A,B],[DX,DY],Pl,Pl1):-X1 is X-DX,Y1 is Y-DY,out(X1,Y1,L1),
  mojef(L1,B,[X1,Y1],L),odstran(L,A,[X1,Y1],A1,_),zamen(L,[F,X,Y],[F,X1,Y1],B,B1),
  pridej(L,[A1,B1],Pl,Pl1).

cfirek(0,_,_,_,Poslist,Poslist).
cfirek(1,[F,X,Y],[A,B],[DX,DY],Pl,Pl2):-X1 is X-DX,Y1 is Y-DY,out(X1,Y1,L1),
  mojef(L1,B,[X1,Y1],L),odstran(L,A,[X1,Y1],A1,L2),zamen(L,[F,X,Y],[F,X1,Y1],B,B1),
  pridej(L,[A1,B1],Pl1,Pl2),cfirek(L2,[F,X1,Y1],[A1,B1],[DX,DY],Pl,Pl1).
