Ложные условия

Материал из UoPilot
Перейти к навигации Перейти к поиску

Вопрос:
Задаю условие:

if_not (x1 y1 color1) and (x2 y2 color2)     // условие такого вида не хочет работать правильно
    bla bla bla
end_if

Однако, если реализовать следующим образом:

if_not (x1 y1 color1)
    if_not (x2 y2 color2)
        bla bla bla
    end_if
end_if      // то все прекрасно выполняется


Ответ:
Обобщим ситуацию: нужно, чтобы скрипт проверил цвет в нескольких точках, и если ВО ВСЕХ этих точках цвет НЕ СОВПАДАЕТ с заданным, то выполнить какие-то действия.
Действительно, с условием if_not у людей часто возникают некоторые недоразумения.
Решение простое, хоть и не совсем понятное сразу.
Нужно делать так:

if_not (x1 y1 color1) OR (x2 y2 color2)
    что-то делаем
end_if

Почему OR ? Всё довольно просто.
Условие if_not срабатывает только в случае

if_not ЛОЖЬ

(в отличие от оператора if ИСТИНА)


Мы имеем следующие логические выражения:
ЛОЖЬ or ЛОЖЬ = ЛОЖЬ
ЛОЖЬ or ИСТИНА = ИСТИНА
ИСТИНА or ЛОЖЬ = ИСТИНА
ИСТИНА or ИСТИНА = ИСТИНА


ЛОЖЬ and ЛОЖЬ = ЛОЖЬ
ЛОЖЬ and ИСТИНА = ЛОЖЬ
ИСТИНА and ЛОЖЬ = ЛОЖЬ
ИСТИНА and ИСТИНА = ИСТИНА


Для нашего же случая условие должно срабатывать (должно быть равно ЛОЖЬ), только если все условия проверок ложны (т.е. во всех точках цвет не совпадает с заданным). А для этого подходит именно логический оператор OR, как и видно выше. Если бы мы использовали оператор AND, то он бы срабатывал, даже если бы в одной из точек цвет совпал с заданным (что нам не подходит).