JOPPE.PAS 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. Uses Graph,CRT;
  2. Type
  3. PZveno = ^Zveno;
  4. Zveno = record
  5. Name : string;
  6. num : word;
  7. next : PZveno;
  8. prev : PZveno;
  9. end;
  10. Var
  11. last, chain : PZveno;
  12. curname : string;
  13. period : byte;
  14. tick : byte;
  15. ends : boolean;
  16. rcount : word;
  17. num : word;
  18. Procedure Add(Name:string;var chain:PZveno;var num:word);
  19. Var
  20. nz : pzveno;
  21. begin
  22. New(nz);
  23. nz^.name := name;
  24. nz^.next := last;
  25. nz^.prev := chain;
  26. inc(num);
  27. nz^.num := num;
  28. last^.prev := nz;
  29. chain^.next := nz;
  30. chain := nz;
  31. end;
  32. Function Remove(var zv:PZveno):boolean;
  33. var cur : PZveno;ret:boolean;
  34. begin
  35. cur := zv;
  36. ret := true;
  37. if (zv^.next <> zv^.prev) then ret := false;
  38. zv^.prev^.next := zv^.next;
  39. zv^.next^.prev := zv^.Prev;
  40. zv := zv^.next;
  41. Dispose(cur);
  42. Remove := ret;
  43. end;
  44. Function Count(chain:PZveno):byte;
  45. var cur:pzveno;ret:byte;
  46. begin
  47. cur := chain^.next;
  48. ret := 1;
  49. repeat
  50. inc(ret);
  51. cur := cur^.next;
  52. until cur = chain;
  53. Count := ret;
  54. end;
  55. Procedure Init;
  56. var
  57. grDriver: Integer;
  58. grMode: Integer;
  59. begin
  60. grDriver := Detect;
  61. InitGraph(grDriver, grMode,' ');
  62. end;
  63. Procedure WriteBall(cur,all,color:byte;cenX,cenY,radius:word;name:string);
  64. var
  65. x1, y1 : word;
  66. angle : real;
  67. begin
  68. SetColor(color);
  69. angle := 2*PI/All*cur;
  70. x1 := cenx + round(radius*cos(angle));
  71. y1 := ceny + round(radius*sin(angle));
  72. Circle(x1,y1,10);
  73. SetTextJustify(CenterText,CenterText);
  74. SetColor(White);
  75. OutTextXY(x1,y1,name);
  76. end;
  77. Procedure KillBall(cur,all:byte;cenX,cenY,radius:word);
  78. var
  79. x1, y1 : word;
  80. angle : real;
  81. begin
  82. SetColor(RED);
  83. angle := 2*PI/All*cur;
  84. x1 := cenx + round(radius*cos(angle));
  85. y1 := ceny + round(radius*sin(angle));
  86. SetLineStyle(SolidLn, 0, ThickWidth);
  87. Line(x1-6,y1+6,x1+6,y1-6);
  88. end;
  89. Begin
  90. New(chain);
  91. WriteLn('Enter Soilders'' names, blank for end:');
  92. ReadLn(curname);
  93. num := 1;
  94. if curname<>'' then chain^.name := curname else Halt(0);
  95. chain^.num:=1;
  96. last := chain;
  97. repeat
  98. ReadLn(curname);
  99. if curname<>'' then Add(curname,chain,num);
  100. until curname = '';
  101. WriteLn('Count: ',Count(chain));
  102. Write('Enter preiod: ');
  103. ReadLn(period);
  104. INit;
  105. rcount := count(chain);
  106. chain := last;
  107. For tick := 1 to rCount do
  108. begin
  109. WriteBall(tick,rcount,tick mod 15,320,240,200,chain^.name);
  110. chain := chain^.next;
  111. end;
  112. {------------------------------------}
  113. tick := 0;
  114. chain := last;
  115. repeat
  116. ends := false;
  117. if tick mod period = 0 then
  118. begin
  119. tick := 0;
  120. KillBall(chain^.num,rcount,320,240,200);
  121. ends := Remove(chain);
  122. ReadKey;
  123. end
  124. else
  125. chain := chain^.next;
  126. inc(tick);
  127. until ends;
  128. { WriteLn('The last is - ',chain^.name);}
  129. WriteBall(chain^.num,rcount,RED,320,240,200,'Winner');
  130. Remove(Chain);
  131. Readln;
  132. CloseGraph;
  133. End.