2015-07-24 10 views
3

Я очень новичок в netlogo, так что это, вероятно, очень простой вопрос, но я застрял. Я хочу использовать цикл while (так что команды продолжают встречаться на протяжении всего цикла) и цвет исправления, чтобы диктовать, как будет двигаться черепаха.Использование цвета патча и цикла while для управления движением черепах в netlogo

Если черепаха не находится на красном патче, я хочу, чтобы она продолжала двигаться к ближайшему красному участку.

Если на красное пятно, я хочу, чтобы она осталась на пятачке

while [pcolor] of patch-here != red 
    [ 
     face min-one-of patches with [pcolor = red ] [ distance myself ] 
     forward 1 
    ] 

while [pcolor] of patch-here = red 
    [ 
     stop 
    ] 

Когда я запускаю это, я получаю ошибку (с «[pcolor] на патч-вот! = Красный» подсвечена), что говорит: «в то время как ожидается, этот вход будет ИСТИНА/ЛОЖЬ блок, но получил TRUE/FALSE вместо этого.»

Может кто-нибудь помочь мне?

+3

Вы также можете иметь некоторую концептуальную путаницу. Вы заявляете, что используете цикл while, поэтому команды сохраняются на протяжении всего цикла. Цикл while будет означать, что NetLogo будет запускать этот набор команд, пока черепаха не попадет на красный патч. Если у вас несколько черепах, и у вас есть это внутри, попросите черепах ... тогда одна черепаха переместится полностью на красный патч, а затем на следующий. В NetLogo более типично использовать счетчик тиков, и каждый черепаха перемещается после каждого тика, так что все они движутся в одно и то же время. Если одновременно требуется то, что вы хотите, скажите так, и мы ответим на это. – JenB

+0

@JenB У меня есть несколько черепах, и это внутри черепах, я пытаюсь выполнить одновременное движение, как то, что вы сказали! – emenyea

ответ

3

Вам просто нужно бросить [] вокруг состояния петля while, так:

while [[pcolor] of patch-here != red] 
    [ 
     face min-one-of patches with [pcolor = red ] [ distance myself ] 
     forward 1 
    ] 

Кроме того, я не думаю, что ваш второй цикл while прав. Прежде всего, он может работать только один раз (так как это только stop s), поэтому он может также быть if. Во-вторых, вы знаете, что вы только первый цикл while, так что вы знаете, что патч красный. Таким образом, условие всегда будет истинным.

+0

броские скобки работали, спасибо! Я попытался реализации, если заявление , если [[р цвет] из патч-вот = красный] [ остановка ] в то время цикла, но он не работает правильно – emenyea

1

Вот минимальный, но полный пример, который позволяет одновременное перемещение (как указано в комментариях OP). Если вы создадите новую модель NetLogo и скопируете ее, вы увидите, что она работает. Вам нужно будет добавить кнопки и go к интерфейсу, или вы можете ввести настройку (один раз) в командный центр, а затем ввести go (несколько раз), чтобы заставить черепах двигаться.

to setup 
    clear-all 
    ask n-of 20 patches [ set pcolor red ] 
    create-turtles 20 [ setxy random-xcor random-ycor ] 
    reset-ticks 
end 

to go 
    ask turtles with [ [pcolor] of patch-here != red ] 
    [ face min-one-of patches with [pcolor = red ] [ distance myself ] 
    forward 1 
    ] 
    tick 
end 

Основная концепция здесь является то, что каждый tick является временным шагом. Ваш код go содержит инструкции для всего, что происходит в одном и том же тике, а затем команду tick (в конце) для продвижения часов. Это важно для понимания того, как думать, как работает NetLogo, и я предлагаю вам взглянуть на некоторые из примеров в библиотеке моделей.

Фактический код для перехода к ближайшему красному патчу - это то, что вам дал Брайан.

0

есть весь код с условием While (для фиктивных пользователей, как и я;))

to setup 
    clear-all 
    ask n-of 20 patches [ set pcolor red ] 
    create-turtles 20 [ setxy random-xcor random-ycor ] 
    reset-ticks 
end 

to go 
    ask turtles 
    [while [[pcolor] of patch-here != red] 
    [ 
     face min-one-of patches with [pcolor = red ] [ distance myself ] 
     forward 1 
    ] 
    ] 
tick 
end