Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_OOP.doc
Скачиваний:
61
Добавлен:
10.03.2016
Размер:
268.8 Кб
Скачать

Лабораторная работа по ооп

Задание: задача решается фронтально (т.е. все студенты работают с одной программой). Задания 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. Опишите новый объект – «водолаз», который будет перемещаться в «водоеме» между рыбами с помощью клавиатуры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]