Помощь - Поиск - Пользователи - Календарь
Полная версия: Немогу закончить задачу на ООП
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Skif_04
Народ, помогите плиз закончить задачу на ООП...
Вот то, что я набросал

program Lr18_1;
{Программа, демонстрирующая использование графических объектов}
uses
 Crt, Graph;
type
 PGraphObject=^TGraphObject;
 TGraphObject=object {базовый объект}
         Active: Boolean; {признак видимости объекта}
         x,y: Integer; {координаты объекта}
         Color: Integer; {цвет объекта}
         constructor Init; {конструктор объекта}
         destructor Done;virtual; {деструктор}

         procedure Locate (Nx,Ny:Integer); {задание коорди-нат}
         procedure Step (Dx,Dy:Integer); {сдвиг объекта}
         procedure Move; {хаотичное движение}

         procedure Show; {отобразить объект на экране}
         
         procedure Hide; {скрыть объект}

         procedure Paint;virtual; {процедура рисования объекта}
         procedure Clear;virtual; {процедура стирания объекта}
 end;
 PPoint=^TPoint;
 TPoint=object(TGraphObject) {точка}
  {Задание координат и цвета точки}
         constructor InitData(Nx,Ny,c:Integer);
         procedure Paint;virtual;
         procedure Clear;virtual;
 end;

 PRectangle=^TRectangle;
 TRectangle=object(TGraphObject) {прямоугольник}
         Width,Heigh:Integer; {ширина и высота прямоугольника}

  {Задание координат, размеров и цвета прямоугольника}
         constructor InitData(Nx,Ny,W,H,c:Integer);
         procedure Paint;virtual;
         procedure Clear;virtual;
 end;

  constructor TGraphObject.Init;
  begin
    Active:=False; {изначально объект невидим}
  end;
  destructor TGraphObject.Done;
  begin
   Hide; {перед уничтожением сотрем объект с эк-рана}
  end;

  procedure TGraphObject.Locate;
  begin
    Hide; {скроем объект}
    x:=Nx; {зададим новые координаты}
    y:=Ny;
    Show; {отобразим на новом месте}
  end;

  procedure TGraphObject.Step;
  begin
      Hide; {скроем объект}
      x:=x+Dx; {переместим объект}
      y:=y+Dy;
      Show; {отобразим на новом месте}
  end;

  procedure TGraphObject.Move;
  begin
    Step(Random(5)-2,Random(5)-2); {шагнем случайным образом}
  end;

  procedure TGraphObject.Show;
  begin
    if not Active then {если объект невидим, то...}
   begin
    Active:=True; {установим флажок видимости}
    Paint; {нарисуем объект}
   end;
  end;

  procedure TGraphObject.Hide;
  begin
   if Active then {если объект видим, то...}
   begin
    Active:=False; {сбросим флажок видимости}
    Clear; {сотрем объект}
   end;
  end;

  procedure TGraphObject.Paint;
   begin
   end;

  procedure TGraphObject.Clear;
   begin
   end;

  constructor TPoint.InitData;
  begin
    inherited Init; {инициализация унаследованных полей}
    x:=Nx; {установим координаты}
    y:=Ny;
    Color:=c; {зададим цвет}
  end;

  procedure TPoint.Paint;
  begin
   PutPixel(x,y,Color);
  end;

  procedure TPoint.Clear;
  begin
   PutPixel(x,y,0);
  end;

  constructor TRectangle.InitData;
  begin
    inherited Init;
    x:=Nx;
    y:=Ny;
    Width:=W;
    Heigh:=H;
    Color:=c;
  end;

  procedure TRectangle.Paint;
   var
   i,j:Integer;
  begin
   i:=Width Div 2;
   j:=Heigh Div 2;
   SetColor(Color);
   Rectangle(x-i,y-j,x+i,y+j);
  end;

  procedure TRectangle.Clear;
   var
   i,j:Integer;
  begin
   i:=Width Div 2;
   j:=Heigh Div 2;
   SetColor(0);
   Rectangle(x-i,y-j,x+i,y+j);
  end;

   {Переход в графический режим}
   procedure InitVideo;
    var
     grDriver,grMode:Integer;
   begin
     grDriver:=Detect;
     InitGraph(grDriver,grMode,'');
     if GraphResult<>grOk then
     begin
     Writeln('Ошибка при инициализации графики !');
     Halt(1);
     end;
   end;

    {Возврат в текстовый режим}
    procedure DoneVideo;
    begin
     CloseGraph;
    end;

   var
   a:array[1..150] of PGraphObject; {массив произвольных объектов}
    i:Integer;
   begin
    ClrScr; {Переход в графический режим}
    InitVideo;
    {Инициализируем генератор случайных чисел}
    Randomize;
   {Создаем 150 графических объектов}
   for i:=1 to 150 do
    case Random(2) of
     0:{Точку} a[i]:=New(PPoint,InitData(
                 20+Random(600), 20+Random(440), {координаты}
                 1+Random(14))); {цвет}
     1:{создаем прямоугольник}
       a[i]:=New(PRectangle,InitData(
                 20+Random(600), 20+Random(440), {координаты}
                 3+Random(5), 3+Random(5), {размеры}
                 1+Random(14))); {цвет}
    end;
   while not KeyPressed do
    for i:=1 to 150 do
     a[i]^.Move; {Хаотично перемещаем объект}
   ReadKey;
    {Уничтожаем объект}
    for i:=1 to 150 do
    Dispose (a[i],Done);
    {Возвращаемся в текстовый режим}
    DoneVideo;
   end.


Сюда надо еще добавить возможность изменения размерв обьектов и прога должна продимонстрировать процесс надувания воздушного шарика...
volvo
Цитата
Сюда надо еще добавить возможность изменения размерв обьектов
Так в чем проблема? Один из вариантов - добавляй в иерархию после TGraphObject еще тип TResizable (не все объекты могут менять размер, скажем точка - она и есть точка, а вот все, что будет наследоваться от TResizable - сможет менять размер), и определяй для него методы, меняющие размер объекта и поля, этот размер хранящие...

Цитата
и прога должна продимонстрировать процесс надувания воздушного шарика...
Собственно, какого типа должен быть воздушный шарик, TPoint или TRectangle? smile.gif Опиши еще одну фигуру - наследницу TResizable (TCircle или TEllipse), и "надувай" его сколько хочешь...
Skif_04
Цитата(volvo @ 25.05.2009 22:15) *

Так в чем проблема? Один из вариантов - добавляй в иерархию после TGraphObject еще тип TResizable (не все объекты могут менять размер, скажем точка - она и есть точка, а вот все, что будет наследоваться от TResizable - сможет менять размер), и определяй для него методы, меняющие размер объекта и поля, этот размер хранящие...


Так это получается, что Прямоугольник и Круг мне надо будет теерь наследовать от TResizable, а TGraphObject исключительно для точки?(если не трудно хотелось бы увидеть пример)

Цитата(volvo @ 25.05.2009 22:15) *
Собственно, какого типа должен быть воздушный шарик, TPoint или TRectangle? smile.gif Опиши еще одну фигуру - наследницу TResizable (TCircle или TEllipse), и "надувай" его сколько хочешь...


Воздушный шар устроит любого "округлого" типа smile.gif ...эти две вещи я хоть убей, не могу сделать...если есть возможность, набросайте примерчик
volvo
Ну, вот я добавил кое-что:
Нажмите для просмотра прикрепленного файла

Тестируй, должно работать... Единственное, что - добавь там задержку в основном цикле, и тогда уж увеличивай коэффициент, передаваемый factorSize, иначе ты не успеешь моргнуть, как программа вылетит из-за переполнения типа Integer, у тебя ж многие тысячи итераций в секунду происходят. То же самое касается и увеличения Sphere, тоже внутри цикла надо добавить задержку (Delay какой-нибудь, подбери, чтоб было видно увеличение размера, и можно было отреагировать нажатием клавиши и остановить этот процесс), иначе будет вылет по той же причине...

Но твою программу надо еще дорабатывать, ты делаешь довольно много лишнего. К примеру, у тебя в каждом типе в иерархии есть X, Y, Color, зачем ты делаешь в каждом конструкторе присваивание им значений? Возложи это на конструктор базового класса... Графика у тебя не связана никак с объектами, это тоже не очень хорошо. Мог бы сделать объект, скажем, TGraphix, который бы создавался при старте программы, и при его создании инициализировался бы графический режим, а при удалении - закрывался...
Skif_04
Отлично! Спасибо огромное!!!!!!!! В моем исходнике было дествительно много...но ведь нет предела совершенству...да, можно было бы ее конечно улучшить, но банально нет времени...в среду надо сдать ее+курсач...поэтому тут все в режиме "работает и слава Богу"... единственный вопрос на последок, как можно закрасить рисуемую окружность...я так понимаю, что процедуры типа FloodFill тут не прокатят?
volvo
Зачем же FloodFill, если можно рисовать уже закрашенную окружность:

procedure tcircle.Paint;
begin
  setfillstyle(solidfill, color);
  fillellipse(CX, CY, R, R);
end;
procedure tcircle.Clear;
begin
  setfillstyle(solidfill, getbkcolor);
  fillellipse(CX, CY, R + 2, R + 2); { !!! }
end;

(я всегда при затирании объекта делаю это "с запасом", чтоб лишнего ничего не оставалось на экране)
Skif_04
Прекрасно работает. Огромнейшое спасибо за помощь!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.