unit gracz4: coroutine; const g=4; const start=31; const endpos=30; var players : arrayof boy; unit boy:class; var pos,back : integer; var suicide,stab,finish,moveout : boolean; end boy; unit playerinit:procedure; var i:integer; begin for i:=1 to 4 do players(i).pos:=tab(g,i); od; end playerinit; unit finishing:function(nr:integer):boolean; var i,j:integer; begin result:=false; i:=players(nr).pos; if i<>0 then if i+kostka>endpos and i+kostka nr then if (players(j).pos-100+1)=i+kostka-endpos then result:=false; fi; fi; od; fi; fi; end finishing; unit suiciding:function(nr:integer):boolean; var i:integer; begin result:=false; if players(nr).pos<>0 then for i:=1 to 4 do if nr<>i then if (players(nr).pos+kostka-1) mod 40 + 1 = players(i).pos andif players(i).pos<100 then result:=true; exit; fi; fi; od else for i:= 1 to 4 do if i<>nr andif players(i).pos=start then result:=true; exit; fi; od; fi; end suiciding; unit stabing:function(nr:integer):boolean; var i,j:integer; var b1,b2:boolean; begin result:=false; for i:=1 to 4 do if i<>g then for j:= 1 to 4 do if players(nr).pos > 0 and players(nr).pos <100 then b1:=(players(nr).pos+kostka-1) mod 40 +1 =tab(i,j) ; b2:=players(nr).pos>=start and b1; if b1 and (players(nr).pos+kostka-1) mod 40 + 1<=endpos orif b2 then result:=true; exit exit; fi else result:=(kostka=6 and players(nr).pos=0 and tab(i,j)=start); exit exit; fi; od; fi; od; end stabing; unit atback:function(nr:integer):integer; var i,j,np:integer; begin np:=players(nr).pos; result:=0; if np<>0 then if np < 7 then for i:=1 to 4 do if i<>g then for j:=1 to 4 do if (tab(i,j) < np) then if tab(i,j)>0 then result:=result+1; fi else if tab(i,j) > 40-(6-np) then result:=result+1; fi; fi; od; fi; od; else for i:=1 to 4 do if i<>g then for j:=1 to 4 do if tab(i,j) < np andif tab(i,j) > np-7 then result:=result +1; fi; od; fi; od; fi; fi; end atback; unit begining : function(nr:integer):boolean; begin result:=players(nr).pos=0 and kostka=6; end begining; unit move:function:integer; var i,j,k : integer; var ok:boolean; begin for i:= 1 to 4 do players(i).back:=atback(i); players(i).suicide:=suiciding(i); players(i).stab:=stabing(i); players(i).finish:=finishing(i); players(i).moveout:=begining(i); od; ok:=false; (********************* bije i wychodzi ************) for i:=1 to 4 do if players(i).moveout then for j:=1 to 4 do if g<>j then for k:=1 to 4 do if tab(j,k)=start then result:=i; ok:=true; exit exit exit; fi; od; fi; od; fi; od; (******************** gonia go i konczy **************) if not ok then for i:=1 to 4 do if players(i).pos>0 andif players(i).pos<100 andif players(i).finish andif players(i).back > 0 then result:=i; ok:=true; exit; fi; od; fi; (******************** gonia go i bije ******************) if not ok then for i:=1 to 4 do if players(i).pos<100 andif players(i).back>0 andif players(i).stab then result:=i; ok:=true; exit; fi; od; fi; (******************* bije ********************************) if not ok then for i:=1 to 4 do if players(i).stab then result:=i; ok:=true; exit; fi; od; fi; (******************** goni go conajmniej dwoch **********) if not ok then for i:=1 to 4 do if players(i).pos<100 andif players(i).back>=2 andif not players(i).suicide then result:=i; ok:=true; exit; fi; od; fi; (******************* wychodzi ****************************) if not ok then for i:=1 to 4 do if players(i).moveout andif not players(i).suicide then result:=i; ok:=true; exit; fi; od; fi; (******************* konczy *******************************) if not ok then for i:=1 to 4 do if players(i).finish then result:=i; ok:=true; exit; fi; od; fi; (******************** gonia go **********) if not ok then for i:=1 to 4 do if players(i).pos<100 andif players(i).pos>0 andif players(i).back>0 andif not players(i).suicide then result:=i; ok:=true; exit; fi; od; fi; (******************* nie bije swojego *********************) if not ok then for i:=4 downto 1 do if players(i).pos<100 andif players(i).pos>0 andif not players(i).suicide then result:=i; ok:=true; exit; fi; od; fi; (******************* bije swojego *********************) if not ok then for i:=1 to 4 do if players(i).suicide then result := 0 ; ok:=true; exit; fi; od; fi; if not ok then result:=0 fi; end move; (****** MAIN *****) (*****************) var aa:char; var i,m:integer; begin array players dim(1:4); for i:=1 to 4 do players(i):=new boy; od; return; do call playerinit; m:=move; call A.przesunpion(m); detach; od; end gracz4;