Лабораторная работа по ооп
Задание: задача решается фронтально (т.е. все студенты работают с одной программой). Задания 1-3 являются общими и выполняются всеми. Задание 4 выполняется на основе подготовленной программы по вариантам.
Задача: в аквариуме находится N рыбок. К ним помещается «хищник». «Хищник» может съесть рыбку, находящуюся от него на самом близком расстоянии.
Наша задача заключается в размещении рыбок в аквариуме случайным образом. Случайным образом к ним помещается «хищник». Необходимо выделить и удалить с экрана ту рыбку, которая оказалась от «хищника» на ближайшем расстоянии.
Задание 1.
Начнем с описания объекта «рыба». Этот объект должен иметь свойства (поля): координаты, цвет, название; методы: вывода на экран Drow, инициализации Init, т.е. установки координат, цвета и изображения на экране с помощью метода Drow.
Такое описание объекта «рыба» в программе будет выглядеть следующим образом:
type
tfish=object
x,y,col:byte; {свойства объекта: x,y – координаты, col – цвет}
name:char; {свойство объекта – название}
procedure drow(x1,y1:byte; s:char); {метод объекта, изображающий его на экране}
procedure init; {метод, инициализирующий объект}
end;
Замечание: решение задачи будем выполнять в текстовом режиме.
После описания объектного типа для примера и контроля введем один экземпляр данного типа:
Var f: tfish;
Заметим сразу, что этот экземпляр объектного типа мы используем для проверки описания методов объектного типа «рыба», чтобы проверить правильность установки текстового режима, выбора цвета и т.д.
Далее в тексте программы в разделе описания процедур и функций следует описание методов объектного типа «рыба»:
procedure tfish.drow;
begin
GoToXY(x1,y1); {устанавливаем курсор на позицию с координатами x1, y1}
write(s); {«рыбу» изобразим символом }
delay(100); {поставим задержку на 100 миллисекунд для того, чтобы, когда будем выводить на экран много рыб, они появлялись постепенно}
end;
procedure tfish.init;
begin
x:=random(80); {случайным образом задаем значение столбца от 1 до 80}
y:=random(25); {случайным образом задаем значение строки от 1 до 25}
col:=random(15); {случайным образом задаем цвет от 0 до 15}
TextColor(col); {устанавливаем цвет выводимой буквы}
Name:=chr(random(100)) {случайным образом задаем название «рыбы» как символ, соответствующий коду от 1 до 100}
drow(x,y,name); {обращаемся к методу, изображающему «рыбу» на экране}
end;
А сейчас напишем вспомогательную процедуру, «заполняющую аквариум водой», эта процедура не имеет отношения к объектно-ориентированному программированию, но для решения нашей задачи может пригодиться, хотя бы просто для красоты.
procedure fon;
var
i,j,k:byte;
begin
TextColor(Blue); {установим цвет выводимых символов, совпадающий с цветом фона}
for j:=24 downto 1 do begin
for i:=40 downto 1 do begin
k:=80-i+1; GotoXY(i,j);
write(chr(219)); {выводим символ, соответствующий коду 219 – прямоугольник}
GotoXY(k,j);
write(chr(219)); {выводим символ, соответствующий коду 219 – прямоугольник}
delay(12); {эта процедура позволяет устанавливать время задержки в миллисекундах}
end; end; end;
После всех предварительно проделанных действий мы можем написать программу, в которой определим объектный тип «рыба» с его свойствами и методами, «заведем» одну из «рыб», «заполним аквариум водой» и поместим туда одну нашу «рыбку»:
program fish;
uses crt; {для использования процедур работы в текстовом режиме необходимо подключить специальный модуль CRT}
type
tfish=object {описание объектного типа «рыба»}
x,y,col:byte; name:char
procedure drow(x1,y1:byte; s:char);
procedure init;
end;
var
f:tfish;
procedure tfish.drow;
begin
GoToXY(x1,y1);
write(s); delay(100)
end;
procedure tfish.init; {метод, инициализирующий объект «рыба»}
begin
x:=random(80); y:=random(25); col:=random(15);
TextColor(col);
Name:=chr(random(100));
drow(x,y,name);
end;
procedure fon; {«заполнение аквариума водой»}
var
i,j,k:byte;
begin
TextColor(Blue);
for j:=24 downto 1 do begin
for i:=40 downto 1 do begin
k:=80-i+1;
GotoXY(i,j); write(chr(219));
GotoXY(k,j); write(chr(219));
delay(12);
end; end; end;
begin {начало основной программы}
clrscr; {очищаем экран}
randomize; {активизируем функцию генерации случайных чисел}
TextMode(CO80); {устанавливаем текстовый режим цветной, 80*25}
TextBackGround(Blue); {устанавливаем синий цвет фона}
fon; {«заполняем аквариум водой»}
f.init; {«размещаем рыбку в аквариуме», используя метод инициализации объекта «рыба»}
readln;
end.
Задание 2.
Настало время описать объектный тип «съедобных (для хищника) рыб», назовем этих рыб «карп». Причем объектный тип «карп» является потомком объектного типа «рыба», т.е. наследует его структуру и поведение. Нам понадобится новый метод, назовем его kill, удаляющий с экрана тех «карпов», которых съест «хищник». А также перекроем родительский одноименный метод init, т.к. для «карпов» этот метод будет выполняться особым для них («карпов») образом.
Описание объектного типа «карп»:
……{раздел описания типов}
tkarp=object(tfish) {в скобках указывается имя родительского типа}
{свойства (координаты, цвет и название) автоматически наследуются от родительского типа}
{метод drow автоматически наследуется от родительского типа}
procedure kill; {новый метод, удаляющий «карпов» с экрана}
procedure init; {перекрываем метод родительского объекта}
end;
Далее по программе, в разделе описания процедур и функций, описываем методы объектного типа «карп»:
procedure tkarp.init;
begin
x:=random(80); y:=random(25);
col:=14; {зафиксируем цвет «карпов» – желтый}
TextColor(col);
name:='K'; {зафиксируем символ, которым на экране будут обозначаться «карпы»}
drow(x,y,name); {с помощью метода объектного типа «карп» выведем на экран в позиции с координатами x,y, заданной случайным образом, желтую букву К}
end;
procedure tkarp.kill;
begin
name:=chr(219); {заменяем символ ‘K’ на прямоугольник}
Col:=Blue; {заменяем желтый цвет на цвет фона}
TextColor(col);
Drow(x,y,name) {перерисовываем объект заново, при этом синий прямоугольник сливается с цветом фона}
End;
После описания объектного типа «карп» можно определить количество N экземпляров данного типа и задать массив из N элементов типа «карп»:
……..{раздел описания переменных}
k: array [1..100] of tkarp;
n,i: integer;
Итак, мы завершили описание объектного типа «карп» и приступаем к описанию объектного типа «хищник», назовем его «акула». Объектный тип «акула» является потомком объектного типа «рыба», и, следовательно, наследует все его свойства и методы. Перекроем родительский одноименный метод init, т.к. для «акул» этот метод будет выполняться особым для них («акул») образом.
Описание объектного типа «акула»:
takula=object(tfish)
procedure init;
end;
Далее по программе, в разделе описания процедур и функций, описываем методы объектного типа «акула»:
procedure takula.init;
begin
x:=random(80); y:=random(25);
col:=5; {определим цвет изображения «акулы» – малиновый}
TextColor(col+128); {устанавливаем цвет выводимого символа и добавляем эффект мерцания}
name:='A'; {«акула» на экране будет изображаться символом ‘A’}
drow(x,y,name);
end;
В разделе описания переменных следует определить экземпляр типа «акула»:
…….{раздел описания переменных}
a: takula;
А теперь объединим все необходимые фрагменты в программу, которая только заполняет аквариум «карпами» и помещает туда же «акулу». В этой программе «карпам» еще ничего не угрожает.
program fish;
uses crt;
type
tfish=object
x,y,col:byte;
name:char;
procedure drow(x1,y1:byte; s:char);
procedure init;
end;
tkarp=object(tfish)
procedure init;
procedure kill;
end;
takula=object(tfish)
procedure init;
end;
var
a:takula;
k:array[1..100] of tkarp;
n,i:integer;
procedure tfish.drow;
begin
GoToXY(x1,y1);
write(s);
end;
procedure tfish.init;
begin
x:=random(80); y:=random(25); col:=random(15);
TextColor(col); Name:=chr(random(100));
drow(x,y,name);
end;
{вспомогательная процедура заполнения аквариума водой}
procedure fon;
var
i,j,k:byte;
begin
TextColor(Blue);
for j:=24 downto 1 do begin
for i:=40 downto 1 do begin
k:=80-i+1;
GotoXY(i,j); write(chr(219));
GotoXY(k,j); write(chr(219));
delay(12);
end; end; end;
procedure tkarp.init;
begin
x:=random(80); y:=random(25); col:=14;
TextColor(col);
name:='K';
drow(x,y,name);
end;
procedure tkarp.kill;
begin
name:=chr(219); Col:=Blue;
TextColor(col);
Drow(x,y,name)
End;
procedure takula.init;
begin
x:=random(80); y:=random(25); col:=5;
TextColor(col+128);
name:='A';
drow(x,y,name);
end;
{начало основной программы}
begin
write(‘Задайте число карпов в аквариуме: ‘); readln(n);
clrscr; randomize;
TextMode(CO80);
TextBackGround(Blue);
fon;
for i:=1 to n do
k[i].init; {в цикле последовательно размещаем «карпов» на экране}
a.init; {размещаем «акулу»}
readln;
TextMode(BW80); {возвращаем экрану черно-белый режим 80*25}
end.
Задание 3.
Мы проделали основную часть работы. Что еще осталось сделать? Теперь нам нужно среди всех «карпов» определить самого близкого к «акуле» и «съесть» его. В этой части решения задачи уже нет элементов объектно-ориентированного программирования, кроме обращения к методу tkarp.kill, задача свелась к поиску минимального элемента в массиве. Эту часть программы вы можете написать самостоятельно.
Задание 4.
Самостоятельно завершить работу над программой по вариантам:
Вариант 1. Опишите для «акулы» новый метод – способность перемещаться. Для этого вам нужно придать приращение координатам и перерисовать «акулу» на новом месте. А там снова найти самого близкого «карпа» и «съесть» его.
Вариант 2. Поместите в аквариум не одну, а несколько «акул». Позвольте каждой из них «съедать» самого близкого к ней «карпа».
Вариант 3. Опишите метод управления «акулой» с помощью клавиатуры, при этом «съедать» она может «карпа», которого «догонит» (т.е. с координатами которого совпадет ее положение)
Вариант 4. Поместите в «аквариум» новый объект, например, «улитку», которая будет «ползать» по дну.
Вариант 5. Добавить объект «удочка» и описать метод «ловли» рыбы.
Вариант 6. Добавить объект «сеть» (прямоугольная область) и описать метод «ловли» рыбы, попавшей в сеть.
Вариант 7. Опишите новый класс – «водоросли», разместите по дну «аквариума» зеленые насаждения, одним из свойств данного метода должна быть высота растения, в качестве метода можно предложить «рост».
Вариант 8. Опишите новый объект – «водолаз», который будет перемещаться в «водоеме» между рыбами с помощью клавиатуры.