2017-11-28 11 views
0

私は私のgoコマンドにifを追加した場合、私はダニがオブザーバーのみダニはオブザーバーだけなので、カメのコンテキストでダニを使用することはできません! NETLOGO

ここでは私の行くのコマンドであるので、あなたは亀のコンテキストでダニを使用するカントのエラーメッセージ

を取得します。 search go-homeとdendeはすべて私のコマンドで定義されています。

エネルギーはまた、グローバル変数として定義され、私は

if energy < 20000 [ask adults [go-home den]] 

ラインを取る場合はカメが

to go 

    if ticks = day-length [set day day + 1 create-next-day] 


    ask adults [search eat] 
    if energy < 20000 [ask adults [go-home den]] 

tick 

end 

を所有していること、それは完璧に動作しますが、私はその行または同等のものを必要とします。 (それが表示される)

Commands 
;;-------------------------------------------------------------;; 
;;------------------- ADULTS COMMANDS--------------------------;; 
;;-------------------------------------------------------------;; 

;; Need to add a private variable (wolves own) for wolves [state] and then need to code 4 states 1. Den 2. Search 3. Eat 4. Return 
;; need to code all 4 states 
;; Need to correctly allocate energy and the state of decline 

To den ;when wolf is full 
    set energy energy - .04 
end 


to search ;when wolf is hungry 
    set energy energy - .07 
    fd v-wolf 
    if random 600 = 1 ;; frequency of turn 
    [ ifelse random 2 = 0 ;; 50:50 chance of left or right 
    [ rt 15 ] ;; could add some variation to this with random-normal 45 5 
    [ lt 15 ]] ;; so that it samples from a dist with mean 45 SD 5 

    ;; check if it can see a prey/food item 
    ;; here i think we probably pick one of several possible prey 
    ;; that are detectable randomly using the one-of command. 
    ;; We should probably select the nearest one instead ** The turtles are getting 
    ;; caught between two prey species and dying because they cant choose which one ** 
    if any? prey in-radius smell [set heading towards one-of prey in-radius smell] 
    if energy < 0 [die] 

end 


To eat ;to kill prey and eat it 
    let kill one-of prey-here in-radius smell 
    ;need to code in a variable for success too 
    if kill != nobody 
    [ask kill [ die ] 
     set energy energy + 10000] 
end 



to go-home ;to head home after they've eaten and den until they need to feed again 
if energy > 30000 [set target-patch min-one-of (patches with [pcolor = white]) [distance myself]] 
    face target-patch 
    fd v-wolf 
    set energy energy - 1 
end 
+0

あなたのリクエストに応じて更新されました。 –

答えて

1

if energy < 20000 [ask adults [go-home den]]があるgoenergy場合に問題となる亀の変数を助けてください。これにより、プロシージャのコンテキストは、オブザーバのコンテキストではなく、カメのコンテキストになります。

編集:例えば

energyは、亀の変数である、おそらくあなたは

ask adults [if (energy < 20000) [go-home den]] 
+0

どうすれば修正できますか? –

+0

@KilianMurphy編集を参照してください。 – Alan

1

ファーストを意味している場合、あなたははるかに徐々に自分のコードをビルドする必要があります。コードの複数の部分が機能していて、理解できない部分があります。可能な限り小さな量を追加し、他のものを追加する前に動作することを確認してください。現在、コードのさまざまな部分にエラーがあり、3つの異なる質問があります。

アランの答えにおける文脈の問題について、このように考えてみましょう。変数「エネルギー」はカメに属します。これは、もしあなたが10頭のカメを持っているならば、それぞれのカメに1つ、「エネルギー」という名前の変数が10個あることを意味します。あなたはそれが< 20000かどうかチェックしていますか?

あなたはおそらくしたいことは個々のカメのためにそれをチェックし、それがテストに合格した場合に必要なアクションを行うためのカメを取得することです。だから、それはask turtles []の中に入っていなければならず、それはオブザーバーからカメの文脈に変化する(どのモデルエンティティがそのことをしているのか)。

to go 
    if ticks = day-length 
    [ set day day + 1 
    create-next-day 
    ] 

    ask adults 
    [ search 
    eat 
    if energy < 20000 
    [ go-home 
     den 
    ] 
    ] 

    tick 
end 

あなたの書式も整理しました。これは必須条件ではありませんが、NetLogoはどこに置いてもスペースを扱うことができます。しかし、コードが長く複雑になると、いくつかの基本的なプラクティス(1)プロシージャーへの各呼び出し、各コマンドなどを別々の行に(2)ブラケット[]とインデント大括弧で囲まれたコードブロックを見ることができます。

関連する問題