Урок 29 Задача 2
Primary tabs
-- перепроектируйте классы так, чтобы можно было двигаться на плоскости
(в двумерном, а не одномерном пространстве):базовый класс для животного оставьте без изменения, для перемешения в двумерном
пространстве создайте два класса-потомка от Animal:
класс D2Animal, объекты которого двигаются по плоскости
класс D1Animal, объекты которого могут двигаться только по первой строчке
(как и Animal, новый класс тут нужен, чтобы обобщить работу с координатами)
Добавьте класс D2Scene для работы с новым двумерным пространством
uses Crt; // импортируем модуль Crt type Animal = class public constructor create(skinValue, moveLeftValue, moveRightValue: char); virtual; procedure drawFrame(); procedure handleCommand(commandValue: char); virtual; function getCommand(): char; function getPosition(): integer; function isCurrentPosition(position: integer): boolean; protected moveLeftChar: char; // клавиша (символ) для движения влево moveRightChar: char; // клавиша (символ) для движения вправо skin: char; // внешний вид position: integer; // текущая позиция command: char; // последняя введенная команда function getNewPosition(commandValue: char): integer; end; D1Animal = class(Animal) // ползает public //переопределить конструктор constructor create(skinValue, moveLeftValue, moveRightValue: char); override; function CurrentPosition(pos, vertical: integer): boolean; //добавить вертикаль, поставить на 1 protected vertical: integer; end; D2Animal = class(Animal) // летает public //переопределить конструктор constructor create(skinValue, moveLeftValue, moveRightValue: char); override; //переопределить хэндл команд на обработку второго измерения procedure handleCommand(commandValue: char); override; function getNewVertical(commandValue: char): integer; function getVertical(): integer; //проверку переписать, потому что меняется сигнатура function CurrentPosition(pos, vertical: integer): boolean; protected vertical: integer; //добавить вертикаль, поставить на 1 //добавить клавиши вверх и вниз moveUpChar: char; moveDownChar: char; end; D2Scene = class // Сцена Двумерной Анимации public procedure handleCommand(); procedure run(AnimalItem: D1Animal; SecondAnimal: D2Animal); procedure drawSceneFrame(AnimalItem: D1Animal; SecondAnimal: D2Animal); function getCommand(): char; protected command: char; // последняя введенная команда function getMax(a, b: integer): integer; end; // -- Реализация D2Scene ------- procedure D2Scene.run(AnimalItem: D1Animal; SecondAnimal: D2Animal); begin // обработки событий while(self.getCommand() <> 'q') do begin ClrScr(); // новый метод, для отрисовки кадра и всех объектов self.drawSceneFrame(AnimalItem, SecondAnimal); writeln(); Delay(50); if (keyPressed()) then begin self.handleCommand(); AnimalItem.handleCommand(self.getCommand()); SecondAnimal.handleCommand(self.getCommand()); end; end; writeln('Scena zavershena!'); end; // Отрисовка кадра сцены procedure D2Scene.drawSceneFrame(AnimalItem: D1Animal; SecondAnimal: D2Animal); var maxPosition, i, j: integer; begin maxPosition := self.getMax(AnimalItem.getPosition(), SecondAnimal.getPosition()); for j := 1 to SecondAnimal.getVertical() do begin for i:=1 to maxPosition do begin if (AnimalItem.CurrentPosition(i,j)) OR (SecondAnimal.CurrentPosition(i,j)) then begin if (AnimalItem.CurrentPosition(i,j)) then AnimalItem.drawFrame(); if (SecondAnimal.CurrentPosition(i,j)) then SecondAnimal.drawFrame(); end else write(' '); end; writeln(); end; end; function D2Scene.getMax(a, b: integer): integer; begin if (a > b) then result := a else result := b; end; procedure D2Scene.handleCommand(); begin self.command := ReadKey(); // читаем символ из консоли end; function D2Scene.getCommand(): char; begin result := self.command; end; // -- Реализация Animal ------- constructor Animal.create(skinValue, moveLeftValue, moveRightValue: char); begin self.skin := skinValue; self.moveLeftChar := moveLeftValue; self.moveRightChar := moveRightValue; self.command := ' '; // значение по умолчанию self.position := 1; end; procedure Animal.drawFrame(); begin write(self.skin); end; // больше не работаем с консолью напрямую procedure Animal.handleCommand(commandValue: char); begin self.position := self.getNewPosition(commandValue); end; function Animal.getNewPosition(commandValue: char): integer; begin result := self.position; // предыдущее значение, как значение по умолчанию if (commandValue = self.moveRightChar) then result := self.position + 1 else if ((commandValue = self.moveLeftChar) AND (self.position > 1)) then result := self.position - 1; end; function Animal.getCommand(): char; begin result := self.command; end; function Animal.getPosition(): integer; begin result := self.position; end; function Animal.isCurrentPosition(position: integer): boolean; begin result := (position = self.position); end; // ----Реализация D1Animal ---- constructor D1Animal.create(skinValue, moveLeftValue, moveRightValue: char); begin Inherited create(skinValue, moveLeftValue, moveRightValue); self.vertical:= 1; end; function D1Animal.CurrentPosition(pos, vertical: integer): boolean; begin result := (pos = self.position) and (vertical = self.vertical); end; // ----Реализация D2Animal ---- constructor D2Animal.create(skinValue, moveLeftValue, moveRightValue: char); begin Inherited create(skinValue, moveLeftValue, moveRightValue); self.vertical := 1; self.moveUpChar := '8'; self.moveDownChar := '2'; end; procedure D2Animal.handleCommand(commandValue: char); begin Inherited handleCommand(commandValue); self.vertical := self.getNewVertical(commandValue); end; function D2Animal.getNewVertical(commandValue: char): integer; begin result := self.vertical; // предыдущее значение, как значение по умолчанию if (commandValue = self.moveDownChar) then result := self.vertical + 1 else if ((commandValue = self.moveUpChar) AND (self.vertical > 1)) then result := self.vertical - 1; end; function D2Animal.getVertical(): integer; begin result := self.Vertical; end; function D2Animal.CurrentPosition(pos, vertical: integer): boolean; begin result := (pos = self.position) and (vertical = self.vertical); end; // --------------- var Dog: D1Animal; // первое животное Ptica: D2Animal; // второе животное SceneItem: D2Scene; begin Dog := D1Animal.create('*', 'a', 'd'); Ptica := D2Animal.create('V', '4', '6'); SceneItem := D2Scene.create(); // создаем сцену SceneItem.run(Dog, Ptica); // запускаем анимацию readln(); end.
- Log in to post comments
- 973 reads
vedro-compota
Wed, 07/12/2023 - 21:10
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)