Advertisement
Yarodash

Soccer Stars On Pascal

Dec 9th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.87 KB | None | 0 0
  1. //Soccer Stars
  2. uses graphabc;
  3.  
  4. var ballsCount:longint;
  5.     mx,my,q1,q2,z,turn,f1,f2:longint;
  6.     q:real;
  7.     st:longint;
  8.     w:boolean;
  9.    
  10.    
  11. const sizex = 800;
  12. const sizey = 400;
  13. const board = 100;
  14. const fishek = 5;
  15.  
  16. function ncos(a:real):real;
  17. begin
  18. ncos := cos(a*pi/180);
  19. end;
  20.  
  21. function nsin(a:real):real;
  22. begin
  23. nsin := sin(a*pi/180);
  24. end;
  25.  
  26. procedure VelocityFromAngle(var vx,vy:real;v,a:real);
  27. begin
  28. vx := v*ncos(a);
  29. vy := v*nsin(a);
  30. end;
  31.  
  32. procedure AngleFromVelocity(vx,vy:real; var v,a:real);
  33. begin
  34. if vx = 0 then vx := 0.000001;
  35. a := arctan(vy/vx)/pi*180;
  36. if vx < 0 then a := a + 180;
  37. v := sqrt(vx*vx+vy*vy);
  38. end;
  39.  
  40. type ball = class
  41.   F,m:real;
  42.   A:real;
  43.   x,y,vx,vy,r:real;
  44.  
  45.   constructor Create(x,y,F,A,m,r:real; z:boolean);
  46.   begin
  47.     ballscount += 1;
  48.     Self.x := x;
  49.     Self.y := y;    
  50.     Self.F := F*m;
  51.     Self.A := A;
  52.     Self.m := m;
  53.     Self.r := r;
  54.    
  55.     AngleFromVelocity(F,A,Self.F,Self.A);
  56.    
  57.     if m <= 0 then Self.m := 1;
  58.   end;
  59.  
  60.   constructor Create(x,y,vx,vy,m:real);
  61.   begin
  62.     ballscount += 1;
  63.     Self.x := x;
  64.     Self.y := y;    
  65.     Self.vx := vx;
  66.     Self.vy := vy;
  67.     Self.m := m;
  68.    
  69.     with Self do
  70.     AngleFromVelocity(vx,vy,F,a);
  71.  
  72.     if m <= 0 then Self.m := 1;
  73.   end;  
  74.  
  75.   procedure Draw;
  76.   begin
  77.     fillcircle(round(x),round(y),round(r));
  78.     for var i := round(r) downto round(r)-2 do circle(round(x),round(y),i);
  79.   end;
  80.  
  81. end;
  82.  
  83. var balls:array[1..1000] of ball;
  84.  
  85. procedure respawn;
  86. begin
  87. ballscount := 0;
  88.  
  89. var ballr := 10;
  90. var fishkar := 20;
  91.  
  92. balls[1]  := new ball(100+board,200+board,0,0,10,fishkar,true);
  93. balls[2]  := new ball(170+board,200+board,0,0,10,fishkar,true);
  94. balls[3]  := new ball(240+board,200+board,0,0,10,fishkar,true);
  95. balls[4]  := new ball(310+board,130+board,0,0,10,fishkar,true);
  96. balls[5]  := new ball(310+board,270+board,0,0,10,fishkar,true);
  97.  
  98. balls[6]  := new ball(700+board,200+board,0,0,10,fishkar,true);
  99. balls[7]  := new ball(630+board,130+board,0,0,10,fishkar,true);
  100. balls[8]  := new ball(630+board,270+board,0,0,10,fishkar,true);
  101. balls[9]  := new ball(560+board,200+board,0,0,10,fishkar,true);
  102. balls[10] := new ball(490+board,200+board,0,0,10,fishkar,true);
  103. {
  104. for var i := 1 to fishek*2 do
  105. begin
  106. balls[i]  := new ball(random(sizex-100)+50+board,random(sizey-100)+50+board,0,0,10,fishkar,true);
  107. end;}
  108.  
  109. balls[fishek*2+1] := new ball(400+board,200+board,0,0,10,ballr,true);
  110. end;
  111.  
  112. procedure collision(i,j:longint);
  113. var vx1,vy1,vx2,vy2,boardA,q:real;
  114. begin
  115.  
  116. VelocityFromAngle(vx1,vy1,balls[i].F,balls[i].A);
  117. VelocityFromAngle(vx2,vy2,balls[j].F,balls[j].A);
  118.  
  119. if sqrt(sqr(balls[i].x-balls[j].x)+sqr(balls[i].y-balls[j].y)) < balls[i].r+balls[j].r then
  120. begin
  121.  
  122. AngleFromVelocity(balls[j].x-balls[i].x,balls[j].y-balls[i].y,q,boardA);
  123.  
  124. vx1 := ncos(balls[j].A-boardA)*balls[j].F;
  125. vy2 := nsin(balls[j].A-boardA)*balls[j].F;
  126.  
  127. vx2 := ncos(balls[i].A-boardA)*balls[i].F;
  128. vy1 := nsin(balls[i].A-boardA)*balls[i].F;
  129.  
  130. AngleFromVelocity(vx1,vy1,balls[i].F,balls[i].A);
  131. AngleFromVelocity(vx2,vy2,balls[j].F,balls[j].A);
  132.  
  133. balls[i].A += boardA;
  134. balls[j].A += boardA;
  135.  
  136. end;
  137.  
  138.  
  139. end;
  140.  
  141. procedure Update;
  142. var p:real;
  143. begin
  144. p := 0;
  145.  
  146. w := false;
  147.  
  148. for var i := 1 to ballscount do
  149. begin
  150.  
  151.   with balls[i] do
  152.   begin          
  153.  
  154.     x := x + ncos(A)*F/m;
  155.     y := y + nsin(A)*F/m;
  156.    
  157.     F -= m*0.01;
  158.     F /= 1.02;
  159.    
  160.     if F < 0.1 then F := 0;  
  161.    
  162.     if F > 0 then w := true;
  163.    
  164.     {
  165.     if x > WindowWidth then x -= WindowWidth else
  166.     if x < 0 then x += WindowWidth;
  167.     if y > WindowHeight then y -= WindowHeight else
  168.     if y < 0 then y += WindowHeight; }
  169.    
  170.     if x+r > sizex+board then A := 180-A else
  171.     if x-r < board then A := 180-A;
  172.     if y+r > sizey+board then A := 360-A else
  173.     if y-r < board then A := 360-A;  
  174.    
  175.    
  176.     if i = fishek*2+1 then begin
  177.    
  178.       if (x > board+sizex-50) and (x < board+sizex) and (y > board+sizey/3) and (y < board+2*sizey/3) then begin
  179.         st := 0;
  180.         f1 += 1;
  181.        
  182.         sleep(1000);
  183.         respawn;
  184.       end else
  185.       if (x < board+50) and (x > board) and (y > board+sizey/3) and (y < board+2*sizey/3) then begin
  186.         st := 1;
  187.         f2 += 1;
  188.        
  189.         sleep(1000);
  190.         respawn;
  191.       end;
  192.    
  193.    
  194.     end;
  195.    
  196.   end;
  197.  
  198. end;
  199.  
  200. for var i := 1 to ballscount do
  201.   for var j := i+1 to ballscount do
  202.     collision(i,j);
  203.  
  204. end;
  205.  
  206.  
  207.  
  208. procedure MouseMove(x,y,mb:longint);
  209. begin
  210. q1 := x;
  211. q2 := y;
  212.  
  213. q := 1;
  214.  
  215.     if sqrt(sqr(mx-x)+sqr(my-y)) >= 140 then
  216.       q := 140/sqrt(sqr(mx-x)+sqr(my-y))  
  217.      
  218.     else q := 1;
  219.  
  220. //if mb = 2 then balls[ballscount+1]  := new ball(x,y,0,0,10,20,true);
  221.  
  222. if (mb = 1) and (w = false) then
  223. begin
  224.   if (mx+my = 0) then
  225.   begin
  226.  
  227.     z := 0;
  228.  
  229.     for var i := 1 to fishek*2 do if sqrt(sqr(balls[i].x-x)+sqr(balls[i].y-y)) <= balls[i].m then z := i;
  230.    
  231.     if (z > 0) and (z <= fishek) and (st mod 2 = 1) or (z > fishek) and (z <= fishek*2) and (st mod 2 = 0) then
  232.     begin
  233.       mx := round(balls[z].x);
  234.       my := round(balls[z].y);
  235.     end;
  236.   end;
  237. end;
  238.  
  239. if (mb = 0) and (w = false) then
  240. begin
  241.  
  242.   if (sqrt(sqr(mx-x)+sqr(my-y)) < 10) then begin mx := 0; my := 0; end;
  243.  
  244.   if ((mx+my) > 0) then
  245.   begin
  246.  
  247.     balls[z].vx := (mx-x)*q;
  248.     balls[z].vy := (my-y)*q;
  249.    
  250.     with balls[z] do
  251.       AngleFromVelocity(vx,vy,F,A);
  252.      
  253.     st += 1;  
  254.      
  255.     mx := 0;
  256.     my := 0;
  257.   end;
  258.  
  259.  
  260. end;
  261.  
  262.  
  263. end;
  264.  
  265. procedure KeyDown(key:integer);
  266. begin
  267. if key = VK_UP then respawn;
  268. end;
  269.  
  270. begin
  271. setpenwidth(3);
  272. st := 1;
  273.  
  274. LockDrawing;
  275. OnKeyDown := KeyDown;
  276. OnMouseMove := MouseMove;
  277. OnMouseDown := MouseMove;
  278.  
  279. SetWindowSize(sizex+board*2,sizey+board*2);
  280.  
  281. respawn;
  282.  
  283. while true do
  284. begin
  285.  
  286. case st mod 2 of
  287.   0: SetWindowCaption('Red Move   '+IntToStr(f1)+'-'+IntToStr(f2));
  288.   1: SetWindowCaption('Blue Move '+IntToStr(f1)+'-'+IntToStr(f2));
  289. end;
  290.  
  291. Update;
  292. ClearWindow;
  293.  
  294. setbrushcolor(clwhite);
  295. Rectangle(board,board,sizex+board,sizey+board);
  296. Rectangle(board,board+sizey div 3,board+50,board+2*sizey div 3);
  297. Rectangle(board+sizex,board+sizey div 3,board+sizex-50,board+2*sizey div 3);
  298.  
  299. setbrushcolor(rgb(127,127,127));
  300. setpencolor(rgb(100,100,100));
  301. balls[2*fishek+1].Draw;
  302.  
  303. setbrushcolor(rgb(100,100,255));
  304. if (st mod 2 = 1) and (w = false) then
  305.   setpencolor(rgb(75,75,225)) else
  306.   setpencolor(rgb(0,0,200));
  307. //if (st mod 2 = 1) and (w = false) then setpenwidth(5) else setpenwidth(3);
  308. for var i := 1 to fishek do balls[i].Draw;
  309.  
  310. setbrushcolor(rgb(255,100,100));
  311. if (st mod 2 = 0) and (w = false) then
  312.   setpencolor(rgb(225,75,75)) else
  313.   setpencolor(rgb(200,0,0));
  314. //if (st mod 2 = 1) and (w = false) then setpenwidth(5) else setpenwidth(3);
  315. for var i := fishek+1 to fishek*2 do balls[i].Draw;
  316.  
  317.  
  318.  
  319. setpencolor(clgreen);
  320. if mx+my > 0 then line(mx,my,round( (-q1+mx)*q+mx ),round( my+(my-q2)*q ));
  321. Redraw;
  322.  
  323. //sleep(1);
  324. end;
  325.  
  326. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement