如何让乌龟回到特定的协调状态而不会卡在那里?
How to make turtle go back to specific coordination without getting stuck there?
我试图让海龟在使用某种颜色(这里是黄色)的补丁后回到特定的坐标(世界中心),我写了下面的代码,我的海龟走回去但然后它一直向前移动 1 步后回到那个协调。我的代码肯定有问题。
我不想让乌龟跳起来,我需要他们走回去做进一步的程序。
breed [miners miner]
breed [bases base]
to setup
clear-all
reset-ticks
create-miners 1
create-bases 1
ask bases
[set size 1]
ask miners
[set size 1
set heading random 360]
ask patches
[set pcolor green]
place-golds
end
to go
ask miners
[right random 360
forward random 4
get-gold]
tick
end
to place-golds
ask n-of 10 patches [ set pcolor yellow ]
end
to get-gold
ask miners
[if pcolor = yellow
[set pcolor green
back-to-base]
]
end
to back-to-base
loop [
ifelse on-base? [ stop ]
[
facexy 0 0
fd 1
]
]
end
to-report on-base?
report (xcor = 0 AND ycor = 0)
end
我也使用 while
循环对 back-to-base
过程进行了尝试,但问题仍未解决。
to back-to-base1
while [xcor != 0 AND ycor != 0]
[
facexy 0 0
fd 1
if xcor = 0 AND ycor = 0
[stop]
]
end
您的基本问题是您正在使用 while
循环,它将 运行 直到满足为止。这意味着一旦你让一只乌龟回到基地,它就会看起来像在跳跃,因为它一直移动直到它到达那里。处理这种情况的最简单方法是为每只乌龟设置一个变量来跟踪它是去淘金、回家还是去别的地方。
所以,首先你需要创建是否已经找到黄金的变量,并在创建矿工时将其设置为false
:
miners-own [gold-done?]
to setup
clear-all
reset-ticks
create-miners 1
[ set size 1
set heading random 360
set gold-done? false ; new line here
]
create-bases 1
[ set size 1
]
ask patches [set pcolor green]
place-golds
end
然后你可以修改你的程序,在发现黄金的地方触发 return:
to get-gold
ask miners
[ if pcolor = yellow
[ set pcolor green
set gold-done? true ; new line here
]
]
end
你的 go 程序(这是每个时间单位发生的事情)让矿工移动:
to go
ask miners with [ not gold-done? ]
[ right random 360
forward random 4
get-gold
]
ask miners with [ gold-done? ]
[ face patch 0 0
forward 1
]
tick
end
您还需要编写一些代码来检查是否已到达目的地以及下一步该做什么。
我试图让海龟在使用某种颜色(这里是黄色)的补丁后回到特定的坐标(世界中心),我写了下面的代码,我的海龟走回去但然后它一直向前移动 1 步后回到那个协调。我的代码肯定有问题。
我不想让乌龟跳起来,我需要他们走回去做进一步的程序。
breed [miners miner]
breed [bases base]
to setup
clear-all
reset-ticks
create-miners 1
create-bases 1
ask bases
[set size 1]
ask miners
[set size 1
set heading random 360]
ask patches
[set pcolor green]
place-golds
end
to go
ask miners
[right random 360
forward random 4
get-gold]
tick
end
to place-golds
ask n-of 10 patches [ set pcolor yellow ]
end
to get-gold
ask miners
[if pcolor = yellow
[set pcolor green
back-to-base]
]
end
to back-to-base
loop [
ifelse on-base? [ stop ]
[
facexy 0 0
fd 1
]
]
end
to-report on-base?
report (xcor = 0 AND ycor = 0)
end
我也使用 while
循环对 back-to-base
过程进行了尝试,但问题仍未解决。
to back-to-base1
while [xcor != 0 AND ycor != 0]
[
facexy 0 0
fd 1
if xcor = 0 AND ycor = 0
[stop]
]
end
您的基本问题是您正在使用 while
循环,它将 运行 直到满足为止。这意味着一旦你让一只乌龟回到基地,它就会看起来像在跳跃,因为它一直移动直到它到达那里。处理这种情况的最简单方法是为每只乌龟设置一个变量来跟踪它是去淘金、回家还是去别的地方。
所以,首先你需要创建是否已经找到黄金的变量,并在创建矿工时将其设置为false
:
miners-own [gold-done?]
to setup
clear-all
reset-ticks
create-miners 1
[ set size 1
set heading random 360
set gold-done? false ; new line here
]
create-bases 1
[ set size 1
]
ask patches [set pcolor green]
place-golds
end
然后你可以修改你的程序,在发现黄金的地方触发 return:
to get-gold
ask miners
[ if pcolor = yellow
[ set pcolor green
set gold-done? true ; new line here
]
]
end
你的 go 程序(这是每个时间单位发生的事情)让矿工移动:
to go
ask miners with [ not gold-done? ]
[ right random 360
forward random 4
get-gold
]
ask miners with [ gold-done? ]
[ face patch 0 0
forward 1
]
tick
end
您还需要编写一些代码来检查是否已到达目的地以及下一步该做什么。