Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / examples / chin / ch.log
1 \r
2 unit gracz4: coroutine;\r
3 const g=4;\r
4 const start=31;\r
5 const endpos=30;\r
6 \r
7 var players : arrayof boy; \r
8 \r
9 unit boy:class;\r
10   var pos,back : integer;\r
11   var suicide,stab,finish,moveout : boolean;\r
12 end boy;\r
13 \r
14 unit playerinit:procedure;\r
15 var i:integer;\r
16  begin\r
17   for i:=1 to 4 do\r
18     players(i).pos:=tab(g,i);\r
19   od;\r
20 end playerinit;\r
21 \r
22 unit finishing:function(nr:integer):boolean;\r
23  var i,j:integer;\r
24  begin\r
25    result:=false;\r
26    i:=players(nr).pos;\r
27    if i<>0 \r
28    then \r
29      if i+kostka>endpos and i+kostka<endpos+5 and i<=endpos\r
30      then \r
31        result:=true;\r
32        for j:=1 to 4\r
33        do \r
34          if j <> nr \r
35          then\r
36            if (players(j).pos-100+1)=i+kostka-endpos\r
37            then result:=false;\r
38            fi;\r
39          fi;\r
40        od;\r
41      fi;\r
42    fi;\r
43 end finishing;\r
44  \r
45 unit suiciding:function(nr:integer):boolean;\r
46  var i:integer;\r
47  begin\r
48   result:=false;\r
49   if players(nr).pos<>0\r
50   then \r
51    for i:=1 to 4 \r
52    do\r
53      if nr<>i \r
54      then\r
55          if (players(nr).pos+kostka-1) mod 40 + 1 = players(i).pos \r
56     andif players(i).pos<100\r
57          then \r
58            result:=true;\r
59            exit;\r
60     fi;\r
61      fi;\r
62    od\r
63   else\r
64    for i:= 1 to 4\r
65    do\r
66      if i<>nr andif players(i).pos=start\r
67      then result:=true;\r
68      exit;\r
69      fi;\r
70    od;\r
71   fi;\r
72 end suiciding;\r
73  \r
74 unit stabing:function(nr:integer):boolean;\r
75  var i,j:integer;\r
76  var b1,b2:boolean;\r
77  begin\r
78   result:=false;\r
79    for i:=1 to 4\r
80    do\r
81      if i<>g \r
82      then\r
83        for j:= 1 to 4\r
84        do\r
85          if players(nr).pos > 0 and players(nr).pos <100\r
86          then\r
87            b1:=(players(nr).pos+kostka-1) mod 40 +1 =tab(i,j) ;\r
88            b2:=players(nr).pos>=start and b1;\r
89            if b1 and (players(nr).pos+kostka-1) mod 40 + 1<=endpos orif b2 \r
90            then\r
91              result:=true;\r
92              exit exit;\r
93            fi\r
94          else\r
95          result:=(kostka=6 and players(nr).pos=0 and tab(i,j)=start);\r
96          exit exit;\r
97          fi;\r
98        od;\r
99      fi;\r
100    od;\r
101 end stabing;  \r
102 \r
103 unit atback:function(nr:integer):integer;\r
104  var i,j,np:integer;\r
105  begin\r
106   np:=players(nr).pos;\r
107   result:=0;\r
108   if np<>0\r
109   then \r
110    if np < 7 \r
111    then\r
112      for i:=1 to 4 \r
113      do \r
114        if i<>g \r
115        then \r
116          for j:=1 to 4\r
117          do\r
118            if (tab(i,j) < np)\r
119            then\r
120                if tab(i,j)>0\r
121                then result:=result+1;\r
122                fi\r
123            else \r
124              if tab(i,j) > 40-(6-np)\r
125              then result:=result+1;\r
126              fi;\r
127            fi;\r
128          od;\r
129        fi;\r
130      od;\r
131    else\r
132      for i:=1 to 4\r
133      do\r
134        if i<>g\r
135        then\r
136          for j:=1 to 4\r
137     do\r
138       if tab(i,j) < np\r
139       andif tab(i,j) > np-7\r
140       then result:=result +1;\r
141       fi;\r
142     od;\r
143        fi;\r
144      od;                \r
145    fi;\r
146   fi;\r
147  end atback;\r
148  \r
149  unit begining : function(nr:integer):boolean;\r
150   begin\r
151     result:=players(nr).pos=0 and kostka=6;\r
152   end begining;\r
153   \r
154  unit move:function:integer;\r
155   var i,j,k : integer;\r
156   var ok:boolean;\r
157   begin\r
158    for i:= 1 to 4\r
159    do\r
160      players(i).back:=atback(i);\r
161      players(i).suicide:=suiciding(i);\r
162      players(i).stab:=stabing(i);\r
163      players(i).finish:=finishing(i);\r
164      players(i).moveout:=begining(i);\r
165    od;\r
166    ok:=false;\r
167    (********************* bije i wychodzi ************)\r
168    for i:=1 to 4\r
169    do \r
170      if players(i).moveout \r
171      then\r
172        for j:=1 to 4\r
173        do\r
174          if g<>j \r
175     then\r
176            for k:=1 to 4 \r
177            do\r
178         if tab(j,k)=start\r
179         then \r
180           result:=i;\r
181           ok:=true; exit exit exit;\r
182         fi;\r
183       od;\r
184     fi;\r
185        od;\r
186      fi;\r
187    od;\r
188    (******************** gonia go i konczy **************)\r
189   if not ok \r
190   then \r
191    for i:=1 to 4\r
192    do\r
193      if players(i).pos>0\r
194      andif players(i).pos<100\r
195      andif players(i).finish \r
196      andif players(i).back > 0\r
197      then\r
198        result:=i;\r
199        ok:=true; exit;\r
200      fi;\r
201    od;\r
202   fi;\r
203    (******************** gonia go i bije ******************)\r
204   if not ok \r
205   then\r
206    for i:=1 to 4\r
207    do\r
208      if players(i).pos<100\r
209      andif players(i).back>0\r
210      andif players(i).stab\r
211      then\r
212        result:=i;\r
213        ok:=true; exit;\r
214      fi;\r
215    od;\r
216   fi;\r
217    (******************* bije ********************************)\r
218   if not ok \r
219   then   \r
220    for i:=1 to 4\r
221    do\r
222      if players(i).stab\r
223      then\r
224        result:=i;\r
225        ok:=true; exit;\r
226      fi;\r
227    od;\r
228   fi;\r
229    (******************** goni go conajmniej dwoch **********)\r
230   if not ok \r
231   then\r
232    for i:=1 to 4\r
233    do\r
234      if players(i).pos<100\r
235      andif players(i).back>=2\r
236      andif not players(i).suicide\r
237      then\r
238        result:=i;\r
239        ok:=true; exit;\r
240      fi;\r
241    od;\r
242   fi;\r
243    (******************* wychodzi ****************************)\r
244   if not ok \r
245   then\r
246    for i:=1 to 4\r
247    do\r
248      if players(i).moveout\r
249      andif not players(i).suicide\r
250      then\r
251        result:=i;\r
252        ok:=true; exit;\r
253      fi;\r
254    od;\r
255   fi;\r
256    \r
257    (******************* konczy *******************************)\r
258   if not ok \r
259   then\r
260    for i:=1 to 4\r
261    do\r
262      if players(i).finish\r
263      then\r
264        result:=i;\r
265        ok:=true; exit;\r
266      fi;\r
267    od;\r
268   fi;\r
269 \r
270    (******************** gonia go **********)\r
271   if not ok \r
272   then\r
273    for i:=1 to 4\r
274    do\r
275      if players(i).pos<100\r
276      andif players(i).pos>0\r
277      andif players(i).back>0\r
278      andif not players(i).suicide\r
279      then\r
280        result:=i;\r
281        ok:=true; exit;\r
282      fi;\r
283    od;\r
284   fi;   \r
285    (******************* nie bije swojego *********************)\r
286   if not ok \r
287   then\r
288    for i:=4 downto 1\r
289    do\r
290      if players(i).pos<100\r
291      andif players(i).pos>0\r
292      andif not players(i).suicide\r
293      then\r
294        result:=i;\r
295        ok:=true; exit;\r
296      fi;\r
297    od;\r
298   fi;\r
299    (******************* bije swojego *********************)\r
300   if not ok \r
301   then\r
302    for i:=1 to 4\r
303    do\r
304      if players(i).suicide\r
305      then\r
306        result := 0 ;\r
307        ok:=true; exit;\r
308      fi;\r
309    od;\r
310   fi;\r
311   \r
312   \r
313   if not ok then result:=0 fi; \r
314 \r
315 \r
316  end move;\r
317   \r
318 \r
319  \r
320  \r
321  \r
322  \r
323  (****** MAIN *****)\r
324  (*****************)\r
325 var aa:char;\r
326 \r
327  var i,m:integer;\r
328  begin\r
329   array players dim(1:4);\r
330   for i:=1 to 4 \r
331   do\r
332     players(i):=new boy;\r
333   od;\r
334   return;\r
335   do\r
336     call playerinit;\r
337     m:=move;\r
338     call A.przesunpion(m);\r
339     \r
340     detach;\r
341   od;\r
342 end gracz4;\r
343 \1a