Урок 29. Задача 1.

Урок 29. Задача 1.

У вас есть код, который создает сцену, которой можно управлять нажимая клавиши '1' '2'.

uses Crt; //  импортираем модуль Crt
 
type
  Animal = class
    public
      constructor create(skinValue: char);
      procedure drawFrame();
      procedure handleCommand();
      function getCommand(): char;
    protected
      skin: char; // внешний вид
      position: integer; // текущая позиция
      command: char; // последняя введенная команда
      function getNewPosition(commandValue: char): integer;
  end;
 
constructor Animal.create(skinValue: char);
begin
  self.skin := skinValue;
  self.command := ' ';  // значение по умолчанию
end;
 
procedure Animal.drawFrame();
var i: integer;
begin
  for i:=1 to (self.position-1) do
    write(' ');
  writeln(self.skin);
end;
 
procedure Animal.handleCommand();
begin
  self.command := ReadKey(); // вместо readln(command)
  self.position := self.getNewPosition(self.command);
end;
 
function Animal.getNewPosition(commandValue: char): integer;
begin
  if (commandValue = '2') then
    result := self.position + 1
  else
    if (position > 1) then
      result := self.position - 1;
end;
 
function Animal.getCommand(): char;
begin
  result := self.command;
end;
 
var
  AnimalItem: Animal;
begin
  AnimalItem := Animal.create('*');
  while(AnimalItem.getCommand() <> 'q') do
  begin
    ClrScr();
    AnimalItem.drawFrame();
    Delay(500);
    if (keyPressed()) then
       AnimalItem.handleCommand();
  end;
 
  writeln('Programma zavershena!');
  readln();
end.

-- создайте класс AnimalNext, унаследованный от Animal и с помощью переопределения метода сделайте так. чтобы его объект перемещался влево и вправо сразу на 2 пробельный символа при нажатии управляющих клавиш (а не на 1 символ, как случае с исходным классом Animal).

uses Crt; //  импортираем модуль Crt

type
  Animal = class
    public
      constructor create(skinValue: char);
      procedure drawFrame();
      procedure handleCommand();
      function getCommand(): char;
    protected
      skin: char; // внешний вид
      position: integer; // текущая позиция
      command: char; // последняя введенная команда
      function getNewPosition(commandValue: char): integer;
  end;

  AnimalNext = class(Animal) // Наследник класса Animal
    procedure drawFrame(); // Процедура для ее переопределения в потомке класса Animal
  end;

constructor Animal.create(skinValue: char);
begin
  self.skin := skinValue;
  self.command := ' ';  // значение по умолчанию
end;

procedure Animal.drawFrame();
var i: integer;
begin
  for i:=1 to (self.position-1) do
    write(' ');
  writeln(self.skin);
end;

procedure Animal.handleCommand();
begin
  self.command := ReadKey(); // вместо readln(command)
  self.position := self.getNewPosition(self.command);
end;

function Animal.getNewPosition(commandValue: char): integer;
begin
  if (commandValue = '2') then
    result := self.position + 1
  else
    if (position > 1) then
      result := self.position - 1;
end;

function Animal.getCommand(): char;
begin
  result := self.command;
end;

procedure AnimalNext.drawFrame(); // Переопределяемая процедура
var i: integer;
begin
  for i:=1 to (self.position-1) do
    write('  ');                  // Сдвиг на два пробела
  writeln(self.skin);
end;

var
  AnimalNextItem: AnimalNext;
begin
  AnimalNextItem:= AnimalNext.create('*');
  while(AnimalNextItem.getCommand() <> 'q') do
  begin
    ClrScr();
    AnimalNextItem.drawFrame();
    Delay(200);  // Задержка
    if (keyPressed()) then
       AnimalNextItem.handleCommand();
  end;

  writeln('Programma zavershena!');
  readln();
end.
     
vedro-compota's picture

по условию верно, решите через переопределение getNewPosition(), а drawFrame() оставим без изменения

_____________
матфак вгу и остальная классика =)

uses Crt; //  импортируем модуль Crt

type
  Animal = class
    public
      constructor create(skinValue: char);
      procedure drawFrame();
      procedure handleCommand();
      function getCommand(): char;
    protected
      skin: char; // внешний вид
      position: integer; // текущая позиция
      command: char; // последняя введенная команда
      function getNewPosition(commandValue: char): integer; virtual;
  end;

  AnimalNext = class(Animal) // Наследник класса Animal
    function getNewPosition(commandValue: char): integer;  override; // Функция для ее переопределения в потомке класса Animal
  end;

constructor Animal.create(skinValue: char);
begin
  self.skin := skinValue;
  self.command := ' ';  // значение по умолчанию
end;

procedure Animal.drawFrame();
var i: integer;
begin
  for i:=1 to (self.position-1) do
    write(' ');
  writeln(self.skin);
end;

procedure Animal.handleCommand();
begin
  self.command := ReadKey(); // вместо readln(command)
  self.position := self.getNewPosition(self.command);
end;

function Animal.getNewPosition(commandValue: char): integer;
begin
  if (commandValue = '2') then
    result := self.position + 1
  else
    if (position > 1) then
      result := self.position - 1;
end;

function Animal.getCommand(): char;
begin
  result := self.command;
end;

function AnimalNext.getNewPosition(commandValue: char): integer; // Переопределяемоя функция

begin
  if (commandValue = '2') then
    result := self.position + 2
  else
    if (position > 1) then
      result := self.position - 2;
end;

var
  AnimalNextItem: AnimalNext;
begin
  AnimalNextItem:= AnimalNext.create('*');
  while(AnimalNextItem.getCommand() <> 'q') do
  begin
    ClrScr();
    AnimalNextItem.drawFrame();
    Delay(200);
    if (keyPressed()) then
       AnimalNextItem.handleCommand();
  end;

  writeln('Programma zavershena!');
  readln();
end.