108
в соответствии с описанным выше, после чего происходит про-
верка наличия препятствия в новой планируемой позиции. Если
возможное направление не найдено (к примеру, стол сузился в
обоих направлениях или шар прижат в угол другим шаром), шар
останавливается и переходит в выключенное состояние. В про-
тивном случае происходит изменение текущих координат и
на-
правления, а также запись выходных параметров.
Как уже не раз говорилось, приведенная схема для нагляд-
ности чрезвычайно упрощена и имеет вследствие этого немало
недостатков. В частности, когда между двумя шарами на одной
диагонали, двигающихся навстречу друг другу, находится одна
пустая клетка, в соответствии с приведенным механизмом они
«не заметят
» друг друга, и оба встанут на эту клетку, после чего
продолжат движение в исходных направлениях.
Безусловно, такое поведение является некорректным и тре-
бует внесения дополнительных проверок в код реальной про-
граммы. Разумеется, при этом потребуется передача от каждого
шара помимо его координат еще и направления движения, что в
данном случае
было опущено для простоты. Однако здесь для на-
чала потребуется ответить на вопрос, какое поведение обоих ша-
ров являлось бы в такой ситуации корректным. К примеру, оба
шара могут встать на пустую клетку, после чего поменять на-
правление, либо же сразу поменять направление, не попадая в
клетку и, тем самым, не
осуществив столкновения. Оба варианта
не самым лучшим образом отражают естественный ход событий,
что является следствием упрощения модели и дискретности дви-
жения.
Автомат, отвечающий за поведение стола, вследствие своих
более простых задач реализуется гораздо проще:
class table_type: public fsm_type
{
public:
enum {
INPUT_CYCLES,
INPUT_X1,
INPUT_Y1,
INPUT_X2,
INPUT_Y2,
INPUT_NUMBER