Помощь - Поиск - Пользователи - Календарь
Полная версия: Турбо Паскаль и его объектно ориентированные средства
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dron4ik
Снова я( я всем наверно надоел(со своими темами)

Есть код проги которая гоняет точку и окружность по экрану случайным образом...до нажатия какой-либо клавиши...не могли вы бы мне помочь ее как то усложнить? К примеру.. Можно изменить цвет окружности и точку(точку вобще хотелось поменять на другую фигуру на пример квадрат который крутится) Менять радиус окружности вообщем размеры фигур(любые действия над фигурами) или поворачивать фигуры против часовой стрелки и наоборот---- и это все может менять пользователь при помощи нажатия какой либо клавиши или меню Программа сделана на принципе модульного программирования!

Создадим модуль графических объектов GraphObj.
 Unit GraphObj; {Модуль графических объектов}
     INTERFACE {Интерфейсная часть}
     Type
         PLocation = ^TLocation;
         TLocation = object
             X,Y: Word; {Координаты позиции на экране}
             Constructor Init(InitX, InitY: Word);
                 {Инициализация объекта}
             Function GetX: Word; {Возвращает координату Х}
             Function GetY: Word; {Возвращает координату Y}
             Procedure GetCoords(Var CoordX, CoordY: Word);
                 {Возвращает обе координаты}
             Destructor Done; virtual; {Уничтожает объект}
         End;
         PPoint = ^TPoint;
         TPoint = object(TLocation)
             Clr: Byte; {Цвет}
             Visib: Boolean; {Видимость}
             Constructor Init(InitX,InitY:Word; InitColor:Byte);
             {Переопределяем метод инициализации-добавляем цвет}
             Function GetColor: Byte; {Возвращает цвет}
             Procedure Show; virtual;
             Procedure Hide; virtual;
             Function IsVisib: Boolean;
             Procedure ChangeColor(NewColor:Byte);{Меняет цвет}
             Procedure MoveTo(NewX, NewY: Word);
             {Перемещает в новую позицию}
             Destructor Done; virtual;
         end;
         PCircle = ^TCircle;
         TCircle = object(TPoint)
             R: Word; {Радиус} 
             Constructor Init(InitX,InitY,InitR:Word;InitC:Byte);
             Procedure Show; virtual;
             Procedure Hide; virtual;
             Destructor Done; virtual;
         end;        
     IMPLEMENTATION {Раздел реализации}
     Uses Graph; {Подключаем графическую библиотеку}
     Constructor TLocation.Init;
     Begin
        X := InitX;
        Y := InitY
     end;
     Function TLocation.GetX: Word;
     begin
         GetX := X
     end;
     Function TLocation.GetY: Word;
     begin
         GetY := Y
     end;
     Procedure TLocation.GetCoords;
     begin
         CoordX := GetX;
         CoordY := GetY
     end;
     Destructor TLocation.Done;
     begin
     end;
     Constructor TPoint.Init;
     begin
     inherited Init(InitX, InitY);
         Clr := InitColor;
         Visib := False
     end;
     Function TPoint.GetColor: Byte;
     begin
         GetColor := Clr
     end;
     Procedure TPoint.Show;
     begin
         PutPixel(X, Y, Clr);
         Visib := True
     end;
     Procedure TPoint.Hide;
     begin
         PutPixel(X, Y, GetBkColor);
         Visib := False
     end;
     Function TPoint.IsVisib: Boolean;
     begin
         IsVisib := Visib
     end;
     Procedure TPoint.ChangeColor;
     begin
         Clr := NewColor;
         If IsVisib then Show
     end;
     Procedure TPoint.MoveTo;
     Var St: Boolean;
     begin
         St := IsVisib;
         Hide;
         X := NewX;
         Y := NewY;
         If St then Show
     end;
     Destructor TPoint.Done;
     begin
         Hide;
         Clr := GetBkColor
     end;
     Constructor TCircle.Init;
     begin
         inherited Init(InitX, InitY, InitC);
         R := InitR
     end;
     Procedure TCircle.Show;
     begin
         SetColor(Clr);
         Circle(X, Y, R);
         Visib := True
     end;
     Procedure TCircle.Hide;
     begin
         SetColor(GetBkColor);
         Circle(X, Y, R);
         Visib := False
     end;
     Destructor TCircle.Done;
     begin
         inherited Done;
         R := 0
     end;
     {Пустая секция инициализации}
     END.



Основной код проги к которому привязан графический модуль:

В приложении будут созданы экземпляры объектов TPoint и TCircle, причем экземпляр объекта TPoint мы разместим в области динамической памяти.
Program AppExample;
     Uses Graph, CRT, GraphObj;
     Type
         TApplication = object
             Procedure Init;
             Procedure Run;
             Procedure Done;
         end;
     Var
        Application: TApplication;
        p: PPoint;
        c: TCircle;
        
     Procedure TApplication.Init;
     Var
        D, R, MaxX, MaxY: Integer;
     Begin
     {Инициализация графического режима}
         D := Detect;
         InitGraph(D, R, 'C:\B\BGI');
         SetBkColor(White); 
         ClearDevice;
             {Создаем точку и окружность}
         MaxX := GetMaxX;
         MaxY := GetMaxY;
         Randomize;
         New(p,Init(Random(MaxX), Random(MaxY),Red));
         p^.Show;
         c.Init(Random(MaxX-40)+20,Random(MaxY-40)+20,20,Blue);
         c.Show
     End;
     Procedure TApplication.Run;
     Var
        MaxX, MaxY: Integer;
     Begin
         MaxX := GetMaxX;
         MaxY := GetMaxY;
         Repeat
             p^.MoveTo(Random(MaxX),Random(MaxY));
             c.MoveTo(Random(MaxX-40)+20,Random(MaxY-40)+20);
             Delay(4000)
         Until KeyPressed
     End;
     Procedure TApplication.Done;
     Begin
         Dispose(p,Done);
         c.Done;
         CloseGraph
     End;
     BEGIN
         Application.Init;
         Application.Run;
         Application.Done
     END.
Lapp
 ! 
dron4ik, почему тема про Турбо Паскаль в разделе Другие Языки?? Ты забыл, на какой форум зашел?? В следующий раз буду штрафовать за такое издевательство..
Тема перенесена



Цитата(dron4ik @ 9.05.2009 23:47) *
не могли вы бы мне помочь ее как то усложнить? К примеру..
Запросто. Скажи, в чем затруднение - мы поможем.
volvo
Цитата
Программа сделана на принципе модульного программирования!
Программа неправильно написана с использованием ООП, это все, что я могу тебе сказать. Окружность не является подвидом Точки, чтоб от нее наследоваться. А если тебе понадобится теперь ввести в иерархию еще и Квадрат, от чего ты его будешь наследовать, от Окружности что-ли? Скорее, и Точка и Окружность, и Квадрат являются подвидами какой-то абстрактной Фигуры, что могло бы быть описано так:

type
  TFigure = object
    { ... }
  end;

  TPoint = object(TFigure)
    { ... }
  end;
  TCircle = object(TFigure)
    { ... }
  end;
  { Ну, и остальное, что тебе может понадобиться }
Кроме всего прочего это позволит минимизировать количество вносимых изменений при добавлении объектов в иерархию наследования. Так что, прежде чем усложнять, надо сделать правильно, а то потом эту "усложненную" версию придется переписывать с нуля, чтоб она заработала.
dron4ik
Извините а куда перенесена тема?( В какой раздел?(

Добавлено через 4 мин.
А что мне теерь делать? Как ее изменить?(я профан по ООП)
Lapp
Цитата(dron4ik @ 10.05.2009 9:47) *
Извините а куда перенесена тема?( В какой раздел?(
А посмотреть строку навигации Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи пока ты писал этот мессадж было трудно?
dron4ik
Я иммею ввиду задачу.

Добавлено через 4 мин.
От какой фигуры они могут наследоваться(квадрат, окружность, и точка) По сути мне можно сделать тему курсовой любую можно взять, кроме программ написанных по принципу процедурного программирования(
dron4ik
У меня есть другая программа написанная на СИ++ . Она находит кратчайший путь между двумя любымми вершинамми графа.т.е пользователь вводит количество вершин потом вводит вес ребер(их длину между раз-ными вершинами)потом пользователь вводит две вершины между которыми он должен найти кратчайшиий путь... потом прога выводит длинну кратчайшего пути. Может она прапвильно выполнена с использованием ООП?т.е. абстрактной фигурой является граф.. на графе вершины(точки) и ребра т.е. точки и ребра являются подвидами графа.
Lapp
Цитата(dron4ik @ 10.05.2009 9:53) *
От какой фигуры они могут наследоваться(квадрат, окружность, и точка)
Тебе же это явно написал volvo. Зачем спрашивать то, на что уже отвечено?
dron4ik
У меня есть другая программа написанная на СИ++ . Она находит кратчайший путь между двумя любымми вершинамми графа.т.е пользователь вводит количество вершин потом вводит вес ребер(их длину между раз-ными вершинами)потом пользователь вводит две вершины между которыми он должен найти кратчайшиий путь... потом прога выводит длинну кратчайшего пути. Может она прапвильно выполнена с использованием ООП?т.е. абстрактной фигурой является граф.. на графе вершины(точки) и ребра т.е. точки и ребра являются подвидами графа.

Lapp
Цитата(dron4ik @ 10.05.2009 10:42) *
У меня есть другая программа написанная на СИ++
Ну и зачем дублировать мессаджи? Типа погромче прокричать? Оба эти мессаджа - чистый флуд. Задаешь влпросы про программу - слушай ответы и внимай им. Никого тут не интересуют твои курсовые. Спрашиваешь по программированию - пожалуйста. А подбирать тебе программу, чтобы ты свалил курсовик - уволь. Сам признаешь, что "профан в ООП". Хочешь научиться - милости просим, только слушай. Хочешь свалить курсовик - не по адресу..

Еще один флуд типа "а может там правильно" - закрываю тему.
dron4ik
Извините( Мне просто не с кем посоветоваться(

Добавлено через 3 мин.
Является ли вершины и ребра подклассами или подвидами графа?
volvo
Цитата
Является ли вершины и ребра подклассами или подвидами графа?
Вершины и ребра - отдельные классы, не являющиеся подвидами графа. Они составляют граф (т.к. граф состоит из вершин и ребер). Следовательно, здесь есть агрегация - в класс Граф включены переменные классов Вершина и Ребро - (отношение "имеет"), но не наследование (которое определяло бы отношение "является подвидом").
dron4ik
Т.е есть программа написанная по такому принципу не является Обьектно Ориентированной?
volvo
Программа написанная по КАКОМУ принципу? Где
Цитата
точки и ребра являются подвидами графа
? Объектно-ориентированной может и является. Но она в первую очередь не является правильной. По какому принципу она написана - это уже дело десятое.
dron4ik
Мне вообщем нужно чтобы прога была написана по ООП. Главное чтобы она не была написана процедурным программированием. Прога готова могу выложить код.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.