Страницы

четверг, 9 июня 2016 г.

Создание класса точки на плоскости (Pascal). Использование методов класса.

Описать класс tPoint, инкапсулирующий основные свойства и методы точки на плоскости. Создать массив из 100 точек. Нарисовать точки случайным образом случайным цветом на экране.
Сделать защиту полей класса (т.е. работать с полями в основной программе не напрямую, а используя соответствующие методы записи в поле и чтения из поля). Добавить методы движения точек: случайное движение, движение по нажатию клавиш со стрелками.
Это продолжение предыдущего поста.
Здесь тоже создаем класс точки с тремя полями – координаты х,у и цвет color. Поскольку напрямую обращаться к этим свойствам в данном задании нельзя, то нужно создать методы записи (set) и чтения (get) данных. Чтение данных организуем только для координат, это нужно для реализации движения массива точек. Для установки цвета создаем метод SetColor, а для получения не нужно, поскольку к значению этого свойства обращается метод этого же класса.
Кроме указанных методов нужны также методы вывода на экран (Draw), закрашивания (Hide), перемещения точки в новое положение (Move).
Для вывода на экран и закрашивания точки применяем процедуру из графического модуля putPixel(x,y,color). В первом случае используем цвет точки, во втором – цвет фона (GetBKColor).
Перемещение точки осуществляется так: сначала точка закрашивается цветом фона (Hide), затем устанавливаются ее новые координаты (определяемые отдельной процедурой в основной программе, об этом чуть дальше), затем точка рисуется своим цветом на новом месте.
После описания всех полей и методов класса создадим процедуру Coords для расчета новых координат при управлении клавишами. В зависимости от нажатой клавиши рассчитывается новая координата. Если рассчитанное значение превышает размер экрана по горизонтали или вертикали, то точка перемещается на другую сторону экрана.
В основной программе объявляем переменные, в том числе массив из 100 точек. Затем инициализируем графический режим. Если ошибок нет, то устанавливаем случайные значения координат и цвета для всех точек массива и выводим его на экран.
Затем идет основной цикл программы. Для этого включаем текстовый режим. У пользователя запрашивается вариант управления движения. И далее новые координаты определяются или случайно, или процедурой Coords с учетом нажатой клавиши.
Движение будет продолжаться, пока пользователь не нажмет Esc. Программа будет завершена или продолжена в зависимости от ответа пользователя на вопрос «Продолжить».
Далее текст программы с комментариями. Не забывайте переключать текстовый и графический режимы для вывода текста и графики соответственно.

PROGRAM LAB2;
Uses Crt,Graph;

const Path_of_driver='C:\TP7\BGI';
{описание класса точки}
Type
    tPoint = object
    x, y: integer;
    color: word;
{вывод на экран}
    procedure Draw;
{закрасить цветом фона}
    procedure Hide;
{перемещение точки}
    procedure Move(newX, newY:Integer);
{установка х}
    procedure setX(x0:Integer);
{установка у}
    procedure setY(y0:Integer);
{установка цвета}
    procedure setColor(color0 : Word);
{функции получения координат}
    function getX : Integer;
    function getY : Integer;
end;

procedure tPoint.setX(x0 : Integer);
begin
     x:=x0;
end;

procedure tPoint.setY(y0 : Integer);
begin
     y:=y0;
end;
procedure tPoint.setColor(color0 : Word);
begin
     color:=color0;
end;
function tPoint.getX;
begin
     getX:=x;
end;
function tPoint.getY;
begin
     getY:=y;
end;

procedure tPoint.Draw;
begin
     putPixel(x,y,color);
end;

procedure tPoint.Hide;
begin
     putPixel(x,y,GetBkColor);
end;
procedure tPoint.Move(newX, newY : Integer);
begin
     Hide;
     setX(newX);
     setY(newY);
     Draw;
end;
{процедура расчета новых координат по нажатой клавише}
Procedure Coords(a:char; var NewX,NewY:integer; h:integer);
begin
       case a of
           #80: begin
                  Inc(NewY,h); if NewY>GetMaxY-20 then NewY:=20;
                end;
           #75: begin
                  dec(NewX,h); if NewX<10 then NewX:=GetMaxX-10;
                end;
           #77: begin
                  inc(NewX,h); if NewX>GetMaxX-10 then NewX:=10;
                end;
           #72: begin
                  dec(NewY,h); if NewY<20 then NewY:=GetMaxY-20;
                end;
       end;
end;

var
   mas: array [1..100] of tPoint; {массив точек}
   gd,gm,NewX,NewY,i, h: integer;
   Q,a:char;
   str:string;
   NewColor : Word;

begin
     randomize;
{инициализация графического режима}
     gd:=Detect;
     InitGraph(gd,gm,Path_of_driver);
     if GraphResult<>grok then begin
         write('error:',GraphErrorMsg(GraphResult));
         halt;
     end;
{установка свойств всех точек в массиве – случайные значения}
     for i:=1 to 100 do
     begin
    NewX:=Random(GetMaxX);
   NewY:=Random(GetMaxY);
    NewColor:=Random(256);
        mas[i].setX( NewX);
        mas[i].setY(NewY);
        mas[i].setColor(NewColor);
mas[i].Draw;
     end;
     h:=50; {расстояние, на которое перемещается точка}
     RestoreCrtMode; {текстовый режим}
     Q:='y';
     While  Q<>'n' do begin
         write('Выберите режим движения точек: 1 (случайное движение)');
         write (' 2 (движение по стрелкам клавиатуры):  ');
         readln(str); {пользователь вводит символ}
{случайное движение}
         if str='1' then
         begin
             SetGraphMode(gm);
             repeat
                   for i:=1 to 100 do
                   begin
{новые случайные координаты}
                         NewX:=Random(GetMaxX);
                        NewY:=Random(GetMaxY);
                        mas[i].Move(NewX,NewY);
                   end;
                   delay(10000); {задержка}
             until keypressed; {пока не нажата клавиша}
         end
         else
{движение по стрелкам}
         begin
              writeln('Нажмите  Enter');
              writeln('Управляйте движением точек с помощью стрелок клавиатуры');
              readln;
              SetGraphMode(gm);
{вывод массива точек}
              for i:=1 to 100 do
                  mas[i].Draw;
              repeat
                    a:=readkey;
                    for i:=1 to 100 do
                    begin
            {получаем текущие координаты}
                        newX:=mas[i].getX;
                        newY:=mas[i].getY;
            {новые координаты, куда передвинется точка}
                        Coords(a,NewX,NewY,h);
            {передвижение точки}
                        mas[i].Move(NewX,NewY);
                    end;
              until a=#27; {пока не нажата escape}
         end;
         RestoreCrtMode;
         write('Продолжить? (y/n) ');
         readln(Q);
     end;
  closegraph;
  clrscr;
  end.