Логика c вашей процедуры перемещения, я думаю, немного запутана. Сначала у вас есть случайный шанс либо перейти к патчу с более высоким значением интересующей переменной (с примитивом uphill
), либо, если случайная отрисовка не удалась, он переместится к случайному соседу. Если вы не хотите, чтобы он перемещался на красное пятно, вам нужно проверить, является ли выбранное пятно красным, но вы просто перемещаете его без проверки.
После того, как вы переместили черепаху, вы затем проверьте цвет patch-ahead
. Ваша проблема здесь в том, что patch-ahead
зависит от направления, в котором стоит черепаха, что не имеет никакого отношения к тому направлению, в котором она уже двигалась. Вы либо заставляете его поворачиваться (хотя он может и не поворачиваться достаточно) ИЛИ двигаться вперед. Так что на самом деле он никогда не уходит.
Я не могу дать вам точный ответ, потому что я не знаю, какой должна быть ваша логика c. Но вы можете посмотреть на такие структуры, как:
move-to one-of neighbors with [pcolor != red]
Или, если красных пятен достаточно, возможно, что нет соседей, не являющихся красными (что может привести к ошибке, если вы попытаетесь переместиться к одному), вы можете использовать:
let okay-patches neighbors with [pcolor != red]
if any? okay-patches [move-to one-of okay-patches]
Другой вариант заключается в том, что вы имели в виду face
вместо того, чтобы переходить к патчу в первых разделах кода, а затем проверять, обращено ли оно к красному патчу и повернись, если это так.