Notes
Notes - notes.io |
%ссылкой ( handle ) на объект, представляющий
% ИСПОЛНИТЕЛЯ "ориентированнный робот на клетчатом поле"
%
%Командный интерфейс ( методы класса ):
% forward, rot, is_bord, mark, is_mark, get_side, get_tmpr
%
%Направление перемещения, поворотов и проверки наличия препятствия задаются
%ОТНОСИТЕЛЬНО:
% шаг вперед; повернуть налево; повернуть направо;
% проверить, есть ли препятствие прямо по курсу, слева, справа
%
%************************************************************************
%ОТЛИЧАЕТСЯ от класса Rob_rel тем, что вместо двух методов Rob_relLeft и
%Rob_relRight в классе Rob_rot имеется лишь один метод rot, но с параметром,
%который может принимать 3 значения: 'left', 'right', 'back' (или 'l',
%'r','b')
%а также тем, что метод Rob_rotis_bord имеет параметр, который может
%принимать также 3 значения: 'forward', 'left', 'right'
%
%-------------------------------------------------------------------------
%Версия: 1.0*
%Дата: 13.03.2013
%-----------------------------------------------------------------------
classdef Rob_rot < handle
% Rob_rot - класс-оболочка класса Robot.Robot( )
properties( Access = private )
hField % ссылка на объект класса Robot.Robot (робот на клетчатом поле)
end
methods( Access = public )
function obj = Rob_rot( mapfile )
%Rob_rot - конструктор класса
%
%СИНТАКСИС:
% r = Rob_rot()
% r = Rob_rot( mapfile )
%
%В 1-ом случае открвается стандартное диалоговое окно для
%выбора файла, в случае отказа, открывается диалог для
%определения параметров поля
%
%Во 2-м случае:
% - mapfile - имя файла, в котором сохранена обстановка на поле
%
%РЕЗУЛЬТАТ:
% - r = ссылка ( handle ) на созданный объект класса Rob_rot
%
%-------------------------------------------------------------
% Командный интерфейс робота ( методы класса ):
% forward, rot, is_bord, mark, is_mark, get_side, get_tmpr
%
%-------------------------------------------------------------
%Изменить ( установить или отредактировать ) начальную обстановку
%на поле можно с помощью мыши:
% -клик по клетке устанавливает маркер
% -клик по маркеру удаляет маркер
% -клик по пунктирной линии сетки клетчатого поля устанавливает
% перегородку
% -клик по перегородке удаляет перегородку
% -клик по роботу и перемещение мыши при неотпущенной клавише
% перемещает робота вслед за курсором в нужную клетку
% ( "неисправного" робота также можно "починить" таким способом )
%После любого числа таких действий робот сразу готов к командному
%управлению
%
%-------------------------------------------------------------
%Если r.outside = 'none', то считается, что поле ограничено рамкой
% r.outside = 'ismark', то считается, что за пределами рамки сплошь установлены маркеры
% r.outside = 'nomark', то считается, что за пределами рамки исходно маркеров нет
%
%При r.outside не равном 'none' считается, что все перегородки, вплотную примыкающие к рамке поля
%( которая в данном случае не рассматривается как ограждение ),
%мыслятся продолженными до бесконечности в невидимую часть поля в соответствующих направлениях
%( невидимая часть поля всегда остается невидимой )
%
%-------------------------------------------------------------
%Сохранить результат РУЧНОГО редактирования обстановки на поле
%можно с помощью комбинации клавиш CTRL+S
%( при этом окно с роботом должно быть текущим! )
%
%Восстановить последнюю сохраненную обстановку на поле можно с помощью
%комбинации клавиш CTRL+R ( при этом окно с роботом должно быть текущим! )
%
%Просмотреть значения температур клеток можно с помощью коьбинации клавиш
%CRTL+T ( при этом окно с роботом должно быть текущим! )
%Повторное нажатие этой комбинации клавиш убирает значения температур из
%клеток
%Визуализированные значения температур можно редактировать ( результаты редактирования
%сохраняются только в опреративной памяти, для сохранения на диске
%требуется CTRL+S )
%
%Динамически менять время задержки выполнения команд робота мможно с помощью
%комбинации клавиш CTRL+"плюс" или CTRL+"минус", соответственно
%( при этом окно с роботом должно быть текущим! )
if nargin == 0
mapfile = [];
end
obj.hField = Robot.Robot( @Robot.Body1, mapfile );
if ~isvalid( obj.hField )
% поле не создано
delete( obj )
else
set( obj.hField.hFig, 'userdata', obj ) %чтобы можно было удалять объект при закрытии окна ( см. Robot.Robot.RobObjctDelete )
end
end % function obj = Rob_rot
function forward( obj )
%forward - команда переместить робота вперед в соседнюю клетку
%
%СИНТАКСИС:
% r.forward( )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля, прямо по курсу робота
% перегородки нет
%
%РЕЗУЛЬТАТ:
% - Робот в соседней по направлению side клетке ( если
% только на пути робота нет перегородки, в противном случае
% происходит "поломка" робота )
if ~isvalid( obj )
% Это возможно, в случае отказа пользователя создать поле в соответствующем диалоге
error 'Поле с роботом отсутствует'
end
if numel( obj ) ~= 1
error 'Команда step применима только к одному отдельному роботу ( к объекту класса Rob_rot из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
side = obj.hField.get_side_();
coderror = obj.hField.step( side );
switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Значение параметра должно быть ''n'' | ''s'' | ''o'' | ''w'''
case 5
error 'Фатальная ошибка: робот наехал на загородку'
end
end % function forward
function rot( obj, side )
%rot - команда развернуть робота налево, направо или назад
%
%СИНТАКСИС:
% r.rot( side )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
% - side = 'l' ('left') | 'r' ('right') | 'b' ('back')
%РЕЗУЛЬТАТ:
% - Робот развёрнут влево на 90 градусов
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
coderror = obj.hField.rot( side );
switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Не предусмотренное значение параметра'
end
end
function ansv = is_bord( obj, side )
%is_bord - команда проверить наличие перегородки в заданном направлении
%
%СИНТАКСИС:
% ansv = r.is_bord( side )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
% - side = 'forward' ('f') | 'left' ('l') | 'right' ('r')
%
%РЕЗУЛЬТАТ:
% - ansv = 1 ( true ), eсли в направлении side есть перегородка
% = 0 ( false ) - в противном случае
if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end
if numel( obj ) ~= 1
error 'Команда is_bord применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
absSide = obj.hField.get_side_();
absSide = Robot.cod_side( absSide );
switch upper( side )
case {'LEFT', 'L'}
absSide = mod( absSide - 1, 4);
case {'RIGHT','R'}
absSide = mod( absSide + 1, 4);
case {'FORWARD', 'F'}
%направление остается прежним
otherwise
error 'Входной параметр должен иметь значение ''forward'' (''f'') |''left'' (''l'') | ''right'' (''r'')'
end
absSide = Robot.decod_side( absSide );
[ansv, coderror] = obj.hField.is_bord( absSide );
switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Значение параметра должно быть ''n'' | ''s'' | ''o'' | ''w'''
end
end % function ansv = is_bord
function mark( obj )
%mark - команда поставить маркер в клетку с роботом
%
%СИНТАКСИС:
% r.mark()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
%
%РЕЗУЛЬТАТ:
% - В клетке с роботом стоит маркер
%( повторная марировка ничего не изменяет, снять уже поставленный маркер нельзя )
if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end
if numel( obj ) ~= 1
error 'Команда mark применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
coderror = obj.hField.mark();
switch coderror
case 3
error 'Робот выведен из стоя'
end
end % function mark
function ansv = is_mark( obj )
%is_mark - команда проверить наличие маркера клетки поля
%
%СИНТАКСИС:
% ansv = r.is_mark()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - ansv = 1 ( true ), eсли в клетке с роботом стоит маркер
% = 0 ( false ) - в противном случае
if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end
if numel( obj ) ~= 1
error 'Команда is_mark применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
[ansv, coderror] = obj.hField.is_mark();
switch coderror
case 3
error 'Робот выведен из стоя'
end
end % function ansv = is_mark
function val = get_tmpr( obj )
%get_tmpr - команда измерить и сообщить "температуру" текущей клетки
%
%СИНТАКСИС:
% val = r.get_tmpr()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - val = целое число ( double ) = "температура" клетки с роботом
%
% ( при создании нового объекта класса Rob_rot, "температурное"
% поле формируется случайно, но при загрузке ранее созданного
% объекта из файла - оно прежнее )
if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end
if numel( obj ) ~= 1
error 'Команда get_tmpr применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
[val, coderror] = obj.hField.get_tmpr();
switch coderror
case 3
error 'Робот выведен из стоя'
end
end % function val = get_tmpr
function side = get_side( obj )
%get_side - команда сообщить текущее направление робота
%
%СИНТАКСИС:
% side = r.get_side()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - side = 'n' (Север) | 's' (Юг) | 'o' (Восток) | 'w' (Запад)
% - текущее направление робота
%
if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end
if numel( obj ) ~= 1
error 'Команда get_side применима только к одному отдельному роботу ( к объекту класса Rob_rot из 1-го элемента )'
end
if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end
[side, coderror] = obj.hField.get_side();
switch coderror
case 3
error 'Робот выведен из стоя'
end
end % function side = get_side
end % methods public
end % classdef
|
Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...
With notes.io;
- * You can take a note from anywhere and any device with internet connection.
- * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
- * You can quickly share your contents without website, blog and e-mail.
- * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
- * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.
Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.
Easy: Notes.io doesn’t require installation. Just write and share note!
Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )
Free: Notes.io works for 12 years and has been free since the day it was started.
You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;
Email: [email protected]
Twitter: http://twitter.com/notesio
Instagram: http://instagram.com/notes.io
Facebook: http://facebook.com/notesio
Regards;
Notes.io Team