2017-09-07 3 views
1

私は、3種類のツリーが混在する複雑な環境を作成しようとしています。スライダを使用して各タイプの番号を変更できます。私が実装している問題は、「昼/夜」のサイクルです。夜が来ると色は暗くなりますが、コードでは色が濃くなり、決して明るい色に戻りません。私は藻類モデルをベースにしていました。スタックオーバーフローへNetlogoコードの問題、昼/夜サイクルが動作しない

to setup 
clear-all 
setup-world 
reset-ticks 
end 

to setup-world 
    ask n-of synchronic-tree-density patches [ 
    set pcolor blue 
    ] 
    ask n-of asynchronious-tree-density patches [ 
    set pcolor yellow 
    ] 
    ask n-of tree-patches patches [ 
    set pcolor green 
    ] 
    recolor-world true 
end 

to recolor-world 
    ask patches [ 
    if pcolor = blue [ 
     ifelse setting-up? or daytime? [ 
     set pcolor blue 
     ] [ 
     set pcolor blue - 3 
     ] 
     ] 

    if pcolor = yellow [ 
     ifelse setting-up? or daytime? [ 
     set pcolor yellow 
     ] [ 
     set pcolor yellow - 3 
     ] 
     ] 

    if pcolor = green [ 
     ifelse setting-up? or daytime? [ 
     set pcolor green 
     ] [ 
     set pcolor green - 3 
     ] 
     ] 
    ] 
end 

to go 
    recolor-world false 
    tick-advance 1 
end 

to-report daytime? 
    report ticks mod 24 < day-length 
end 

答えて

1

歓迎:

は、ここに私のコードです。いくつかのヒントについては、MCVE guidelinesをご覧ください。理想的には、あなたの質問コードは、他のユーザーがあなたのプログラムを実行するために必要なものに限定されています。目標は、そのままあなたのコードをコピーできるということです。今、私はあなたのプログラムをあなたのセットアップに適用するかどうか分かりません。コードを単純化すると、役に立つ回答を得ることができます。

あなたの問題は、あなたのrecolor-world手順のすべてのif文がその事実に由来すると確信しています。最初の周回でそう

if pcolor = green [ 
    ifelse daytime? [ 
    set pcolor green 
    ] [ 
    set pcolor green - 3 
    ] 
] 

、あなたは彼らがsetupの手順でそのように設定されて以来、いくつかの緑のパッチを持っています。これを考慮してください。ただし、daytime?falseになると、これらのパッチはset pcolor green - 3というコマンドを実行するので、if pcolor = greenは実際にはそのコードブロックを再度実行することはありません。私は最も簡単な修正は、フィルタリングのために、色以外のグループ化変数その他を使用することであると思う:

patches-own [ tree-type ] 

to setup 
    clear-all 
    reset-ticks 
    setup-world 
end 

to setup-world 
    ask n-of 50 patches [ 
    set pcolor blue 
    set tree-type 1 
    ] 
    ask n-of 50 patches [ 
    set pcolor yellow 
    set tree-type 2 
    ] 
    ask n-of 50 patches [ 
    set pcolor green 
    set tree-type 3 
    ] 

end 

to recolor-world 
    ask patches with [ tree-type = 1 ] [ 
    ifelse daytime? [ 
     set pcolor blue 
    ] [ 
     set pcolor blue - 3 
    ] 
    ] 

    ask patches with [ tree-type = 2 ] [ 
    ifelse daytime? [ 
     set pcolor yellow 
    ] [ 
     set pcolor yellow - 3 
    ] 
    ] 

    ask patches with [ tree-type = 3 ] [ 
    ifelse daytime? [ 
     set pcolor green 
    ] [ 
     set pcolor green - 3 
    ] 
    ] 

end 

to go 
    recolor-world 
    tick 
end 

to-report daytime? 
    report ticks mod 24 < 12 
end 

編集

より効率的な実装のための彼女の答えでJenBのさらなる向上、@を参照してください。

2

ルークの答えはあなたの問題を解決します。しかし、コードを簡略化して、daytime?の状態を1回だけ評価することもできます。例:

to recolor-world 
    if-else daytime? [ 
    ask patches with [ tree-type = 1 ] [ set pcolor blue ] 
    ask patches with [ tree-type = 2 ] [ set pcolor yellow ] 
    ask patches with [ tree-type = 3 ] [ set pcolor green] 
    ] [ 
    ask patches with [ tree-type = 1 ] [ set pcolor blue - 3 ] 
    ask patches with [ tree-type = 2 ] [ set pcolor yellow - 3 ] 
    ask patches with [ tree-type = 3 ] [ set pcolor green - 3 ] 
    ] 
end 
関連する問題