3 var ii,ij,kostka, ilugraczy: integer;
\r
4 var tab: arrayof arrayof integer;
\r
5 var gracz: arrayof coroutine;
\r
7 unit gracz1:coroutine;
\r
15 call A.przesunpion(0);
\r
24 unit gracz2:coroutine;
\r
31 call A.przesunpion(witch);
\r
36 unit gracz3:coroutine;
\r
37 const g=3; (* number of player *)
\r
38 const eh=20; (* finish *)
\r
39 const spp=21; (* start *)
\r
41 var stran :arrayof integer;
\r
42 var pp,i,leader,nrkil,nrhun,witch :integer;
\r
43 var home :arrayof boolean;
\r
45 unit man:class; (* pawn *)
\r
46 var ple,saf,rsa :integer;
\r
47 var kil,hun,fin,mov :boolean;
\r
50 var pawn :arrayof man;
\r
51 unit poleposition:function:boolean;
\r
61 if h=0 then pp:=pp+1 fi;
\r
62 if h=spp then result:=false fi;
\r
63 if h>100 then home(h-100):=true fi;
\r
65 if pp=0 then result:=false fi;
\r
68 unit pawns:procedure;
\r
72 pawn(i).ple:=tab(g,i);
\r
76 unit finish:function:integer;
\r
78 unit inhome:function(a:integer):boolean;
\r
81 if a>1 andif a<=eh andif a+kostka>eh then
\r
82 if a+kostka-eh<5 andif not home(a+kostka-eh) then
\r
86 pawn(i).mov:=false;
\r
96 if pawn(i).ple>0 andif pawn(i).ple<99 then
\r
97 if inhome(pawn(i).ple) then
\r
102 pawn(i).mov:=false;
\r
107 unit killer:function:integer;
\r
111 pawn(i).kil:=false;
\r
114 if k=0 then k:=4 fi;
\r
115 if pawn(i).ple+kostka=pawn(k).ple andif pawn(i).ple=/=0 then
\r
122 unit hunter:function:integer;
\r
126 if pawn(i).ple=/=0 then
\r
127 j:=member(pawn(i).ple+kostka,stran);
\r
128 if pawn(i).ple+kostka=stran(j) then
\r
132 pawn(i).hun:=false;
\r
138 unit strangers:procedure;
\r
145 if i>ilugraczy then stran(k):=0;
\r
146 else stran(k):=tab(i,j);
\r
157 if stran(i)>stran(i+1) then
\r
159 stran(i):=stran(i+1);
\r
168 unit member:function(a:integer,arra:arrayof integer):integer;
\r
171 if a<99 then a:=(a+40)mod 40 fi;
\r
172 if a=0 then a:=40 fi;
\r
173 if a>arra(1) andif a<arra(13) then
\r
179 else if a<arra(1) then result:=1;
\r
185 unit safety:procedure;
\r
187 unit rafset:function(k:integer):integer;
\r
190 p:=member(k,stran);
\r
191 q:=member(k-6,stran);
\r
193 if p>q then result:=p-q
\r
195 if p=q then result:=0
\r
197 while stran(q)<99 do
\r
200 if q=13 then exit fi;
\r
203 while stran(q)=0 do
\r
206 result:=result+p-q;
\r
212 if pawn(i).ple>0 andif pawn(i).ple<99 then
\r
213 pawn(i).saf:=rafset(pawn(i).ple);
\r
214 pawn(i).rsa:=pawn(i).saf-rafset(pawn(i).ple+kostka);
\r
222 unit move:procedure;
\r
225 var moves:arrayof boolean;
\r
230 if pawn(i).fin then
\r
231 if pawn(i).rsa>j then
\r
239 array moves dim(1:4);
\r
242 if not pawn(i).kil andif pawn(i).hun then
\r
248 if not pawn(i).kil andif pawn(i).ple>0 andif pawn(i).mov then
\r
249 if speed orif moves(i) then
\r
250 if pawn(i).rsa>j then
\r
262 array pawn dim(1:4);
\r
263 array home dim(1:4);
\r
264 array stran dim(1:13);
\r
270 call A.gdziepiony;
\r
273 if poleposition and kostka=6 then
\r
275 while tab(g,i)=/=0 do
\r
290 call A.przesunpion(witch);
\r
294 (*44444**************** gracz 4 **********)
\r
297 unit gracz4: coroutine;
\r
302 var players : arrayof boy;
\r
305 var pos,back : integer;
\r
306 var suicide,stab,finish,moveout : boolean;
\r
309 unit playerinit:procedure;
\r
313 players(i).pos:=tab(g,i);
\r
317 unit finishing:function(nr:integer):boolean;
\r
321 i:=players(nr).pos;
\r
324 if i+kostka>endpos and i+kostka<endpos+5 and i<=endpos
\r
331 if (players(j).pos-100+1)=i+kostka-endpos
\r
332 then result:=false;
\r
340 unit suiciding:function(nr:integer):boolean;
\r
344 if players(nr).pos<>0
\r
350 if (players(nr).pos+kostka-1) mod 40 + 1 = players(i).pos
\r
351 andif players(i).pos<100
\r
361 if i<>nr andif players(i).pos=start
\r
369 unit stabing:function(nr:integer):boolean;
\r
380 if players(nr).pos > 0 and players(nr).pos <100
\r
382 b1:=(players(nr).pos+kostka-1) mod 40 +1 =tab(i,j) ;
\r
383 b2:=players(nr).pos>=start and b1;
\r
384 if b1 and (players(nr).pos+kostka-1) mod 40 + 1<=endpos orif b2
\r
390 result:=(kostka=6 and players(nr).pos=0 and tab(i,j)=start);
\r
398 unit atback:function(nr:integer):integer;
\r
399 var i,j,np:integer;
\r
401 np:=players(nr).pos;
\r
416 then result:=result+1;
\r
419 if tab(i,j) > 40-(6-np)
\r
420 then result:=result+1;
\r
434 andif tab(i,j) > np-7
\r
435 then result:=result +1;
\r
444 unit begining : function(nr:integer):boolean;
\r
446 result:=players(nr).pos=0 and kostka=6;
\r
449 unit move:function:integer;
\r
450 var i,j,k : integer;
\r
455 players(i).back:=atback(i);
\r
456 players(i).suicide:=suiciding(i);
\r
457 players(i).stab:=stabing(i);
\r
458 players(i).finish:=finishing(i);
\r
459 players(i).moveout:=begining(i);
\r
462 (********************* bije i wychodzi ************)
\r
465 if players(i).moveout
\r
476 ok:=true; exit exit exit;
\r
483 (******************** gonia go i konczy **************)
\r
488 if players(i).pos>0
\r
489 andif players(i).pos<100
\r
490 andif players(i).finish
\r
491 andif players(i).back > 0
\r
498 (******************** gonia go i bije ******************)
\r
503 if players(i).pos<100
\r
504 andif players(i).back>0
\r
505 andif players(i).stab
\r
512 (******************* bije ********************************)
\r
524 (******************** goni go conajmniej dwoch **********)
\r
529 if players(i).pos<100
\r
530 andif players(i).back>=2
\r
531 andif not players(i).suicide
\r
538 (******************* wychodzi ****************************)
\r
543 if players(i).moveout
\r
544 andif not players(i).suicide
\r
552 (******************* konczy *******************************)
\r
557 if players(i).finish
\r
565 (******************** gonia go **********)
\r
570 if players(i).pos<100
\r
571 andif players(i).pos>0
\r
572 andif players(i).back>0
\r
573 andif not players(i).suicide
\r
580 (******************* nie bije swojego *********************)
\r
585 if players(i).pos<100
\r
586 andif players(i).pos>0
\r
587 andif not players(i).suicide
\r
594 (******************* bije swojego *********************)
\r
599 if players(i).suicide
\r
608 if not ok then result:=0 fi;
\r
618 (****** MAIN *****)
\r
619 (*****************)
\r
622 unit inchar : IIuwgraph function : integer;
\r
623 (*podaj nr znaku przeslanego z klawiatury *)
\r
628 if i <> 0 then exit fi;
\r
635 array players dim(1:4);
\r
638 players(i):=new boy;
\r
644 call A.przesunpion(m);
\r
646 writeln("back,suic,stab,fin,out:");
\r
650 write(players(i).back," ");
\r
651 if players(i).suicide then write("1") else write("0") fi;
\r
653 if players(i).stab then write("1") else write("0") fi;
\r
655 if players(i).finish then write("1") else write("0") fi;
\r
657 if players(i).moveout then write("1") else write("0") fi;
\r
661 pref iiuwgraph block
\r
673 unit arbiter: coroutine;
\r
675 hidden plansza, ilegr, i, j, oczka, ktory, sk, polozenie, dom, gracze;
\r
676 hidden wejscie, polestartu, skonczyli, sem, zakonczenie;
\r
677 var plansza: arrayof pion;
\r
678 var ilegr, i, j, oczka, ktory, sk: integer;
\r
679 var polozenie, dom: arrayof arrayof integer;
\r
680 var gracze: arrayof coroutine;
\r
681 var wejscie: arrayof integer;
\r
682 var polestartu, skonczyli: arrayof integer;
\r
684 var zakonczenie: char;
\r
687 unit rzut: function: integer;
\r
694 result:= entier(pom)+1
\r
698 unit pion: class (czyj, jaki: integer);
\r
700 unit gdziepiony: procedure;
\r
707 tab(i,j):=polozenie(i,j)
\r
713 unit przesunpion: procedure (co: integer);
\r
715 var s, g, t: integer;
\r
717 unit start: procedure;
\r
719 if oczka=/=6 then return fi;
\r
720 g:=polestartu (ktory);
\r
721 polozenie (ktory, co):=g;
\r
722 if plansza (g) =/= none
\r
725 plansza (g):=new pion (ktory, co)
\r
728 unit bicie: procedure;
\r
730 polozenie (plansza(g).czyj, plansza(g).jaki):=0;
\r
734 begin (* przesunpion *)
\r
741 if co=0 then return fi;
\r
742 s:=polozenie (ktory, co);
\r
744 then (* pion w domu *)
\r
753 if ( s <= wejscie(ktory) and g > wejscie(ktory) )
\r
754 then (* wejscie do domu *)
\r
755 t:= oczka-(wejscie(ktory)-s);
\r
756 if t>4 then return fi;
\r
757 if dom (ktory,t) = 0
\r
759 dom (ktory,t) := co;
\r
760 polozenie (ktory,co) :=100+t;
\r
766 if g>40 then g:=g-40 fi;
\r
767 if plansza(g)=/=none
\r
770 plansza(g):=plansza(s);
\r
772 polozenie (ktory,co):=g
\r
776 unit skonczyl: function: boolean;
\r
781 if skonczyli(i)=ktory
\r
790 unit koniec: function: boolean;
\r
792 var doszedl: boolean;
\r
806 skonczyli(sk):=ktory
\r
811 unit komunikat: procedure;
\r
817 writeln (i:1," miejsce zajal gracz ",skonczyli(i):1)
\r
822 begin (* arbiter *)
\r
824 if ilegr=0 then call endrun fi;
\r
825 array polozenie dim (1:ilegr);
\r
826 array tab dim (1:ilegr);
\r
827 array dom dim (1:ilegr);
\r
828 array plansza dim (1:40);
\r
829 array skonczyli dim (1:ilegr);
\r
830 array gracze dim (1:ilegr);
\r
831 gracze:=copy(gracz);
\r
834 array dom(i) dim (1:4);
\r
835 array polozenie(i) dim (1:4);
\r
836 array tab(i) dim (1:4)
\r
838 array wejscie dim (1:ilegr);
\r
839 array polestartu dim (1:ilegr);
\r
842 polestartu(i):=10*(i-1)+1;
\r
843 wejscie(i):=polestartu(i)-1
\r
850 write(tab(ii,ij):4)
\r
856 if ktory=3 then ktory:=4
\r
863 kostka, oczka:=rzut;
\r
866 writeln (" kostka :" ,oczka," ktory :",ktory);
\r
869 write(tab(ii,ij):4)
\r
873 attach (gracze(ktory));
\r
874 if koniec then exit exit fi;
\r
875 if oczka=/=6 or skonczyl then exit fi;
\r
879 read (zakonczenie);
\r
891 begin (* program glowny *)
\r
893 array gracz dim (1:ilugraczy);
\r
894 gracz(1) := new gracz1;
\r
895 gracz(2) := new gracz2;
\r
896 gracz(3) := new gracz3;
\r
897 gracz(4) := new gracz4;
\r