Студенты факультетов ТГПИ объединяйтесь!!!

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



СРОЧНО нужна помошь!!!

Сообщений 1 страница 21 из 21

1

короче народу мне и kashy нужно срочняка (желательно на завтра) такая прога:  " нарисовать мышкой линию, чтоб потом мышкой ей можно было управлять. И отбивать шарик прыгающий в небольшом квадрате, причем чем ближе к краю линии тем больше угол отражения. ""!!!
Магарыч обеспечен полюбасу!!!скиньте или ссылку какуюнить или саму прогу или хоть чонить!!!!У кого есть МЗ скиньте на мз...

2

Понятно... короче надо искать исходники dxball'а :)))

3

Пацаны ну помогите мля!!!! срочняк нужно!!!от этой херни зависит наше место  в институте!!!!

4

ТЗ подробнее давай, мож чего и придумается:), а то в [0] ТЗ описана по принципу "шума много, а драки нет". Как препод конкретно сформулировал задачу? И кому сдавать Созанскому или Заярному?

ЗЫ. надо графу в программинге вспоминать а то моделирование прийдется наверно сдавать:(

5

ЗАярному!!! короче по форме летает шарик ! на какойто определенной высоте находиться ПАЛКА) которая двигаеться с помощью мышки в лево и право!!!и когда шарик попадает на эту палку то он отскакивает как от края формы!!!!
Воть...
Пацаны нид хелп!!!!!

6

http://www.delphisources.ru/files/sourc … inball.zip

7

RegEdit написал(а):

http://www.delphisources.ru/files/sourc … inball.zip

Спасибо огромное! Правда она не запускается :( пишет нельзя запустить модуль. И я так понял что она содержит эти еб*ные квадраты которые разбивает шарик?

8

Запускается, на делфе 7.
квадраты перестают разбиваться если убрать стрчку в коде Bricks[i].Visible := FALSE;

9

В файле frmMain помещаем в комментарии вот так:

Код:
unit frmMain;

interface

uses
  Windows, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, ExtCtrls, StdCtrls;

type
  TBallDirection = (bdLeftUP, bdLeftDown, bdRightUp, bdRightDown);

type
  TBrick = class(TShape)
  public
    FTimesToHit   : integer;
    FNumberOfHits : integer;
  end;

  TBrickArray = Array[0..160] of TBrick;
  TBricks     = TBrickArray;

type
  TformMain = class(TForm)
    MainMenu1     : TMainMenu;
    PanelGame     : TPanel;
    miGame        : TMenuItem;
    miNew         : TMenuItem;
    miPauze       : TMenuItem;
    miN1          : TMenuItem;
    miExit        : TMenuItem;
    miHelp: TMenuItem;
    ShapeUser     : TShape;
    ShapeBall     : TShape;
    miTakeItEasy  : TMenuItem;
    miBringThemOn : TMenuItem;
    miHurtMe      : TMenuItem;
    miFoolsPlay   : TMenuItem;
    miKeys: TMenuItem;
    miAbout: TMenuItem;
    procedure miTakeItEasyClick(Sender: TObject);
    procedure miBringThemOnClick(Sender: TObject);
    procedure miHurtMeClick(Sender: TObject);
    procedure miFoolsPlayClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure miAboutClick(Sender: TObject);
    procedure miKeysClick(Sender: TObject);
  private
    BallDirection : TBallDirection;
    GameSpeed     : integer;
    BallSpeed     : integer;
    Difficulty    : integer;
    Bricks        : TBricks;
    procedure StartNewGame(aDifficulty: integer);
    procedure PlayABall;
//    procedure BuildTheWall;
//    procedure ShowDelphi;
//    procedure CheckTheWall(var NumberOfHits, HorizontalValue, VerticalValue: integer);
  public
  end;

var
  formMain: TformMain;

implementation

{$R *.DFM}

procedure TformMain.StartNewGame(aDifficulty: integer);
var
  I : integer;
begin
  BallDirection := bdRightUp;
  GameSpeed     := 15;
  BallSpeed     := aDifficulty;
  ShapeBall.SetBounds((PanelGame.Width - ShapeBall.Width) div 2,
                      229,
                      ShapeBall.Width,
                      ShapeBall.Height);
{  for I := 0 to 160 do
    begin
      Bricks[i].Visible       := TRUE;
      Bricks[i].FNumberOfHits := 0;
    end;}
  PlayABall;
end;


{procedure TformMain.BuildTheWall;
var
  I,
  RowCount,
  BrickTop,
  BrickLeft,
  BrickWidth : integer;
begin
  BrickWidth := 20;
  RowCount   := 0;
  BrickTop   := 24;//0;
  BrickLeft  := 0;
  if Bricks[0] = NIL then
    for I := 0 to 160 do
      begin
        Bricks[i] := TBrick.Create(Self);
        with Bricks[i] do
          begin
            Parent        := PanelGame;
            FTimesToHit   := 1;
            FNumberOfHits := 0;
            Width         := BrickWidth;
            Height        := 12;
            Brush.Color   := clYellow;
            Shape         := stRoundRect;
            BrickLeft     := RowCount * BrickWidth + 1;
            SetBounds(BrickLeft,
                      BrickTop,
                      BrickWidth,
                      12);
            Inc(BrickLeft);
            Inc(RowCount);
            if RowCount >= 23 then
              begin
                RowCount  := 0;
                BrickTop  := BrickTop + Height;
                BrickLeft := 0;
              end;
          end;
      end;
  ShowDelphi;
end;      }


{procedure TformMain.ShowDelphi;
var
  I : integer;
  procedure DoSetting(aBrick: TBrick);
  begin
    aBrick.Brush.Color       := clRed;
    aBrick.FTimesToHit := 2;
    aBrick.Update;
  end;
begin

end;}


procedure TformMain.PlayABall;
var
  BallIsOut                                   : boolean;
  DummyRect                                   : TRect;
  HorizontalValue,
  VerticalValue,
  NumberOfHits,
  CalculatedLeftPosOfTheBallWhenHittingTheTop : integer;
begin
  HorizontalValue := 0;
  VerticalValue   := 0;
  NumberOfHits    := 0;
  BallIsOut       := (ShapeBall.Top <= 0 - ShapeBall.Height) or
                     (ShapeBall.Top >= (PanelGame.Height + ShapeBall.Height));
  while not BallIsOut do
    begin
      Application.ProcessMessages;
      //Set the Pallet of the user to whatever he thinks is right...
      if GetKeyState(VK_LEFT) < 0 then
        if ShapeUser.Left > 0 then
          ShapeUser.SetBounds(ShapeUser.Left - 7, ShapeUser.Top, ShapeUser.Width, ShapeUser.Height);
      if GetKeyState(VK_RIGHT) < 0 then
        if ShapeUser.Left < (PanelGame.Width - ShapeUser.Width) then
          ShapeUser.SetBounds(ShapeUser.Left + 7, ShapeUser.Top, ShapeUser.Width, ShapeUser.Height);
      if GetKeyState(VK_END) < 0 then
        begin
          Application.ProcessMessages;
 //         Application.Terminate;
          Halt;
          Application.ProcessMessages;
        end;


      //Find and correct the direction of the ball...
      if ShapeBall.Left <= 0 then
        begin
          if BallDirection = bdLeftUp then
            BallDirection := bdRightUp;
          if BallDirection = bdLeftDown then
            BallDirection := bdRightDown;
        end;
      if (ShapeBall.Left + ShapeBall.Width) >= PanelGame.Width then
        begin
          if BallDirection = bdRightUp then
            BallDirection := bdLeftUp;
          if BallDirection = bdRightDown then
            BallDirection := bdLeftDown;
        end;
      if ShapeBall.Top <= 0 then
        begin
          if BallDirection = bdLeftUp then
            BallDirection := bdLeftDown;
          if BallDirection = bdRightUp then
            BallDirection := bdRightDown;
        end;
//      CheckTheWall(NumberOfHits, HorizontalValue, VerticalValue);

      if InterSectRect(DummyRect, ShapeBall.BoundsRect, ShapeUser.BoundsRect) then
        begin
          //The ball is bouncing against the pallet of the User...
          inc(NumberOfHits);
          if BallDirection = bdRightDown then
            BallDirection := bdRightUp;
          if BallDirection = bdLeftDown then
            BallDirection := bdLeftUp;

          if (ShapeBall.Left + (ShapeBall.Width div 2)) < (ShapeUser.Left + (ShapeUser.Width div 3)) then
            begin
              HorizontalValue := 2;
              VerticalValue   := 0;
            end;
          if ((ShapeBall.Left + (ShapeBall.Width div 2)) > (ShapeUser.Left + (ShapeUser.Width div 3))) and
             ((ShapeBall.Left + (ShapeBall.Width div 2)) < (ShapeUser.Left + ((ShapeUser.Width div 3) * 2))) then
            begin
              HorizontalValue := 0;
              VerticalValue   := 0;
            end;
          if (ShapeBall.Left + (ShapeBall.Width div 2)) > (ShapeUser.Left + ((ShapeUser.Width div 3) * 2)) then
            begin
              HorizontalValue := 0;
              VerticalValue   := 2;
            end;
        end;

      //Move the ball...
      if NumberOfHits > 30 then
        begin
          NumberOfHits := 0;
          inc(BallSpeed);
        end;
      case BallDirection of
        bdLeftUP    : ShapeBall.SetBounds(ShapeBall.Left - (HorizontalValue + BallSpeed), ShapeBall.Top - (VerticalValue + BallSpeed), ShapeBall.Width, ShapeBall.Height);
        bdLeftDown  : ShapeBall.SetBounds(ShapeBall.Left - (HorizontalValue + BallSpeed), ShapeBall.Top + (VerticalValue + BallSpeed), ShapeBall.Width, ShapeBall.Height);
        bdRightUp   : ShapeBall.SetBounds(ShapeBall.Left + (HorizontalValue + BallSpeed), ShapeBall.Top - (VerticalValue + BallSpeed), ShapeBall.Width, ShapeBall.Height);
        bdRightDown : ShapeBall.SetBounds(ShapeBall.Left + (HorizontalValue + BallSpeed), ShapeBall.Top + (VerticalValue + BallSpeed), ShapeBall.Width, ShapeBall.Height);
      end;
      ShapeBall.UpDate;
      Sleep(GameSpeed);
      BallIsOut := (ShapeBall.Top >= (PanelGame.Height + ShapeBall.Height));
    end;
  showmessage('Ball is out...');
end;


{procedure TformMain.CheckTheWall(var NumberOfHits, HorizontalValue, VerticalValue: integer);
var
  I         : integer;
  DummyRect : TRect;
  Found     : boolean;
begin
  I     := 0;
  Found := FALSE;
  while not Found and (I < 160) do
    begin
      if Bricks[i].Visible then
        if InterSectRect(DummyRect, ShapeBall.BoundsRect, Bricks[i].BoundsRect) then
          begin
            Found := TRUE;

            Inc(NumberOfHits);
            case BallDirection of
              bdRightUp   : BallDirection := bdRightDown;
              bdLeftUp    : BallDirection := bdLeftDown;
              bdRightDown : BallDirection := bdRightUp;
              bdLeftDown  : BallDirection := bdLeftUp;
            end;

            if (ShapeBall.Left + (ShapeBall.Width div 2)) < (Bricks[i].Left + (Bricks[i].Width div 3)) then
              begin
                HorizontalValue := 2;
                VerticalValue   := 0;
              end;
            if ((ShapeBall.Left + (ShapeBall.Width div 2)) > (Bricks[i].Left + (Bricks[i].Width div 3))) and
               ((ShapeBall.Left + (ShapeBall.Width div 2)) < (Bricks[i].Left + ((Bricks[i].Width div 3) * 2))) then
              begin
                HorizontalValue := 0;
                VerticalValue   := 0;
              end;
            if (ShapeBall.Left + (ShapeBall.Width div 2)) > (Bricks[i].Left + ((Bricks[i].Width div 3) * 2)) then
              begin
                HorizontalValue := 0;
                VerticalValue   := 2;
              end;

            Bricks[i].FNumberOfHits  := Bricks[i].FNumberOfHits + 1;
            if Bricks[i].FNumberOfHits = Bricks[i].FTimesToHit then
              Bricks[i].Visible := FALSE;
          end;
      Inc(I);
    end;
end;   }


procedure TformMain.miTakeItEasyClick(Sender: TObject);
begin
  StartNewGame(1)
end;


procedure TformMain.miBringThemOnClick(Sender: TObject);
begin
    StartNewGame(2)
end;


procedure TformMain.miHurtMeClick(Sender: TObject);
begin
  StartNewGame(3);
end;


procedure TformMain.miFoolsPlayClick(Sender: TObject);
begin
  StartNewGame(4);
end;


procedure TformMain.FormShow(Sender: TObject);
begin
//  BuildTheWall;
end;


procedure TformMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I : integer;
begin
  for I := 0 to 160 do
    try
      Bricks[i].Free;
      Bricks[i] := NIL;
    except  
    end;
end;

procedure TformMain.miAboutClick(Sender: TObject);
begin
  MessageBox(Handle,
             PChar(''Powered by kash & Patrik for Mr. Zaiarnai'),
             PChar('Use the source, Luke'),
             MB_OK);
end;

procedure TformMain.miKeysClick(Sender: TObject);
begin
  MessageBox(Handle,
             PChar('Arrow keys : move your pallet' + #13 +
                   'End key    : Quit game rapidly and remove from screen.'),
             PChar('How to play...'),
             MB_OK);
end;

end.

И всё работает как надо. Там наверное ещё много чего не нужного, что можно убрать. Я просто не вникал.

p.s. Подсвиров ждёт нас после практики. :)

10

хрень кокаето!!!господа програмисты скиньте плиз программу просто летающего шарика!!!! а я сам ее доделаю!!!!
и желательно еще ссылку киньте где моно паскаль скачать!!!

11

программу, в которой по форме перемещается круг и отскакивает от краев формы? прислать тебе? есть сомнения что ты доделаешь... и очень большие... если хочешь - стучись в аську расскажу если че не понятно как делать

12

)) я асю твою не знаю!!!! и во вторых! мои умственные способности ты недооцениваешь!!!и в 3 да именно эта прога

13

погоди... ты хочешь в паскале мышь подключать?
я просто к тому что просто сделать летающий шарик- это 5-10 минут. а все остальное побольше...

Отредактировано DarthCaedius (2007-10-25 09:52:13)

14

PatriK написал(а):

срочняк нужно!!!от этой херни зависит наше место  в институте!!!!
ЗАярному!!!

Люди!!! Не смешите!! Заярному?!?!?!?
Не могу...))))

15

lampo4ka написал(а):

Люди!!! Не смешите!! Заярному?!?!?!?
Не могу...))))

Я думаю, что тебя никто и не пытался рассмешить.

PatriK написал(а):

хрень кокаето!!!

Почему хрень? Это то, что вы просили, всё работает. Если закомментировать всё как показанно то получается, как надо, только управление не мышкой а клавишами.

Я не конечно не программист, а учитель информатики, поэтому если меня за ниже приведённый код будут хаять и говорить что кодер из меня некудышный, я с вами спорить не буду. Но это то что попоросили:

PatriK написал(а):

скиньте плиз программу просто летающего шарика!!!!

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var x1,y1,x2,y2,h1,h2:integer;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Form1.Repaint;
  x1:=x1+h1;
  y1:=y1+h2;
  x2:=x2+h1;
  y2:=y2+h2;
  Form1.Canvas.Ellipse(x1,y1,x2,y2);
  Form1.Canvas.Brush.Color:=clred;

 //Условия отражения


 //Отражение от нижней границы
   if y2=Form1.ClientHeight
    then
    h2:=-h2;

 //Отражение от правой границы
   if x2=Form1.ClientWidth
    then
    h1:=-h1;

 //Отражение от верхней границы
   if y1=0
    then
    h2:=abs(h2);

 //Отражение от левой границы
   if x1=0
   then
    h1:=abs(h1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Начальные координаты
x1:=0;y1:=0;
x2:=20;y2:=20;
//Шаг в пикселях
h1:=1;h2:=1;
Form1.Timer1.Enabled:=true
end;

end.

Тут всё просто, только я думаю что это мало поможет. т.к. товарищ Заярный, будет вас просить всё реализовывать через классы, и реализация отскакивания шарика будет проще чем тут, но перед этим, надо будет описать класс точки и класс круга и все их методы.
А потом только делать всё что надо. Но просили именно отскакивание шарика, вот я вам и кинул.

16

мля сучий инет!!!Неработает когда надо!!!!
Лапочка и чо тут смешного?!?!или Заярный не препод?

17

Ну вот собственно то, что вам надо. Комменты до конца не расставил(может некоторые неверные), можете доплнить или поправить.

Код:
unit Krug;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TPosition = class(TObject) //Класс позиции, родитель TObject
     constructor CreateXY(IntX,IntY : Longint); //Конструтор класса с двумя параметрами позиции
     function GetX : longint; // Функции получения координат, они возвращают значение типа longint
     function GetY : longint; // значение должно присваиваться именам функций
   private
     Fx,Fy : longint;
  protected
  public
  published
end; //тут заканчивается описание членов класса TPosition


  TPnt = class(TPosition) //Класс для точки является дочерним классом TPosition
                            //это означает что это класс наследует все методы и
                            //свойства родителя, ниже будут объявленны его собственные
                            //члены
    function IsVis : boolean; //функция видимости точки, либо видно либо нет
    function GetColor : TColor;// функция возвращающая цвет
    procedure Show;//Показывает точку
    procedure Hide;//Прячет очку
    procedure Move(NewX,NewY : longint);// двигает точку в указанные,новые координаты
    Constructor CreatePXY(IntX,IntY : longint); //Конструктор для точки

  private
   FVis : boolean; //члены доступные только этому классу
   FColor : TColor;
  protected
  public
  published
end;

 TCircle = class(TPnt)   //Класс круга
      constructor CreateC(IntX, IntY, R: LongInt);//Конструктор для круга
                                                  // IntX, IntY, - координаты центра
                                                  // R=радиус
      function GetR: LongInt;//возвращает радиус круга
      procedure Show;//Показать круг
      procedure Hide;//спрятать круг
      procedure Move(NewX, NewY :LongInt); //передвигает центр круга в заданную точку
     private
      FR : LongInt;
    protected
    public
    published
  end;


  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
      { Public declarations }

 Pos:TPosition;
 Color1:TColor;
 Pnt:TPnt;
 Crc : TCircle;

 i,j,NTX,NTY,R:integer;
  end;

var
  Form1: TForm1;

implementation

uses Unit2;
{$R *.dfm}

//======= Раздел реализации методов и функций классов========
  //Класс TPosition

  function TPosition.GetX : longint;
   begin
   GetX:= self.Fx;
   end;
 function TPosition.GetY : longint;
  begin
  GetY:= self.Fy;
  end;

 constructor TPosition.CreateXY(IntX,IntY : longint);
   begin
    inherited Create; // конструктор родителя
   Fx:=IntX;
   Fy:=IntY;
   end;


  //Класс TPoint
      Constructor TPnt.CreatePXY(IntX,IntY : longint);
        begin
         inherited CreateXY(IntX,IntY); ////тут вызывается конструктор TPosition
         FColor :=$fff000;       //Цвет по умолчанию
        end;


      function TPnt.IsVis : boolean;
        begin
         IsVis:=FVis;
        end;

      function TPnt.GetColor : TColor;
        begin
         GetColor:=FColor;
        end;


      procedure TPnt.Show;
       var x : integer;CurCol:TColor;
        begin
          x:=-1;
         if (GetX<0) then exit;
         if (self.GetX = 0) then x:=1;
         CurCol := Form1.Canvas.Pen.Color; //Переменной присваиватеся текущий цвет формы
         Form1.Canvas.Pen.Color:= GetColor;
         FVis:=true;
         Form1.Canvas.MoveTo(self.GetX+x,self.GetY);//Виртуальный маркер устанавливается в
                                                      //точку сдвинутую вправо по оси Х на 1 пЫксель
         Form1.Canvas.LineTo(self.GetX,self.GetY);// Проводится пряма из виртуального маркера в эту точку
                                                  //  в данном случае это будет просто точка
         Form1.Canvas.Pen.Color:=CurCol;
        end;

       procedure TPnt.Hide;
         var x : integer;CurCol:TColor;
        begin
          x:=-1;
         if (GetX<0) then exit;
         if (self.GetX = 0) then x:=1;
         CurCol := Form1.Canvas.Pen.Color; //Переменной присваиватеся текущий цвет формы
         Form1.Canvas.Pen.Color:= Form1.Canvas.Brush.Color;
         FVis:=false;
         Form1.Canvas.MoveTo(self.GetX+x,self.GetY);
         Form1.Canvas.LineTo(self.GetX,self.GetY);
         Form1.Canvas.Pen.Color:=CurCol;
         //тут делается тоже самое, только нарисованная точка отрисовывается с цветом заливки, цветом формы,
         // но  это можно изменить
        end;


     procedure TPnt.Move(NewX, NewY : longint);
         begin
          Hide; //прячется старая точка
          self.Fx:=NewX; //переменным класса присваюватся новые значения
          self.Fy:=NewY;
          self.Show//отрисовывается новая точка
         end;


constructor TCircle.CreateC(IntX, IntY, R: LongInt);
begin
  inherited CreatePXY(IntX, IntY);
  self.FR := R;
end;

function TCircle.GetR: LongInt;
begin
  GetR := FR;
end;

procedure TCircle.Show;
var
  COld : TColor;
begin
  COld := Form1.Canvas.Pen.Color;//сохраняется текущий цвет в переменную
  FVis := True;
  Form1.Canvas.Pen.Color := Self.GetColor;  // присваивается lheujq wdtn
  Form1.Canvas.MoveTo( Self.GetX-FR, Self.GetY-FR);
  Form1.Canvas.Arc(Self.GetX-FR, Self.GetY-FR, Self.GetX+FR, Self.GetY+FR, 0, 0, 0, 0);
  Form1.Canvas.Pen.Color := COld;
end;

procedure TCircle.Hide;
var
  COld : TColor;
begin
  Cold := Form1.Canvas.Pen.Color;
  FVis := False;
  Form1.Canvas.Pen.Color := Form1.Canvas.Brush.Color ;
  Form1.Canvas.MoveTo( Self.GetX, Self.GetY);
  Form1.Canvas.Arc(Self.GetX-FR, Self.GetY-FR, Self.GetX+FR, Self.GetY+FR, 0, 0, 0, 0);
  Form1.Canvas.Pen.Color := Cold;
end;

procedure TCircle.Move(NewX, NewY :LongInt);
begin
  Hide;
  self.Fx := NewX;
  self.Fy := NewY;
  self.Show;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;j:=1; R:=40;
Crc := TCircle.CreateC(60, 60, R);
Crc.Show;
NTX:=50;//Начальные точки
NTY:=50;
Timer1.Enabled:=true
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Crc.Move(NTX,NTY);
NTX:=NTX+i;
NTY:=NTY+j;

  if (NTX>Form1.ClientWidth-40) then i:=-i;
  if (NTY=R)   then j:=-j;
  if (NTY>Form1.ClientHeight-40) then j:=-j;
  if (NTX=R) then i:=-i;

end;

end.

18

с меня пиво! или чай с беляшом))  (по желанию)!
биг спс...

19

Сдал??

20

PatriK написал(а):

с меня пиво! или чай с беляшом))  (по желанию)!
биг спс...

Пиво пьём массово)))

21

http://webfile.ru/1604782 - Треугольник серпинского

В программе шарика в процедурах
procedure TCircle.Hide;
procedure TCircle.Show;

ищешь вот эту строку
Form1.Canvas.Arc(Self.GetX-FR, Self.GetY-FR, Self.GetX+FR, Self.GetY+FR, 0, 0, 0, 0);
меняешь на
Form1.Canvas.Ellipse(Self.GetX-FR, Self.GetY-FR+20, Self.GetX+FR, Self.GetY+FR);

если к Self.GetY-FR+20 прибавляешь круг сплюснут относительно оси OY. будешь отнимать будет плющится относительно OX.
Обязательное условие - необходимо менять значения в обеих процедурах, иначе будет за собой хвостик таскать.