Создать видимость движения на экране можно двумя способами. Первый способ заключается в том, что имитация движения объекта на экране создаётся за счёт многократного выполнения программой напора действий:
нарисовать — пауза — стереть рисунок (нарисовать его в том же месте цветом фона)— изменить координаты изображения.
Перед началом составления программы надо продумать описание «движущегося» объекта; характер изменения координат, определяющих текущее положение объекта; диапазон изменения и шаг.
Второй способ имитации движения рисунка или его части состоит и его запоминании в отдельной области оперативной памяти с тем, чтобы в дальнейшем быстро восстановить это изображение в другом месте экрана.
Для хранения фрагмента удобнее всего использовать динамическую область памяти. Получить размер памяти в байтах, необходимой для сохранения образа фрагмента, позволяет функция ImageSize(X1,Yl,X2,Y2:integer): word. Здесь (X1,YI) и (X2,Y2) — координаты верхнего левого и нижнего правого углов прямоугольника. Если полученный размер памяти больше 64Кб, то значение ImageSize = 0, a GraphResult=-1. Чтобы этого избежать, следует сохранять изображение по частям.
Полученный с помощью функции ImageSize размер памяти применяют в качестве входной информации для процедуры GetMem(p,Size), которая выделяет указанный объем памяти в динамической области. Здесь р — указатель на область памяти, Size — ее размер.
Процедура GetImage(Xl,Yl,X2,Y2:integer; var BitMap: word); сохраняет образ фрагмента в памяти, где XI,Y1,X2,Y2 — координаты фрагмента, BitMap — переменная, которая указывает, где сохраняется образ изображения.
Процедура Putlmage(X,Y: integer; var BitMap, Mo-de:word); восстанавливает сохраненный в буфере Bit-Map прямоугольник, левый верхний угол которого задаётся координатами (X,Y). Параметр Mode задает режим вывода изображения.
Продемонстрируем имитацию движения с использованием выше описанных процедур при решении следующей задачи.
Заключение
В данной работе описываются различные процедуры и функции, предназначенные для создания графических объектов в Турбо Паскаль.
Используя выше перечисленные процедуры и функции, я научился изображать различные фигуры различных форм и размеров, так же смог показать движение фигуры.
Написав данную работу, я получил навык работы в графической среде Турбо Паскаль, научился правильно применять разные процедуры и функции, точно определять и задавать координаты различных линий, эллипсов, окружностей, прямоугольников и т.д.
Писать программы не легко, но и не очень трудно.
Представьте себе почти готовую программу, где, скажем, порядка 10 тысяч команд, которая почему-то не желает работать. Компьютер пишет «ошибка», «ошибка», и чтобы понять, в чем она заключается, нужно поставить себя на место компьютера и в голове мысленно прокрутить всю программу за него.
Мне есть ещё над чем работать. Но думаю, моя работа вам понравилась, ведь создавая его, мы с руководителем пытались заинтересовать и новичка, и профессионала.
Я считаю, что программисты – элита «компьютерщиков», они решают самые трудные задачи. Настоящие программисты, умеющие написать программу от начала и до конца, очень редки и ценятся на вес золота. Чтобы стать таким профессионалом, нужно обладать особым складом ума.
Обычно человек мыслит приблизительными категориями, а язык программирования, даже самый простой, никакой приблизительности не терпит. Компьютеру нужно «говорить» абсолютно четко, по пунктам. Если хотя бы одно место прописано недостаточно четко, компьютер остановится и выдаст ошибку.
Если Вы действительно хотите научиться программировать, то из своего опыта скажу, что достаточно изучить один базовый язык программирования и Вы сможете освоить и другие языки программирования без особых проблем, так как нужно понять основные принципы программирования, а затем уже переходить на изучение того языка, который Вы захотите еще освоить.
Выбирайте эту сферу, если Вы:
– Любите информатику
– Обладаете техническим складом ума
– Внимательны, собранны
– Готовы решать сложные технические задачи
Успехов вам в изучении Паскаля.
Удовольствие, доставляемое успехом, всегда соразмерно труду, которого он стоил.
Литература
1.Павловский А.И. и др. Информатика: Учебное пособие для 10-ого кл. с углубленным изучением информатики с русским языком обучения/ А.И. Павловский, А.Е. Пупцев, П.Л. Гращенко.- Мн.: Нар. асвета, 2000.-223 с.: ил.
2.Павловский А.И. и др. Информатика: Учебное пособие для 11-ого кл. с углубленным изучением информатики с русским языком обучения/ А.И. Павловский, А.Е. Пупцев, Е.В. Нашкевич, Н.Н. Нарейко.- Мн.: Нар. асвета, 2000.-302 с.: ил.
3.Меженный О.А. М43 Turbo Pascal. Самоучитель.-М.: Издательский дом "Вильямс", 2004.-336с.: ил.
4.Абрамов С.А., Зима Е.В. Начало информатики.-М.: Наука. Гл. ред. физ.-мат. лит., 1989.-256с.
5.Абрамов С.А., Зима Е.В. Начало программирования на языке паскаль.-М.: Наука. Гл. ред. физ.-мат. лит., 1987.-112с.
6. И. Семакин, Л. Залогова, С. Русаков, Л. Шестакова. Информатика. Базовый курс. 9 класс.
7. http://saassl.at.tut.by/Grafika_Pascal/index16.htm
8. http://www.osnpas.com/
9. http://www.interface.ru/home.asp?artId=2962
10. http://www.welikeit.ru/pascal-graficavturbo.html
Приложение
Примеры графики в Турбо Паскаль
Пример.
Uses Graph;
Var Driver, Mode: integer;
Procedure GrInit;
Begin
Driver:= Detect; {автораспознавание драйвера}
InitGraph (Driver, Mode,'');
If GraphResult<>0 then
Begin
Writeln ('Ошибка инициализации!');
Writeln ('Работа программы прервана');
Halt (1) {остановить выполнение программы с кодом завершения — 1}
End
End;
Begin
GrInit; {графические действия}
Readln;
CloseGraph
End.
Пример "Будильник".
Program Budil;
uses graph;
var grDriver:integer; grMode:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMode,''); {Смена цвета фона}
SetBkColor(14); {Смена цвета линии}
SetColor(5); {Рисование окружности}
Circle(250,180,60);
Circle(270,180,60);
Circle(210,235,7);
Circle(310,235,7);
Circle(260,180,7);
Circle(260,115,10);
SetColor(9); {Рисование линии}
Line(260,180,260,140);
Line(260,180,270,150);
Circle(260,230,5);
Circle(260,125,5);
Circle(230,180,5);
Circle(290,180,5);
readln;
End.
Пример Elka.
program elka;
uses graph;
var
grDriver:integer;
grMode:integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
setbkcolor (14);
SetColor(0);
lineTo(100,250);
SetColor(6);
lineTo(100,275);
lineTo(150,275);
lineTo(150,250);
SetColor(2);
line(125,25,75,100);
line(75,100,175,100);
line(175,100,125,25);
line(125,100,50,175);
line(50,175,200,175);
line(200,175,125,100);
line(125,175,25,250);
line(25,250,225,250);
line(225,250,125,175);
readln;
end.
Пример Dom.
program dom;
uses graph;
var
grDriver:integer;
grMode:integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
{Смена цвета фона}
setbkcolor (14);
{Смена цвета линии}
SetColor(5);
{Рисование прямоугольников}
rectangle(25,75,100,150);
rectangle(100,75,225,150);
rectangle(50,100,75,150);
rectangle(150,100,175,125);
{Рисование линий}
line(25,75,75,25);
line(75,25,100,75);
line(200,25,225,75);
line(75,25,200,25);
readln;
end.
Пример Машина_2.
PROGRAM MASHINA;
Uses graph;
Var
grdriver:integer;
grmode:integer;
begin;
grdriver:=detect;
Initgraph(grdriver,grmode,'c');
rectangle(120,90,160,120);
setcolor(7);
rectangle(160,120,240,160);
setcolor(8);
line(120,120,70,120);
line(70,120,80,160);
line(80,160,160,160);
setcolor(2);
circle(110,160,25);
setcolor(5);
circle(200,160,25);
setcolor(5);
line(50,80,20,120);
line(20,120,80,120);
line(80,120,50,80);
line(50,120,20,160);
line(20,160,80,160);
line(80,160,50,120);
readln
End.
Пример Снеговики.
program snegoviki;
uses graph;
var
i,j,x,y:integer;
grdriver:integer;
grmode:integer;
begin
grdriver:=detect;
initgraph(grdriver,grmode,'c');
x:=50;y:=30;
for i:=1 to 10 do
begin
for j:=1 to 10 do
begin
setcolor(blue);
circle(x,y,10);
circle(x,y+30,20);
circle(x,y+80,30);
circle(x-30,y+30,10);
circle(x+30,y+30,10);
setcolor(5);
line(x,y-5,x+15,y);
line(x,y+5,x+15,y);
setcolor(white);
line(x-5,y+5,x+5,y+5);
putpixel(x-5,y-5,white);
putpixel(x+5,y-5,white);
putpixel(x,y+20,white);
putpixel(x,y+30,white);
putpixel(x,y+40,white);
putpixel(x,y+60,white);
putpixel(x,y+70,white);
putpixel(x,y+80,white);
putpixel(x,y+90,white);
putpixel(x,y+100,white);
setcolor(3);
line(x-5,y-10,x+5,y-10);
line(x+5,y-10,x,y-20);
line(x,y-20,x-5,y-10);
x:=x+90;
end;
y:=y+160;x:=50;
end;
readln
end.
Пример машина. Организовать имитацию движения автомобиля по экрану компьютера.
Uses crt,Graph;
Var u,gm,gd: integer;
BEGIN
gd:= detect;
initgraph(gd,gm,'');
if graphresult<>0 then halt (1);
setviewport(1,1,600,450,true);
setbkcolor(lightgray);
setcolor(brown);
line(1,401,700,401); {нарисуем дорогу}
u:= 1;
while u<=600 do begin setcolor(darkgray);
rectangle(40 + u,315,90+u,350); {кабина машины}
setfillstyle(1,darkgray);
bar(5 + u,350,120+u,390); {кузов машины}
setfillstyle(1, yellow); setcolor(yellow);
line(121 + u,360,160 + u,400); {свет от}
line(160 + u,400,200 + u,400);
line(200 + u,400,121 + u,360); {фар }
floodfill(180 + u,399,yellow);
pieslice(40 + u,385,0,360,15); { }
pieslice(90 + u,385,0,360,15); delay(5000);
setfillstyle(1,lightgray);
bar(5+u,300,210 + u,400); {очистка места расположения машины}
u:=u+3 end; readln; closegraph END.
Пример башня
Построить на экране компьютера башню, имитируя процесс ее построения снизу вверх.
Uses crt, Graph;
Var P:pointer;{указатель на область}
Size:Word; {размер области}
X1,Y1:Word; {координаты начальной точки}
gd,gm: integer;
Begin gd:=detect;
InitGraph(gd,gm,'');
IF GraphResult<>0 THEN Halt(1);
SetViewPort(0,0,640,80,TRUE);
ClearViewPort;
SetBkColor(black);
SetColor(yellow);
SetLineStyle(0,1,Thickwidth);
Rectangle(120,400,200,440); {рисуем первый кирпич}
Size:=ImageSize(120,400,200,440); {определяем размер области}
GetMem(p,Size); {выделяем память для области}
GetImage(120,400,200,440,P^); {сохраняем область в памяти}
Y1:=440;
WHILE Y1>=40 DO begin X1:= 120;
begin PutImage(X1,Y1,p^,CopyPut); {строим башню}
Delay(59000);
X1:=X1+80
end;
Y1:=Y1-40 end; x1:=x1-160;WHILE X1<=280 DO {строим верх башни}
begin
PutImage(X1,Y1,p^,CopyPut);
{CopyPut = 0 - режим копирования изображений}
X1:=X1 +160
end;
setfillstyle(8,red);
Bar(200,40,280,500); {строим стены башни}
Bar(40,40,120,500);
{Добавляем надпись}
SetColor(11);SETTEXTSTYLE(6,7,6);
outtextxy(350,100,'BASHNYA!');
Readln;
CloseGraph
End.
ГРИБ
Program GRIB
Uses crt, Graph;
Var P:pointer;
Size:Word;
X1,Y1:Word; gd,gm: integer;
Begin gd:=detect;
InitGraph(gd,gm,'');
SetColor(15);
rectangle(100,125,150,250);
SetColor(6);
line(25,125,125,50);
line(125,50,225,125);
line(225,125,25,125);
SetColor(2);
line(100,250,50,200);
line(50,250,50,200);
line(50,250,100,250);
line(150,250,200,200);
line(200,200,200,250);
line(200,250,150,250);
SetColor(11);SETTEXTSTYLE(7,0,6);
outtextxy(300,300,'GRIB');
Readln;
CloseGraph End.
НАДПИСЬ
Program Privet
Uses crt, Graph;
Var P:pointer;
Size:Word;
X1,Y1:Word;
gd,gm: integer;
Begin gd:=detect;
InitGraph(gd,gm,'');
SetColor(11);SETTEXTSTYLE(4,0,7);
outtextxy(20,200,'My name is Denis!');
Readln;
CloseGraph End.
КРАН
Program KRAN
uses Graph;
Const uMin=50; uMax=600; vMin=50; vMax=450;
{Окно графика функции}
Var grDriver: integer;
grMode: integer;
xStep:real; {Шаг по х}
n,k:integer; {Число точек графика}
x,y,px,py:real;
xMin, yMin,yMax, xMax:real;{Область функции}
Procedure Grlnit;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
IF GraphResult<>0 then
begin
Writeln('Ошибка инициализации!');
writeln('Работа программы прервана');
Halt(1)
end
End;
Function xScr(x: real):integer;
{Преобразование координаты х в u}
begin
xScr:=Round((x-xMin)*px+uMin);
end;
Function yScr(y:real):integer;
{Преобразование координаты y в v}
begin
begin
yScr:=Round((y-yMax)*py+vMin);
end;
Function f(x:real):real;
{Вид функции}
begin
f:=X*X-5*X+6;
end;
Begin
{Ввод исходных значений области функции}
write('xMin='); readln(xMin);
write('xMax='); readln(xMax);
write('yMin='); readln(yMin);
write('yMax='); readln(yMax);
px:=(uMax-uMin)/(xMax-xMin);
py:=-(vMax-vMin)/(yMax-yMin);
Grlnit;
{Построение рамки прямоугольника}
SetLineStyle(0,0,3);
Rectangle(uMin,vMin,uMax,vMax);
{Построение осей координат}
SetLineStyle(0,0,1);
If (xMin<0) and (xMax>0) then
Line (xScr(0),vMin,xScr(0),vMax);
If(yMin<0) and(yMax>0) then
Line(uMin,yScr(0),uMax,yScr(0));
{Определение количества точек графика}
n:=uMax-uMin;
{Вычисление шага}
xStep:=(xMax-xMin)/n;
x:=xMin;
{Вывод графика в виде n точек желтого цвета, преобразовывая при этом х в u, у в v}
for k:=1 to n do
begin
y:=f(x);
if(y> yMin) and (y<yMax) then PutPixel(xScr(x),yScr(y),Yellow);
x:=x+xStep
end;
readln;
Closegraph
End.
ГРУЗОВИК
program gryzovik;
uses graph;
var
grDriver:integer;
grMode:integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
SetColor(5);
bar(100,100,300,200);
bar(300,200,400,50);
bar(400,200,511,130);
rectangle(310,60,390,140);
line(450,130,420,30);
line(420,30,500,30);
line(500,30,470,130);
SetColor(7);
circle(140,230,30);
circle(210,230,30);
circle(400,230,30);
circle(470,230,30);
readln;
end.
ЧЕЛОВЕЧЕК
program chel;
uses graph;
var
grDriver:integer;
grMode:integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
SetColor(5); SetBkColor(1);
SetColor(7);circle(160,120,10);
circle(160,120,5);
circle(175,120,8);
circle(173,110,8);
circle(173,100,8);
circle(175,95,8);
circle(180,90,8);
circle(185,85,8);
circle(190,83,8);
circle(195,83,8);
circle(200,83,8);
circle(205,83,8);
circle(210,83,8);
circle(215,83,8);
circle(200,85,8);
circle(225,90,7);
circle(230,95,8);
circle(230,100,8);
circle(233,105,8);
circle(233,110,8);
circle(233,115,8);
circle(232,120,8);
circle(245,120,10);
circle(245,120,5);
circle(190,110,5);
circle(210,110,5);
circle(200,120,5);
circle(200,135,6);
circle(200,118,30);
circle(200,118,60);
readln;
end.
БРОУНОВСКОЕ ДВИЖЕНИЕ
uses crt, graph;
const N = 200;
var gd, gm: integer;
x, y: array [1..N] of integer;
dx, dy: integer;
i: integer;
x1, y1, x2, y2: integer;
begin
gd:= detect;
initgraph (gd, gm, '');
randomize;
setbkcolor (8);
x1:= 250; y1:= 180;
x2:= 340; y2:= 300;
setfillstyle (1, 14);
bar (100, 300, 500, 310);
bar (160, 300, 165, 400);
bar (440, 300, 445, 400);
setfillstyle (1, 11);
bar (x1, y1, x2, y2);
line (x1-1, y1-30, x1-1, y2+1);
line (x2+1, y1-30, x2+1, y2+1);
line (x1-1, y2+1, x2+1, y2+1);
line (x1-1, y1-1, x2+1, y1-1);
ellipse (x1+(x2-x1)div 2, y1-30, 0, 360, (x2-x1) div 2, 4);
for i:= 1 to N do begin
x[i]:= x1 + random (x2-x1);
y[i]:= y1 + random (y2-y1);
putpixel (x[i], y[i], 0);
end;
repeat
for i:= 1 to N do putpixel (x[i], y[i], 11);
for i:= 1 to N do begin
dx:= 2 - random (5);
dy:= 2 - random (5);
if (x[i] + dx > x1) and (x[i] + dx < x2) then x[i]:= x[i] + dx;
if (y[i] + dy > y1) and (y[i] + dy < y2) then y[i]:= y[i] + dy;
end;
for i:= 1 to N do putpixel (x[i], y[i], 1);
delay (600);
until keypressed;
closegraph;
end.
МИШКА
program mixa;
uses graph;
var
grDriver:integer;
grMode:integer;
begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
SetColor(5);
line(240,110,260,110);
SetColor(7); circle(250,180,60);
circle(200,235,15);
circle(300,235,15);
circle(250,90,30);
circle(180,150,15);
circle(320,150,15);
circle(230,55,10);
circle(270,55,10);
circle(235,85,5);
circle(265,85,5);
circle(250,100,3);
readln;
end.
ЛЕСЕНКА
Program Lecenka
Uses Graph,Crt;
Var grDriver: Integer;
grMode: Integer;
i,x1,x2,dy,y,d:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver, grMode, 'c:\bp\bgi');
x1:=280;
x2:=360;
dy:=40;
y:=400;
d:=50;
for i:=1 to 10 do begin
line(x1,y,x1,y+dy);
delay(d);
line(x2,y,x2,y+dy);
delay(d);
line(x1,y+(dy div 2),x2,y+(dy div 2));
delay(d*2);
y:=y-dy;
end;
readkey;
closegraph;
End.
ЧЕРВЯК
Program SHERVIAK
uses crt, graph;
var Gd, Gm: Integer;
i,d,uu,n,u,x,y,dx,dy: integer;
vx,vy:array[1..1000] of integer;
begin
Gd:= Detect;
InitGraph(Gd, Gm, 'c:\bp\bgi');
{ SetFillStyle(1,8);
Bar(140,120,503,360);{}
Rectangle(140,120,503,360);
Line(320,140,220,140);
Line(320,140,320,220);
Line(460,220,460,350);
Line(200,330,320,330);
Line(170,220,170,266);{}
x:=320;
y:=240;
dx:=1;
dy:=1;
u:=50;
d:=0;
uu:=1;
for i:=1 to u do
begin
vx[i]:=0;
vy[i]:=0
end;
d:=1;
repeat
putpixel(x,y,11);
putpixel(320,240,0);
if d>10 then
begin
putpixel(vx[1],vy[1],0);
if (uu)mod(3)=0 then
begin
for i:=20 to 1 do
begin
putpixel(vx[n-2*i],vy[n-2*i],0);
end;
end;
end;
if (getpixel(x,y-1) = 15) or (getpixel(x,y+1) = 15) then dy:=-dy;
if (getpixel(x-1,y) = 15) or (getpixel(x+1,y) = 15) then dx:=-dx;
x:=x+dx;
y:=y+dy;
for i:=2 to u do
begin
vx[i-1]:=vx[i];
vy[i-1]:=vy[i];
end;
vx[u]:=x;
vy[u]:=y;
if d<=10 then d:=d+1;
delay(500);{}
uu:=uu+1;
until keypressed;
ReadKey;
CloseGraph; { Shut down graphics }
end.
ВЕЛОСИПЕД
program VELOSIPED;
uses graph;
var
grDriver:integer;
grMobe:integer;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMobe,'');
SetColor(12);
circle(200,150,30);
circle(200,150,23);
circle(330,150,30);
circle(330,150,23);
line(200,150,280,150);
line(280,150,320,110);
line(320,110,210,110);
line(210,110,250,150);
line(200,150,210,110);
circle(200,150,5);
circle(270,150,10);
line(270,150,270,170);
line(265,170,275,170);
line(200,145,270,140);
line(200,155,270,160);
line(330,150,320,110);
line(320,110,320,98);
line(320,98,310,98);
line(210,110,210,100);
circle(210,100,5);
line(210,100,220,100);
line(270,150,270,130);
line(265,130,275,130);
readln;
End.