Rod2.inc 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. Procedure RodOldTurn(cz:byte; var x,y : byte);far;
  2. Var
  3. x1,y1,PR,i,max,MAXX,MAXY,MAXI,MAXprX,MAXprY,MAXprI,MaxAr,MaxPRAr: byte;
  4. maxp,maxprp : integer;
  5. BestX,BestY,BestPRX,BestPRY : byte;
  6. ar : array [1..20] of byte;
  7. apr : array [1..20] of byte;
  8. Around : array [1..20] of byte;
  9. AroundPr : array [1..20] of byte;
  10. found,tmp,tmpPR,FoundPR,KON : boolean;
  11. Procedure FindY(x1,y1,d:byte);
  12. begin
  13. case d of
  14. 5: if (pole[x1,y1-1]=0) then begin x:=x1;y:=y1-1 end else
  15. if (pole[x1,y1-2]=0) then begin x:=x1;y:=y1-2 end else
  16. if (pole[x1,y1-3]=0) then begin x:=x1;y:=y1-3 end else
  17. begin x:=x1;y:=y1-4 end;
  18. 4: if (pole[x1,y1-1]=0) then begin x:=x1;y:=y1-1 end else
  19. if (pole[x1,y1+1]=0) then begin x:=x1;y:=y1+1 end else
  20. if (pole[x1,y1-2]=0) then begin x:=x1;y:=y1-2 end else
  21. begin x:=x1;y:=y1-3 end;
  22. 3: if (pole[x1,y1-1]=0) then begin x:=x1;y:=y1-1 end else
  23. if (pole[x1,y1+1]=0) then begin x:=x1;y:=y1+1 end else
  24. if (pole[x1,y1-2]=0) then begin x:=x1;y:=y1-2 end else
  25. begin x:=x1;y:=y1+2 end;
  26. 2: if (pole[x1,y1-1]=0) then begin x:=x1;y:=y1-1 end else
  27. if (pole[x1,y1+1]=0) then begin x:=x1;y:=y1+1 end else
  28. if (pole[x1,y1+2]=0) then begin x:=x1;y:=y1+2 end else
  29. begin x:=x1;y:=y1+3 end;
  30. 1: if (pole[x1,y1+1]=0) then begin x:=x1;y:=y1+1 end else
  31. if (pole[x1,y1+2]=0) then begin x:=x1;y:=y1+2 end else
  32. if (pole[x1,y1+3]=0) then begin x:=x1;y:=y1+3 end else
  33. begin x:=x1;y:=y1+4 end;
  34. end;
  35. end;
  36. Procedure FindX(x1,y1,d:byte);
  37. begin
  38. case d of
  39. 5: if (pole[x1-1,y1]=0) then begin x:=x1-1;y:=y1 end else
  40. if (pole[x1-2,y1]=0) then begin x:=x1-2;y:=y1 end else
  41. if (pole[x1-3,y1]=0) then begin x:=x1-3;y:=y1 end else
  42. begin x:=x1-4;y:=y1-4 end;
  43. 4: if (pole[x1-1,y1]=0) then begin x:=x1-1;y:=y1 end else
  44. if (pole[x1+1,y1]=0) then begin x:=x1+1;y:=y1 end else
  45. if (pole[x1-2,y1]=0) then begin x:=x1-2;y:=y1 end else
  46. begin x:=x1-3;y:=y1 end;
  47. 3: if (pole[x1-1,y1]=0) then begin x:=x1-1;y:=y1 end else
  48. if (pole[x1+1,y1]=0) then begin x:=x1+1;y:=y1 end else
  49. if (pole[x1-2,y1]=0) then begin x:=x1-2;y:=y1 end else
  50. begin x:=x1+2;y:=y1 end;
  51. 2: if (pole[x1-1,y1]=0) then begin x:=x1-1;y:=y1 end else
  52. if (pole[x1+1,y1]=0) then begin x:=x1+1;y:=y1 end else
  53. if (pole[x1+2,y1]=0) then begin x:=x1+2;y:=y1 end else
  54. begin x:=x1+3;y:=y1 end;
  55. 1: if (pole[x1+1,y1]=0) then begin x:=x1+1;y:=y1 end else
  56. if (pole[x1+2,y1]=0) then begin x:=x1+2;y:=y1 end else
  57. if (pole[x1+3,y1]=0) then begin x:=x1+3;y:=y1 end else
  58. begin x:=x1+4;y:=y1 end;
  59. end;
  60. end;
  61. Procedure FindYX(x1,y1,d:byte);
  62. begin
  63. case d of
  64. 5: if (pole[x1-1,y1-1]=0) then begin x:=x1-1;y:=y1-1 end else
  65. if (pole[x1-2,y1-2]=0) then begin x:=x1-2;y:=y1-2 end else
  66. if (pole[x1-3,y1-3]=0) then begin x:=x1-3;y:=y1-3 end else
  67. begin x:=x1-4;y:=y1-4 end;
  68. 4: if (pole[x1-1,y1-1]=0) then begin x:=x1-1;y:=y1-1 end else
  69. if (pole[x1+1,y1+1]=0) then begin x:=x1+1;y:=y1+1 end else
  70. if (pole[x1-2,y1-2]=0) then begin x:=x1-2;y:=y1-2 end else
  71. begin x:=x1-3;y:=y1-3 end;
  72. 3: if (pole[x1-1,y1-1]=0) then begin x:=x1-1;y:=y1-1 end else
  73. if (pole[x1+1,y1+1]=0) then begin x:=x1+1;y:=y1+1 end else
  74. if (pole[x1-2,y1-2]=0) then begin x:=x1-2;y:=y1-2 end else
  75. begin x:=x1+2;y:=y1+2 end;
  76. 2: if (pole[x1-1,y1-1]=0) then begin x:=x1-1;y:=y1-1 end else
  77. if (pole[x1+1,y1+1]=0) then begin x:=x1+1;y:=y1+1 end else
  78. if (pole[x1+2,y1+2]=0) then begin x:=x1+2;y:=y1+2 end else
  79. begin x:=x1+3;y:=y1+3 end;
  80. 1: if (pole[x1+1,y1+1]=0) then begin x:=x1+1;y:=y1+1 end else
  81. if (pole[x1+2,y1+2]=0) then begin x:=x1+2;y:=y1+2 end else
  82. if (pole[x1+3,y1+3]=0) then begin x:=x1+3;y:=y1+3 end else
  83. begin x:=x1+4;y:=y1+4 end;
  84. end;
  85. end;
  86. Procedure Find_YX(x1,y1,d:byte);
  87. begin
  88. case d of
  89. 5: if (pole[x1+1,y1-1]=0) then begin x:=x1+1;y:=y1-1 end else
  90. if (pole[x1+2,y1-2]=0) then begin x:=x1+2;y:=y1-2 end else
  91. if (pole[x1+3,y1-3]=0) then begin x:=x1+3;y:=y1-3 end else
  92. begin x:=x1+4;y:=y1-4 end;
  93. 4: if (pole[x1+1,y1-1]=0) then begin x:=x1+1;y:=y1-1 end else
  94. if (pole[x1-1,y1+1]=0) then begin x:=x1-1;y:=y1+1 end else
  95. if (pole[x1+2,y1-2]=0) then begin x:=x1+2;y:=y1-2 end else
  96. begin x:=x1+3;y:=y1-3 end;
  97. 3: if (pole[x1+1,y1-1]=0) then begin x:=x1+1;y:=y1-1 end else
  98. if (pole[x1-1,y1+1]=0) then begin x:=x1-1;y:=y1+1 end else
  99. if (pole[x1+2,y1-2]=0) then begin x:=x1+2;y:=y1-2 end else
  100. begin x:=x1-2;y:=y1+2 end;
  101. 2: if (pole[x1+1,y1-1]=0) then begin x:=x1+1;y:=y1-1 end else
  102. if (pole[x1-1,y1+1]=0) then begin x:=x1-1;y:=y1+1 end else
  103. if (pole[x1-2,y1+2]=0) then begin x:=x1-2;y:=y1+2 end else
  104. begin x:=x1-3;y:=y1+3 end;
  105. 1: if (pole[x1-1,y1+1]=0) then begin x:=x1-1;y:=y1+1 end else
  106. if (pole[x1-2,y1+2]=0) then begin x:=x1-2;y:=y1+2 end else
  107. if (pole[x1-3,y1+3]=0) then begin x:=x1-3;y:=y1+3 end else
  108. begin x:=x1-4;y:=y1+4 end;
  109. end;
  110. end;
  111. Procedure AnalY(x1,y1:byte;c:boolean);
  112. var pr,cz1,j,i : byte;
  113. begin
  114. if c then cz1 := cz else cz1:=3-cz;
  115. if c then pr := 3-cz else pr := cz;
  116. for i := 5 downto 1 do
  117. if (pole[x1,y1-i+1]<>pr) and
  118. (pole[x1,y1-i+2]<>pr) and
  119. (pole[x1,y1-i+3]<>pr) and (y1-i+1>0) and (y1+5-i<n+1) and
  120. (pole[x1,y1-i+4]<>pr) and
  121. (pole[x1,y1-i+5]<>pr) then
  122. begin
  123. tmp := true;
  124. for j := 1 to 5 do if pole[x1,y1-i+j] = cz1 then
  125. if c then inc(ar[i]) else inc(aPr[i]);
  126. end;
  127. end;
  128. Procedure AnalX(x1,y1:byte;c:boolean);
  129. var pr,cz1,j,i : byte;
  130. begin
  131. if c then cz1 := cz else cz1:=3-cz;
  132. if c then pr := 3-cz else pr := cz;
  133. for i := 5 downto 1 do
  134. if (pole[x1-i+1,y1]<>pr) and
  135. (pole[x1-i+2,y1]<>pr) and
  136. (pole[x1-i+3,y1]<>pr) and (x1-i+1>0) and (x1+5-i<n+1) and
  137. (pole[x1-i+4,y1]<>pr) and
  138. (pole[x1-i+5,y1]<>pr) then
  139. begin
  140. tmp := true;
  141. for j := 1 to 5 do if pole[x1-i+j,y1] = cz1 then
  142. if c then inc(ar[5+i]) else inc(aPr[5+i]);
  143. end;
  144. end;
  145. Procedure AnalYX(x1,y1:byte;c:boolean);
  146. var pr,cz1,j,i : byte;
  147. begin
  148. if c then cz1 := cz else cz1:=3-cz;
  149. if c then pr := 3-cz else pr := cz;
  150. for i := 5 downto 1 do
  151. if (pole[x1-i+1,y1-i+1]<>pr) and
  152. (pole[x1-i+2,y1-i+2]<>pr) and
  153. (pole[x1-i+3,y1-i+3]<>pr) and (x1-i+1>0) and (x1+5-i<n+1) and
  154. (pole[x1-i+4,y1-i+4]<>pr) and (y1-i+1>0) and (y1+5-i<n+1) and
  155. (pole[x1-i+5,y1-i+5]<>pr) then
  156. begin
  157. tmp := true;
  158. for j := 1 to 5 do if pole[x1-i+j,y1-i+j] = cz1 then
  159. if c then inc(ar[10+i]) else inc(aPr[10+i]);
  160. end;
  161. end;
  162. Procedure Anal_YX(x1,y1:byte;c:boolean);
  163. var pr,cz1,j,i : byte;
  164. begin
  165. if c then cz1 := cz else cz1:=3-cz;
  166. if c then pr := 3-cz else pr := cz;
  167. for i := 5 downto 1 do
  168. if (pole[x1+i-1,y1-i+1]<>pr) and
  169. (pole[x1+i-2,y1-i+2]<>pr) and
  170. (pole[x1+i-3,y1-i+3]<>pr) and (x1+i-1<n+1) and (x1-5+i>0) and
  171. (pole[x1+i-4,y1-i+4]<>pr) and (y1-i+1>0) and (y1+5-i<n+1) and
  172. (pole[x1+i-5,y1-i+5]<>pr) then
  173. begin
  174. tmp := true;
  175. for j := 1 to 5 do if pole[x1+i-j,y1-i+j] = cz1 then
  176. if c then inc(ar[15+i]) else inc(aPr[15+i]);
  177. end;
  178. end;
  179. Begin
  180. randomize;
  181. pr := 3 - cz;
  182. found := false;
  183. for i := 1 to 20 do ar[i] := 0;
  184. for i := 1 to 20 do apr[i] := 0;
  185. FoundPR := false;
  186. MAXP := 0;
  187. MAXprP := 0;
  188. KON := false;
  189. for y1 := 1 to n do
  190. for x1 := 1 to n do
  191. if Pole[x1,y1] = cz then
  192. begin
  193. if not kon then begin
  194. tmp := false;
  195. AnalX(x1,y1,true);
  196. AnalY(x1,y1,true);
  197. AnalYX(x1,y1,true);
  198. Anal_YX(x1,y1,true);
  199. if tmp then
  200. begin
  201. max := 1;
  202. for i := 2 to 20 do if ar[i] > ar[max] then max := i;
  203. if (ar[max] > MAXP) or ((ar[max] = MAXP) and (Random(1)=1))then
  204. begin
  205. MAXP := ar[max];
  206. MAXI := max;
  207. MAXX := x1;
  208. MAXY := y1;
  209. if maxp > 3 then begin KON := true; FoundPr := false; end;
  210. found := true;
  211. end;
  212. for i := 1 to 20 do ar[i] := 0;
  213. end;
  214. end;
  215. end else if pole[x1,y1] = PR then if not foundPR then
  216. begin
  217. if not kon then begin
  218. tmp := false;
  219. AnalX(x1,y1,false);
  220. AnalY(x1,y1,false);
  221. AnalYX(x1,y1,false);
  222. Anal_YX(x1,y1,false);
  223. if tmp then
  224. begin
  225. max := 0;
  226. for i := 1 to 20 do if apr[i] > 2 then max := i;
  227. if max <> 0 then
  228. if apr[max] > MAXprP then
  229. begin
  230. MAXprP := apr[max];
  231. MAXprI := max;
  232. MAXprX := x1;
  233. MAXprY := y1;
  234. foundPR := true;
  235. Found := true;
  236. end;
  237. for i := 1 to 20 do apr[i] := 0;
  238. end;
  239. end;
  240. end;
  241. if not found then
  242. repeat
  243. x:=random(n)+1;
  244. y:=random(n)+1;
  245. until Pole[x,y] = 0
  246. else if foundPR then
  247. begin
  248. if (maxprI in [1..5]) then FindY(maxprx,maxpry,maxprI) else
  249. if (maxprI in [6..10]) then FindX(maxprx,maxpry,maxprI-5) else
  250. if (maxprI in [11..15]) then FindYX(maxprx,maxpry,maxprI-10) else
  251. if (maxprI in [16..20]) then Find_YX(maxprx,maxpry,maxprI-15)
  252. end
  253. else
  254. if (maxI<6) then FindY(MAXx,MAXy,maxI) else
  255. if (maxI in [6..10]) then FindX(MAXx,MAXy,maxI-5) else
  256. if (maxI in [11..15]) then FindYX(MAXx,MAXy,maxI-10) else
  257. Find_YX(MAXx,MAXy,maxI-15);
  258. End;