/*********************************************************************/ /* */ /* マルチエージェントシミュレータ Version 1.0 */ /* */ /*********************************************************************/ //------------------ コンポーネントツリー --------------- WORLD { space 校庭(442,19),SQUARE_2D(40, 40, !LOOP) { agent 基本警察(43,19)[0] { dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent 迎撃警察(140,19)[0] { dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent 防衛警察(323,20)[0] { dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent 猪突猛進な泥棒(10,10)[0] { dim 状態(10,10) AS Integer = (0); dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent 慎重な泥棒(10,10)[0] { dim 状態(10,10) AS Integer = (0); dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent バラバラ行動の泥棒(10,10)[0] { dim 状態(10,10) AS Integer = (0); dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } agent 木(10,10)[18] { dim X(10,10) AS Double = (0.000000); dim Y(100,10) AS Double = (0.000000); dim DIRECTION(190,10) AS Double = (0.000000); } } dim 基本警察の数(18,12) AS Integer = (0); dim 泥棒の数(440,101) AS Integer = (0); dim 泥棒の勇敢さ(15,89) AS Integer = (0); dim 迎撃警察の数(111,12) AS Integer = (0); dim 囚人の割合(21,191) AS Double = (0.000000); dim 慎重な泥棒の数(111,91) AS Integer = (0); dim バラバラ行動の泥棒の数(311,91) AS Integer = (0); dim 連携攻撃(206,91) AS Boolean = (71739904); dim 護衛警官率下限(222,191) AS Integer = (0); dim 護衛警官率(320,191) AS Integer = (0); dim 防衛警察の数(311,14) AS Integer = (0); dim 警察の数合計(10,10) AS Integer = (0); dim 泥棒の数合計(10,10) AS Integer = (0); dim 捕まっていない泥棒の数合計(10,10) AS Integer = (0); dim 捕まった泥棒の数合計(10,10) AS Integer = (0); } //------------------ コンポーネントパレットツリー --------------- //------------------ エージェント変数初期値データ --------------- INITIAL_VALUE { WORLD.校庭.猪突猛進な泥棒.状態 = 1(0); WORLD.校庭.木.X = 18(1.000000, 2.000000, 3.000000, 4.000000, 2 * 7.000000, 34.000000, 36.000000, 4 * 37.000000, 5 * 38.000000, 39.000000); WORLD.校庭.木.Y = 18(2 * 38.000000, 2 * 35.000000, 38.000000, 39.000000, 38.000000, 4.000000, 1.000000, 11.000000, 34.000000, 39.000000 , 1.000000, 2.000000, 34.000000, 35.000000, 37.000000, 7.000000); } //------------------ エージェント共通ルール --------------- #begin_rule common_agent_rule #end_rule common_agent_rule //------------------ エージェントルール --------------- #begin_rule WORLD Agt_Init{ Dim i as integer //基本警察の配置 If World.基本警察の数 >= 1 then for i = 0 to World.基本警察の数 - 1 _CreateAgent(World.校庭.基本警察) World.校庭.基本警察(i).X = 10 World.校庭.基本警察(i).Y = 10 next i End if //迎撃警察の配置 If World.迎撃警察の数 >= 1 then for i = 0 to World.迎撃警察の数 - 1 _CreateAgent(World.校庭.迎撃警察) World.校庭.迎撃警察(i).X = 10 World.校庭.迎撃警察(i).Y = 10 next i End if //防衛警察の配置 If World.防衛警察の数 >= 1 then for i = 0 to World.防衛警察の数-1 _CreateAgent(World.校庭.防衛警察) World.校庭.防衛警察(i).X = 10 World.校庭.防衛警察(i).Y = 10 next i End if //猪突猛進な泥棒の配置 If World.泥棒の数 >= 1 then for i = 0 to World.泥棒の数 - 1 _CreateAgent(World.校庭.猪突猛進な泥棒) World.校庭.猪突猛進な泥棒(i).状態 = color_mazenta next i End if _RandomPutAgent(World.校庭.猪突猛進な泥棒, false) //慎重な泥棒の配置 If World.慎重な泥棒の数 >= 1 then for i = 0 to World.慎重な泥棒の数 - 1 _CreateAgent(World.校庭.慎重な泥棒) World.校庭.慎重な泥棒(i).状態 = color_mazenta next i End if _RandomPutAgent(World.校庭.慎重な泥棒, false) //バラバラ行動の泥棒の配置 If World.バラバラ行動の泥棒の数 >= 1 then for i = 0 to World.バラバラ行動の泥棒の数 - 1 _CreateAgent(World.校庭.バラバラ行動の泥棒) World.校庭.バラバラ行動の泥棒(i).状態 = color_mazenta next i End if _RandomPutAgent(World.校庭.バラバラ行動の泥棒, false) 囚人の割合 = 0 //データ出力の設定 World.警察の数合計 = World.基本警察の数 + World.迎撃警察の数 + World.防衛警察の数 World.泥棒の数合計 = World.泥棒の数 + World.慎重な泥棒の数 + World.バラバラ行動の泥棒の数 } Agt_Step{ Dim 泥棒数1 as integer Dim 泥棒数2 as integer Dim 泥棒数3 as integer Dim 泥棒数 as integer Dim 囚人数1 as integer Dim 囚人数2 as integer Dim 囚人数3 as integer Dim 囚人数 as integer 囚人数1 = _ViewCountAgent(10, 10, 0, World.校庭.猪突猛進な泥棒) 囚人数2 = _ViewCountAgent(10, 10, 0, World.校庭.慎重な泥棒) 囚人数3 = _ViewCountAgent(10, 10, 0, World.校庭.バラバラ行動の泥棒) 囚人数 = 囚人数1 + 囚人数2 + 囚人数3 泥棒数 = World.バラバラ行動の泥棒の数 + World.慎重な泥棒の数 + World.泥棒の数 //データ出力の設定 World.囚人の割合 = 囚人数*100 / 泥棒数 World.捕まった泥棒の数合計 = 囚人数 World.捕まっていない泥棒の数合計 = 泥棒数 - 囚人数 //泥棒全員が捕まったら終了 If 泥棒数 - 囚人数 == 0 then _ExitSimulation() End if } #end_rule WORLD //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.基本警察 Agt_Init{ } Agt_Step{ Dim i as integer Dim j as integer Dim 手の届く範囲 as collection Dim 手の届く範囲の泥棒 as object Dim 手の届く範囲の捕まっていない泥棒 as object Dim 捕まっていない泥棒コレクション as collection Dim 手の届く捕まっていない泥棒の数 as integer Dim 追いかけられる泥棒 as object Dim 遠くの泥棒グループ as collection Dim 手の届かない範囲 as collection Dim 手の届かない範囲の泥棒 as object Dim 遠くの泥棒の数 as integer Dim 同じ場所にいる警官 as collection Dim 同じ場所にいる警官数 as integer Dim 空間長X as Integer Dim 空間長Y as Integer 捕まっていない泥棒コレクション = _InitCollection() For i = 0 to 2 //手の届く範囲の泥棒を探す 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.猪突猛進な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.慎重な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.バラバラ行動の泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く捕まっていない泥棒の数 = _CountCollection(捕まっていない泥棒コレクション) //手の届く範囲に泥棒がいれば捕まえる。 If 手の届く捕まっていない泥棒の数 >= 1 Then 手の届く範囲の捕まっていない泥棒 = _GetObject(捕まっていない泥棒コレクション, 手の届く捕まっていない泥棒の数*Rnd()) my.X = 手の届く範囲の捕まっていない泥棒.X my.Y = 手の届く範囲の捕まっていない泥棒.Y //捕まった泥棒の状態変化 手の届く範囲の捕まっていない泥棒.状態 = color_blue 手の届く範囲の捕まっていない泥棒.X = 10 手の届く範囲の捕まっていない泥棒.Y = 10 Break End if Next i 遠くの泥棒グループ = _InitCollection() //捕まえられる泥棒がいない場合にどの泥棒を追いかけるかを決めて追いかける。 For j = 3 to 15 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.猪突猛進な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.猪突猛進な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta or 手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.慎重な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.慎重な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta or 手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta or 手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 遠くの泥棒の数 = _CountCollection(遠くの泥棒グループ) If 手の届く捕まっていない泥棒の数 == 0 and 遠くの泥棒の数 >= 1 Then 追いかけられる泥棒 = _GetObject(遠くの泥棒グループ, 手の届く捕まっていない泥棒の数*Rnd()) If my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X - 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X - 2 my.Y = my.Y + 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X + 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X + 2 my.Y = my.Y + 2 End if Break End if Next j //手の届く範囲にも、見える範囲にも泥棒がいない場合はまわりの空きスペースに適当に動く。 If 手の届く捕まっていない泥棒の数 == 0 and 遠くの泥棒の数 == 0 Then _MoveToSpace(My.X, My.Y, 2) End if //同じ場所に別の警官がいる場合は、1マスだけ周りに動く。 同じ場所にいる警官 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.基本警察) 同じ場所にいる警官数 = _CountCollection(同じ場所にいる警官) If 同じ場所にいる警官数 >= 2 Then _MoveToSpace(My.X, My.Y, 1) End if //境界に関する制約 空間長X = 40 空間長Y = 40 If My.X > 39 Then My.X = 39 End If If My.X < 0 Then My.X = 0 End If If My.Y > 39 Then My.Y = 39 End If If My.Y < 0 Then My.Y = 0 End If } #end_rule WORLD.校庭.基本警察 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.迎撃警察 Agt_Init{ } Agt_Step{ Dim i as integer Dim j as integer Dim 手の届く範囲 as collection Dim 手の届く範囲の泥棒 as object Dim 手の届く範囲の捕まっていない泥棒 as object Dim 捕まっていない泥棒コレクション as collection Dim 手の届く捕まっていない泥棒の数 as integer Dim 追いかけられる泥棒 as object Dim 遠くの泥棒グループ as collection Dim 遠くの泥棒グループ2 as collection Dim 手の届かない範囲 as collection Dim 手の届かない範囲の泥棒 as object Dim 遠くの泥棒の数 as integer Dim 遠くの泥棒の数2 as integer Dim 同じ場所にいる警官 as collection Dim 同じ場所にいる警官数 as integer Dim 空間長X as Integer Dim 空間長Y as Integer //手の届く範囲の泥棒を探す 捕まっていない泥棒コレクション = _InitCollection() For i = 0 to 2 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.猪突猛進な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.慎重な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.バラバラ行動の泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く捕まっていない泥棒の数 = _CountCollection(捕まっていない泥棒コレクション) //手の届く範囲に泥棒がいれば捕まえる。 If 手の届く捕まっていない泥棒の数 >= 1 Then 手の届く範囲の捕まっていない泥棒 = _GetObject(捕まっていない泥棒コレクション, 手の届く捕まっていない泥棒の数*Rnd()) my.X = 手の届く範囲の捕まっていない泥棒.X my.Y = 手の届く範囲の捕まっていない泥棒.Y //捕まった泥棒の状態変化 手の届く範囲の捕まっていない泥棒.状態 = color_blue 手の届く範囲の捕まっていない泥棒.X = 10 手の届く範囲の捕まっていない泥棒.Y = 10 Break End if Next i 遠くの泥棒グループ = _InitCollection() //捕まえられる泥棒がいない場合、緑の泥棒が見える範囲にいればそれを追いかける。 For j = 3 to 15 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.猪突猛進な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.猪突猛進な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.慎重な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.慎重な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_green) Then _AddCollection(遠くの泥棒グループ, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 遠くの泥棒の数 = _CountCollection(遠くの泥棒グループ) If 手の届く捕まっていない泥棒の数 == 0 and 遠くの泥棒の数 >= 1 Then 追いかけられる泥棒 = _GetObject(遠くの泥棒グループ, 手の届く捕まっていない泥棒の数*Rnd()) If my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X - 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X - 2 my.Y = my.Y + 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X + 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X + 2 my.Y = my.Y + 2 Break End if End if Next j //見える範囲に緑の泥棒がいない場合は紫を追いかける。 遠くの泥棒グループ2 = _InitCollection() For j = 3 to 15 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.猪突猛進な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.猪突猛進な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta) Then _AddCollection(遠くの泥棒グループ2, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.慎重な泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.慎重な泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta) Then _AddCollection(遠くの泥棒グループ2, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 手の届かない範囲 = _CollectAround(My.X, My.Y, j, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届く範囲 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.バラバラ行動の泥棒) 手の届かない範囲 = _MakeDelCollection(手の届かない範囲, 手の届く範囲) For each 手の届かない範囲の泥棒 in 手の届かない範囲 If (手の届かない範囲の泥棒.状態 == color_mazenta) Then _AddCollection(遠くの泥棒グループ2, 手の届かない範囲の泥棒) End if Next 手の届かない範囲の泥棒 遠くの泥棒の数2 = _CountCollection(遠くの泥棒グループ2) If 手の届く捕まっていない泥棒の数 == 0 and 遠くの泥棒の数2 >= 1 Then 追いかけられる泥棒 = _GetObject(遠くの泥棒グループ2, 手の届く捕まっていない泥棒の数*Rnd()) If my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X - 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x >= 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X - 2 my.Y = my.Y + 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y >= 0 then my.X = my.X + 2 my.Y = my.Y - 2 Elseif my.x - 追いかけられる泥棒.x < 0 and my.y - 追いかけられる泥棒.y < 0 then my.X = my.X + 2 my.Y = my.Y + 2 Break End if End if Next j //手の届く範囲にも、見える範囲にも泥棒がいない場合はまわりの空きスペースに適当に動く。 If 手の届く捕まっていない泥棒の数 == 0 and 遠くの泥棒の数 == 0 and 遠くの泥棒の数2 == 0 Then _MoveToSpace(My.X, My.Y, 2) End if //同じ場所に別の警官がいる場合は、1マスだけ周りに動く。 同じ場所にいる警官 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.迎撃警察) 同じ場所にいる警官数 = _CountCollection(同じ場所にいる警官) If 同じ場所にいる警官数 >= 2 Then _MoveToSpace(My.X, My.Y, 1) End if //境界に関する制約 空間長X = 40 空間長Y = 40 If My.X > 空間長X - 1 Then My.X = 空間長X - 1 End If If My.X < 0 Then My.X = 0 End If If My.Y > 空間長Y - 1 Then My.Y = 空間長Y - 1 End If If My.Y < 0 Then My.Y = 0 End If } #end_rule WORLD.校庭.迎撃警察 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.防衛警察 Agt_Init{ } Agt_Step{ Dim i as integer Dim j as integer Dim 手の届く範囲 as collection Dim 手の届く範囲の泥棒 as object Dim 手の届く範囲の捕まっていない泥棒 as object Dim 捕まっていない泥棒コレクション as collection Dim 手の届く捕まっていない泥棒の数 as integer Dim 追いかけられる泥棒 as object Dim 遠くの泥棒グループ as collection Dim 手の届かない範囲 as collection Dim 手の届かない範囲の泥棒 as object Dim 遠くの泥棒の数 as integer Dim 同じ場所にいる警官 as collection Dim 同じ場所にいる警官数 as integer Dim 空間長X as Integer Dim 空間長Y as Integer Dim 護衛警官数1 as integer Dim 護衛警官数2 as integer Dim 護衛警官数4 as integer Dim 護衛警官数 as integer 護衛警官数1 = _ViewCountAgent(10, 10, 1, World.校庭.基本警察) 護衛警官数2 = _ViewCountAgent(10, 10, 1, World.校庭.迎撃警察) 護衛警官数4 = _ViewCountAgent(10, 10, 1, World.校庭.防衛警察) 護衛警官数 = 護衛警官数1 + 護衛警官数2 + 護衛警官数4 World.護衛警官率 = 護衛警官数*100 / (World.基本警察の数 + World.迎撃警察の数 + World.防衛警察の数) //手の届く範囲の泥棒を探す 捕まっていない泥棒コレクション = _InitCollection() For i = 0 to 2 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.猪突猛進な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.慎重な泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く範囲 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.バラバラ行動の泥棒) For each 手の届く範囲の泥棒 in 手の届く範囲 If (手の届く範囲の泥棒.状態 == color_mazenta or 手の届く範囲の泥棒.状態 == color_green) Then _AddCollection(捕まっていない泥棒コレクション, 手の届く範囲の泥棒) End if Next 手の届く範囲の泥棒 手の届く捕まっていない泥棒の数 = _CountCollection(捕まっていない泥棒コレクション)   //手の届く範囲に泥棒がいれば捕まえる。 If 手の届く捕まっていない泥棒の数 >= 1 Then 手の届く範囲の捕まっていない泥棒 = _GetObject(捕まっていない泥棒コレクション, 手の届く捕まっていない泥棒の数*Rnd()) my.X = 手の届く範囲の捕まっていない泥棒.X my.Y = 手の届く範囲の捕まっていない泥棒.Y //捕まった泥棒の状態変化 手の届く範囲の捕まっていない泥棒.状態 = color_blue 手の届く範囲の捕まっていない泥棒.X = 10 手の届く範囲の捕まっていない泥棒.Y = 10 Break End if Next i //護衛警官率が護衛警官率下限以下になると、牢屋を守る。 If World.護衛警官率 <= World.護衛警官率下限 and 手の届く捕まっていない泥棒の数 == 0 then If my.X - 10 >= 3 and my.Y - 10 >= 3 then my.X = my.X - 2 my.Y = my.Y - 2 elseif my.X - 10 >= 3 and my.Y - 10 <= -3 then my.X = my.X - 2 my.Y =my.Y + 2 elseif my.X - 10 <= -3 and my.Y - 10 >= 3 then my.X = my.X + 2 my.Y = my.Y - 2 elseif my.X - 10 <= -3 and my.Y - 10 <= -3 then my.X = my.X + 2 my.Y = my.Y + 2 elseif my.X - 10 >= 3 and my.Y - 10 < 3 and my.Y - 10 > -3 then my.X = my.X - 2 my.Y = 10 elseif my.X - 10 <= -3 and my.Y - 10 < 3 and my.Y - 10 > -3 then my.X = my.X + 2 my.Y = 10 elseif my.X - 10 > -3 and my.X - 10 < 3 and my.Y - 10 >= 3 then my.X = 10 my.Y = my.Y - 2 elseif my.X - 10 > -3 and my.X - 10 < 3 and my.Y - 10 <= -3 then my.X = 10 my.Y = my.Y + 2 elseif my.X - 10 < 3 and my.X - 10 > 0 and my.Y - 10 < 3 and my.Y - 10 > 0 then my.X = 11 my.Y = 11 elseif my.X - 10 < 3 and my.X - 10 > 0 and my.Y - 10 > -3 and my.Y - 10 < 0 then my.X = 11 my.Y = 9 elseif my.X - 10 > -3 and my.X - 10 < 0 and my.Y - 10 < 3 and my.Y - 10 > 0 then my.X = 9 my.Y = 11 elseif my.X - 10 > -3 and my.X - 10 < 0 and my.Y - 10 > -3 and my.Y - 10 < 0 then my.X = 9 my.Y = 9 elseif my.X = 10 and my.Y - 10 < 3 and my.Y - 10 > 0 then my.X = 10 my.Y = 11 elseif my.X = 10 and my.Y - 10 > -3 and my.Y - 10 < 0 then my.X = 10 my.Y = 9 elseif my.X - 10 < 3 and my.X - 10 > 0 and my.Y = 10 then my.X = 11 my.Y = 10 elseif my.X - 10 > -3 and my.X - 10 < 0 and my.Y = 10 then my.X = 9 my.Y = 10 End if End if //手の届く範囲に泥棒がおらず、牢屋も十分に護衛されている場合はまわりの空きスペースに適当に動く。 If 手の届く捕まっていない泥棒の数 == 0 and World.護衛警官率 > World.護衛警官率下限 Then _MoveToSpace(My.X, My.Y, 2) End if //同じ場所に別の警官がいる場合は、1マスだけ周りに動く。 同じ場所にいる警官 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.防衛警察) 同じ場所にいる警官数 = _CountCollection(同じ場所にいる警官) If 同じ場所にいる警官数 >= 2 Then _MoveToSpace(My.X, My.Y, 1) End if //境界に関する制約 空間長X = 40 空間長Y = 40 If My.X > 空間長X - 1 Then My.X = 空間長X - 1 End If If My.X < 0 Then My.X = 0 End If If My.Y > 空間長Y - 1 Then My.Y = 空間長Y - 1 End If If My.Y < 0 Then My.Y = 0 End If } #end_rule WORLD.校庭.防衛警察 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.猪突猛進な泥棒 Agt_Init{ //初期状態は紫色 my.状態 = Color_Mazenta } Agt_Step{ Dim i as integer Dim 周囲 as collection Dim 牢屋の周り as collection Dim 牢屋の周り2 as collection Dim 牢屋の周り3 as collection Dim 牢屋の中 as collection Dim 牢屋の中2 as collection Dim 牢屋の中3 as collection Dim 牢屋から一マス as collection Dim 牢屋から一マス2 as collection Dim 牢屋から一マス3 as collection Dim 牢屋の周りの数 as integer Dim 牢屋の周りの泥棒 as object Dim 警察の数 as integer Dim 要素の数 as integer Dim 近くの警察 as object Dim 空間長X as Integer Dim 空間長Y as Integer Dim 周囲の基本警察 as collection Dim 周囲の迎撃警察 as collection Dim 周囲の防衛警察 as collection Dim 周囲の迎撃警察と防衛警察 as collection Dim 味方 as collection Dim 味方1 as collection Dim 味方2 as collection Dim 味方3 as collection Dim 味方2と4 as collection Dim 味方の数 as integer Dim 味方の数1 as integer Dim 味方の数2 as integer Dim 味方の数3 as integer Dim 木の周囲 as collection Dim 木の周囲の基本警察 as collection Dim 木の周囲の迎撃警察 as collection Dim 木の周囲の防衛警察 as collection Dim 木の周囲の迎撃警察と防衛警察 as collection Dim 木 as Object Dim 周囲の木 as collection Dim 木の数 as Integer Dim 木の周りの警察の数 as integer Dim 15の範囲の基本警察 as collection Dim 15の範囲の迎撃警察 as collection Dim 15の範囲の防衛警察 as collection Dim 15の範囲の迎撃警察と防衛警察 as collection Dim 15の範囲 as collection Dim 15の範囲の警察の数 as integer 空間長X = 40 空間長Y = 40 牢屋の周り = _CollectAround(10, 10, 1, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋の中 = _CollectAround(10, 10, 0, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋から一マス = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り2 = _CollectAround(10, 10, 1, World.校庭, World.校庭.慎重な泥棒) 牢屋の中2 = _CollectAround(10, 10, 0, World.校庭, World.校庭.慎重な泥棒) 牢屋から一マス2 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り3 = _CollectAround(10, 10, 1, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋の中3 = _CollectAround(10, 10, 0, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋から一マス3 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周りの数 = _CountCollection(牢屋から一マス) + _CountCollection(牢屋から一マス2) + _CountCollection(牢屋から一マス3) //捕まっている泥棒は青色 If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if //すでに牢屋の周りにいる勇敢な泥棒は再び逃走(紫に変化) For Each 牢屋の周りの泥棒 In 牢屋から一マス If 牢屋の周りの泥棒.状態 == Color_Green then 牢屋の周りの泥棒.状態 = Color_Mazenta End if Next 牢屋の周りの泥棒 //勇敢度に応じてで勇敢な泥棒(緑色)に変化 If Int(Rnd()*100) <= (World.泥棒の勇敢さ - 1) and (my.状態 == Color_Mazenta or my.状態 == Color_Black) then my.状態 = Color_Green End if //「連携攻撃」パネルがOnなら周り5マス以内に泥棒が10人いるときは全員勇敢になって刑務所に向かう(連携攻撃) If World.連携攻撃 == true then If My.状態 == Color_Mazenta or my.状態 == Color_Black then 味方の数1 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.猪突猛進な泥棒) 味方の数2 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.慎重な泥棒) 味方の数3 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.バラバラ行動の泥棒) 味方の数 = 味方の数1 + 味方の数2 + 味方の数3 If 味方の数 >= 10 then 味方1 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.猪突猛進な泥棒) 味方2 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.慎重な泥棒) 味方3 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.バラバラ行動の泥棒) 味方2と4 = _MakeJoinCollection(味方2, 味方3) 味方 = _MakeJoinCollection(味方1, 味方2と4) For each 近くの泥棒 in 味方 If 近くの泥棒.状態 == color_Mazenta or color_black then 近くの泥棒.状態 = color_green End if Next 近くの泥棒 end if End if End if //勇敢な泥棒(緑色)は牢屋に向かう If my.状態 == Color_Green then If my.X - 10 >= 4 and my.Y - 10 >= 4 then my.X = my.X - 3 my.Y = my.Y - 3 elseif my.X - 10 >= 4 and my.Y - 10 <= -4 then my.X = my.X - 3 my.Y =my.Y + 3 elseif my.X - 10 <= -4 and my.Y - 10 >= 4 then my.X = my.X + 3 my.Y = my.Y - 3 elseif my.X - 10 <= -4 and my.Y - 10 <= -4 then my.X = my.X + 3 my.Y = my.Y + 3 elseif my.X - 10 >= 4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X - 3 my.Y = 10 elseif my.X - 10 <= -4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X + 3 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 >= 4 then my.X = 10 my.Y = my.Y - 3 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 <= -4 then my.X = 10 my.Y = my.Y + 3 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 11 my.Y = 11 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 11 my.Y = 9 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 9 my.Y = 11 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 9 my.Y = 9 elseif my.X = 10 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 10 my.Y = 11 elseif my.X = 10 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 10 my.Y = 9 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y = 10 then my.X = 11 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y = 10 then my.X = 9 my.Y = 10 End if //木陰に隠れている泥棒(黒色)は木の周りに警察がいたら全速力で逃げ、15マス以内に警察がいなければ木から離れる。 Elseif My.状態 == Color_Black Then 木の周囲の基本警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.基本警察)     木の周囲の迎撃警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.迎撃警察) 木の周囲の防衛警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.防衛警察) 木の周囲の迎撃警察と防衛警察 = _MakeJoinCollection(木の周囲の迎撃警察, 木の周囲の防衛警察) 木の周囲 = _MakeJoinCollection(木の周囲の基本警察, 木の周囲の迎撃警察と防衛警察) 木の周りの警察の数 = _CountCollection(木の周囲) 15の範囲の基本警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.基本警察) 15の範囲の迎撃警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.迎撃警察) 15の範囲の防衛警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.防衛警察) 15の範囲の迎撃警察と防衛警察 = _MakeJoinCollection(15の範囲の迎撃警察, 15の範囲の防衛警察) 15の範囲 = _MakeJoinCollection(15の範囲の基本警察, 15の範囲の迎撃警察と防衛警察) 15の範囲の警察の数 = _CountCollection(15の範囲) If 木の周りの警察の数 >= 1 Then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) Elseif 15の範囲の警察の数 == 0 then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) End if //勇敢な泥棒でも隠れている泥棒でもない場合 ElseIf my.状態 == Color_Mazenta or Color_Blue then //捕まっている泥棒は刑務所の周りに泥棒がいたら解放され、紫に戻る。 If my.X == 10 and my.Y == 10 then If 牢屋の周りの数 >= 1 then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 10) Else my.X = 10 my.Y = 10 End if ElseIf (my.X == 0 and my.Y == 0) or (my.X == 0 and my.Y == 空間長Y -1) or (my.X == 空間長X -1 and My.Y == 0) or (my.X == 空間長X -1 and My.Y == 空間長Y -1) Then _MoveToSpace(My.X, My.Y, 3) Else 周囲の基本警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 警察の数 = _CountCollection(周囲) If 警察の数 >= 1 Then My.X = 10 My.Y = 10 Else 周囲 = _InitCollection() //10マス以内に警察がいるとき For i = 1 to 10 周囲の基本警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 要素の数 = _CountCollection(周囲) 周囲の木 = _CollectAround(my.X, my.Y, 3, World.校庭, World.校庭.木) 木の数 = _CountCollection(周囲の木) //木が移動可能範囲内にあれば木陰に隠れる If 要素の数 >= 1 and 木の数 >= 1 then 木 = _GetObject(周囲の木, 木の数*Rnd()) My.X = 木.X My.Y = 木.Y My.状態 = Color_Black //木が移動範囲内にない場合は、警察から離れる Elseif 要素の数 >= 1 and 木の数 == 0 Then 近くの警察 = _GetObject(周囲, 0) If my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y >= 0 then my.X = my.X + 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y < 0 then my.X = my.X + 3 my.Y = my.Y - 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y >= 0 then my.X = my.X - 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y < 0 then my.X = my.X - 3 my.Y = my.Y - 3 End if Break End if Next i //10マス以内に警察がおらず、木陰に隠れていない場合はランダムに移動 If 要素の数 == 0 and My.状態<> color_black then _MoveToSpace(My.X, My.Y, 3) End if End if End if If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if //空間の制約 If My.X > 39 Then My.X = 39 End If If My.X < 0 Then My.X = 0 End If If My.Y > 39 Then My.Y = 39 End If If My.Y < 0 Then My.Y = 0 End If End if } #end_rule WORLD.校庭.猪突猛進な泥棒 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.慎重な泥棒 Agt_Init{ //初期状態は紫色 my.状態 = Color_Mazenta } Agt_Step{ Dim i as integer Dim 周囲 as collection Dim 周囲の基本警察 as collection Dim 周囲の迎撃警察 as collection Dim 周囲の防衛警察 as collection Dim 周囲の迎撃警察と防衛警察 as collection     Dim 木の周囲 as collection Dim 木の周囲の基本警察 as collection Dim 木の周囲の迎撃警察 as collection Dim 木の周囲の防衛警察 as collection Dim 木の周囲の迎撃警察と防衛警察 as collection Dim 周囲4の基本警察 as collection Dim 周囲4の迎撃警察 as collection Dim 周囲4の防衛警察 as collection Dim 木 as Object Dim 周囲の木 as collection Dim 木の数 as Integer Dim 牢屋の周り as collection Dim 牢屋の周り2 as collection Dim 牢屋の周り3 as collection Dim 牢屋の中 as collection Dim 牢屋の中2 as collection Dim 牢屋の中3 as collection Dim 牢屋から一マス as collection Dim 牢屋から一マス2 as collection Dim 牢屋から一マス3 as collection Dim 牢屋の周りの数 as integer Dim 牢屋の周りの泥棒 as object Dim 警察の数 as integer    Dim 木の周りの警察の数 as integer Dim 警察の数4 as integer Dim 要素の数 as integer Dim 近くの警察 as object Dim 空間長X as Integer Dim 空間長Y as Integer Dim 味方 as collection Dim 味方1 as collection Dim 味方2 as collection Dim 味方3 as collection Dim 味方2と4 as collection Dim 味方の数 as integer Dim 味方の数1 as integer Dim 味方の数2 as integer Dim 味方の数3 as integer Dim 15の範囲の基本警察 as collection Dim 15の範囲の迎撃警察 as collection Dim 15の範囲の防衛警察 as collection Dim 15の範囲の迎撃警察と防衛警察 as collection Dim 15の範囲 as collection Dim 15の範囲の警察の数 as integer 空間長X = 40 空間長Y = 40 牢屋の周り = _CollectAround(10, 10, 1, World.校庭, World.校庭.慎重な泥棒) 牢屋の中 = _CollectAround(10, 10, 0, World.校庭, World.校庭.慎重な泥棒) 牢屋から一マス = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り2 = _CollectAround(10, 10, 1, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋の中2 = _CollectAround(10, 10, 0, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋から一マス2 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り3 = _CollectAround(10, 10, 1, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋の中3 = _CollectAround(10, 10, 0, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋から一マス3 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周りの数 = _CountCollection(牢屋から一マス) + _CountCollection(牢屋から一マス2) + _CountCollection(牢屋から一マス3) //刑務所にいる泥棒は青色 If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if //すでに牢屋の周りにいる勇敢な泥棒は再び逃走(紫に変化) For Each 牢屋の周りの泥棒 In 牢屋から一マス If 牢屋の周りの泥棒.状態 == Color_Green then 牢屋の周りの泥棒.状態 = Color_Mazenta End if Next 牢屋の周りの泥棒 //勇敢度に応じて勇敢な泥棒(緑色)に変化 If Int(Rnd()*100) <= (World.泥棒の勇敢さ - 1) and (my.状態 == Color_Mazenta or my.状態 == Color_Black) then my.状態 = Color_Green End if //「連携攻撃」パネルがOnなら周り5マス以内に泥棒が10人いるときは全員勇敢になって刑務所に向かう(連携攻撃) If World.連携攻撃 == true then If (My.状態 == Color_Mazenta) or (My.状態 == Color_Black) then 味方の数1 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.猪突猛進な泥棒) 味方の数2 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.慎重な泥棒) 味方の数3 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.バラバラ行動の泥棒) 味方の数 = 味方の数1 + 味方の数2 + 味方の数3 If 味方の数 >= 10 then My.状態 = Color_Green 味方1 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.猪突猛進な泥棒) 味方2 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.慎重な泥棒) 味方3 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.バラバラ行動の泥棒) 味方2と4 = _MakeJoinCollection(味方2, 味方3) 味方 = _MakeJoinCollection(味方1, 味方2と4) For each 近くの泥棒 in 味方 If 近くの泥棒.状態 == color_Mazenta or color_Black then 近くの泥棒.状態 = color_green End if Next 近くの泥棒 end if End if End if //勇敢な泥棒は牢屋に向かう If my.状態 == Color_Green then 周囲 = _InitCollection() //ただし4マス以内に警察がいるときは警察から離れる For i = 1 to 4 周囲の基本警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 要素の数 = _CountCollection(周囲) If 要素の数 >= 1 then 近くの警察 = _GetObject(周囲, 0) If my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y >= 0 then my.X = my.X + 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y < 0 then my.X = my.X + 3 my.Y = my.Y - 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y >= 0 then my.X = my.X - 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y < 0 then my.X = my.X - 3 my.Y = my.Y - 3 End if Break End if Next i If 要素の数 == 0 then If my.X - 10 >= 4 and my.Y - 10 >= 4 then my.X = my.X - 3 my.Y = my.Y - 3 elseif my.X - 10 >= 4 and my.Y - 10 <= -4 then my.X = my.X - 3 my.Y =my.Y + 3 elseif my.X - 10 <= -4 and my.Y - 10 >= 4 then my.X = my.X + 3 my.Y = my.Y - 3 elseif my.X - 10 <= -4 and my.Y - 10 <= -4 then my.X = my.X + 3 my.Y = my.Y + 3 elseif my.X - 10 >= 4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X - 3 my.Y = 10 elseif my.X - 10 <= -4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X + 3 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 >= 4 then my.X = 10 my.Y = my.Y - 3 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 <= -4 then my.X = 10 my.Y = my.Y + 3 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 11 my.Y = 11 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 11 my.Y = 9 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 9 my.Y = 11 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 9 my.Y = 9 elseif my.X = 10 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 10 my.Y = 11 elseif my.X = 10 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 10 my.Y = 9 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y = 10 then my.X = 11 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y = 10 then my.X = 9 my.Y = 10 End if End if //木陰に隠れている泥棒(黒色)は木の周りに警察がいたら全速力で逃げ、15マス以内に警察がいなければ木から離れる。 Elseif My.状態 == Color_Black Then 木の周囲の基本警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.基本警察)  木の周囲の迎撃警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.迎撃警察)  木の周囲の防衛警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.防衛警察)  木の周囲の迎撃警察と防衛警察 = _MakeJoinCollection(木の周囲の迎撃警察, 木の周囲の防衛警察)  木の周囲 = _MakeJoinCollection(木の周囲の基本警察, 木の周囲の迎撃警察と防衛警察)  木の周りの警察の数 = _CountCollection(木の周囲) 15の範囲の基本警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.基本警察) 15の範囲の迎撃警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.迎撃警察) 15の範囲の防衛警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.防衛警察) 15の範囲の迎撃警察と防衛警察 = _MakeJoinCollection(15の範囲の迎撃警察, 15の範囲の防衛警察) 15の範囲 = _MakeJoinCollection(15の範囲の基本警察, 15の範囲の迎撃警察と防衛警察) 15の範囲の警察の数 = _CountCollection(15の範囲) If 木の周りの警察の数 >= 1 Then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) Elseif 15の範囲の警察の数 == 0 then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) End if //勇敢な泥棒でも隠れている泥棒でもない場合 Elseif my.状態 == Color_Mazenta or Color_blue then //捕まっている泥棒は刑務所の周りに泥棒がいたら解放され、紫に戻る。 If my.X == 10 and my.Y == 10 then If 牢屋の周りの数 >= 1 then My.状態 = color_mazenta _MoveToSpace(My.X, My.Y, 10) Else my.X = 10 my.Y = 10 End if ElseIf (my.X == 0 and my.Y == 0) or (my.X == 0 and my.Y == 空間長Y -1) or (my.X == 空間長X -1 and My.Y == 0) or (my.X == 空間長X -1 and My.Y == 空間長Y -1) Then _MoveToSpace(My.X, My.Y, 3) Else 周囲の基本警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 警察の数 = _CountCollection(周囲) If 警察の数 >= 1 Then My.X = 10 My.Y = 10 Else 周囲 = _InitCollection() //10マス以内に警察がいるとき For i = 1 to 10 周囲の基本警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 要素の数 = _CountCollection(周囲) 周囲の木 = _CollectAround(my.X, my.Y, 3, World.校庭, World.校庭.木) 木の数 = _CountCollection(周囲の木) //木が移動可能範囲内にあれば木陰に隠れる If 要素の数 >= 1 and 木の数 >= 1 then 木 = _GetObject(周囲の木, 木の数*Rnd()) My.X = 木.X My.Y = 木.Y My.状態 = Color_Black //木が移動範囲内にない場合は、警察から離れる Elseif 要素の数 >= 1 and 木の数 == 0 Then 近くの警察 = _GetObject(周囲, 0) If my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y >= 0 then my.X = my.X + 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y < 0 then my.X = my.X + 3 my.Y = my.Y - 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y >= 0 then my.X = my.X - 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y < 0 then my.X = my.X - 3 my.Y = my.Y - 3 End if Break End if Next i //10マス以内に警察がおらず、木陰に隠れていない場合はランダムに移動 If 要素の数 == 0 and My.状態<> color_black then _MoveToSpace(My.X, My.Y, 3) End if End if End if If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if End if //空間の制約 If My.X > 空間長X - 1 Then My.X = 空間長X - 1 End If If My.X < 0 Then My.X = 0 End If If My.Y > 空間長Y - 1 Then My.Y = 空間長Y - 1 End If If My.Y < 0 Then My.Y = 0 End If } #end_rule WORLD.校庭.慎重な泥棒 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.バラバラ行動の泥棒 Agt_Init{ //初期状態は紫色 my.状態 = Color_Mazenta } Agt_Step{ Dim i as integer Dim 周囲 as collection Dim 牢屋の周り as collection Dim 牢屋の周り2 as collection Dim 牢屋の周り3 as collection Dim 牢屋の中 as collection Dim 牢屋の中2 as collection Dim 牢屋の中3 as collection Dim 牢屋から一マス as collection Dim 牢屋から一マス2 as collection Dim 牢屋から一マス3 as collection Dim 牢屋の周りの数 as integer Dim 牢屋の周りの泥棒 as object Dim 警察の数 as integer Dim 要素の数 as integer Dim 近くの警察 as object Dim 空間長X as Integer Dim 空間長Y as Integer Dim 周囲の基本警察 as collection Dim 周囲の迎撃警察 as collection Dim 周囲の防衛警察 as collection Dim 周囲の迎撃警察と防衛警察 as collection Dim 木 as Object Dim 周囲の木 as collection Dim 木の数 as Integer Dim 木の周囲 as collection Dim 木の周囲の基本警察 as collection Dim 木の周囲の迎撃警察 as collection Dim 木の周囲の防衛警察 as collection Dim 木の周囲の迎撃警察と防衛警察 as collection Dim 木の周りの警察の数 as integer Dim 15の範囲の基本警察 as collection Dim 15の範囲の迎撃警察 as collection Dim 15の範囲の防衛警察 as collection Dim 15の範囲の迎撃警察と防衛警察 as collection Dim 15の範囲 as collection Dim 15の範囲の警察の数 as integer Dim 周りの警察の数 as integer Dim 周りの泥棒の数 as integer Dim 周りの泥棒 as collection Dim 周りの猪突猛進な泥棒 as collection Dim 周りの慎重な泥棒 as collection Dim 周りのバラバラ行動の泥棒 as collection Dim 周りの猪突猛進&慎重な泥棒 as collection Dim 最も近い泥棒 as object Dim 味方 as collection Dim 味方1 as collection Dim 味方2 as collection Dim 味方3 as collection Dim 味方2と4 as collection Dim 味方の数 as integer Dim 味方の数1 as integer Dim 味方の数2 as integer Dim 味方の数3 as integer 空間長X = 40 空間長Y = 40 牢屋の周り = _CollectAround(10, 10, 1, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋の中 = _CollectAround(10, 10, 0, World.校庭, World.校庭.バラバラ行動の泥棒) 牢屋から一マス = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り2 = _CollectAround(10, 10, 1, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋の中2 = _CollectAround(10, 10, 0, World.校庭, World.校庭.猪突猛進な泥棒) 牢屋から一マス2 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周り3 = _CollectAround(10, 10, 1, World.校庭, World.校庭.慎重な泥棒) 牢屋の中3 = _CollectAround(10, 10, 0, World.校庭, World.校庭.慎重な泥棒) 牢屋から一マス3 = _MakeDelCollection(牢屋の周り, 牢屋の中) 牢屋の周りの数 = _CountCollection(牢屋から一マス) + _CountCollection(牢屋から一マス2) + _CountCollection(牢屋から一マス3) 周りの警察の数 = _ViewCountAgent(My.X, My.Y, 3, World.校庭.基本警察) + _ViewCountAgent(My.X, My.Y, 3, World.校庭.迎撃警察) + _ViewCountAgent(My.X, My.Y, 3, World.校庭.防衛警察) 周りの泥棒の数 = _ViewCountAgent(My.X, My.Y, 3, World.校庭.猪突猛進な泥棒) + _ViewCountAgent(My.X, My.Y, 3, World.校庭.慎重な泥棒) + _ViewCountAgent(My.X, My.Y, 3, World.校庭.バラバラ行動の泥棒) //捕まっている泥棒は青色 If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if //すでに牢屋の周りにいる勇敢な泥棒は再び逃走(紫に変化) For Each 牢屋の周りの泥棒 In 牢屋から一マス If 牢屋の周りの泥棒.状態 == Color_Green then 牢屋の周りの泥棒.状態 = Color_Mazenta End if Next 牢屋の周りの泥棒 //勇敢度に応じてで勇敢な泥棒(緑色)に変化 If Int(Rnd()*100) <= (World.泥棒の勇敢さ - 1) and (my.状態 == Color_Mazenta or my.状態 == Color_Black) then my.状態 = Color_Green End if //「連携攻撃」パネルがOnなら周り5マス以内に泥棒が10人いるときは全員勇敢になって刑務所に向かう(連携攻撃) If World.連携攻撃 == true then If My.状態 == Color_Mazenta or my.状態 == Color_Black then 味方の数1 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.猪突猛進な泥棒) 味方の数2 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.慎重な泥棒) 味方の数3 = _ViewCountAgent(My.X, My.Y, 5, World.校庭.バラバラ行動の泥棒) 味方の数 = 味方の数1 + 味方の数2 + 味方の数3 If 味方の数 >= 10 then 味方1 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.猪突猛進な泥棒) 味方2 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.慎重な泥棒) 味方3 = _CollectAround(My.X, My.Y, 5, World.校庭, World.校庭.バラバラ行動の泥棒) 味方2と4 = _MakeJoinCollection(味方2, 味方3) 味方 = _MakeJoinCollection(味方1, 味方2と4) For each 近くの泥棒 in 味方 If 近くの泥棒.状態 == color_Mazenta or color_black then 近くの泥棒.状態 = color_green End if Next 近くの泥棒 end if End if End if //勇敢な泥棒(緑色)は牢屋に向かう If my.状態 == Color_Green then If my.X - 10 >= 4 and my.Y - 10 >= 4 then my.X = my.X - 3 my.Y = my.Y - 3 elseif my.X - 10 >= 4 and my.Y - 10 <= -4 then my.X = my.X - 3 my.Y =my.Y + 3 elseif my.X - 10 <= -4 and my.Y - 10 >= 4 then my.X = my.X + 3 my.Y = my.Y - 3 elseif my.X - 10 <= -4 and my.Y - 10 <= -4 then my.X = my.X + 3 my.Y = my.Y + 3 elseif my.X - 10 >= 4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X - 3 my.Y = 10 elseif my.X - 10 <= -4 and my.Y - 10 < 4 and my.Y - 10 > -4 then my.X = my.X + 3 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 >= 4 then my.X = 10 my.Y = my.Y - 3 elseif my.X - 10 > -4 and my.X - 10 < 4 and my.Y - 10 <= -4 then my.X = 10 my.Y = my.Y + 3 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 11 my.Y = 11 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 11 my.Y = 9 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 9 my.Y = 11 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 9 my.Y = 9 elseif my.X = 10 and my.Y - 10 < 4 and my.Y - 10 > 0 then my.X = 10 my.Y = 11 elseif my.X = 10 and my.Y - 10 > -4 and my.Y - 10 < 0 then my.X = 10 my.Y = 9 elseif my.X - 10 < 4 and my.X - 10 > 0 and my.Y = 10 then my.X = 11 my.Y = 10 elseif my.X - 10 > -4 and my.X - 10 < 0 and my.Y = 10 then my.X = 9 my.Y = 10 End if //木陰に隠れている泥棒(黒色)は木の周りに警察がいたら全速力で逃げ、15マス以内に警察がいなければ木から離れる。 Elseif My.状態 == Color_Black Then 木の周囲の基本警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.基本警察)  木の周囲の迎撃警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.迎撃警察)  木の周囲の防衛警察 = _CollectAround(My.X, My.Y, 2, World.校庭, World.校庭.防衛警察)  木の周囲の迎撃警察と防衛警察 = _MakeJoinCollection(木の周囲の迎撃警察, 木の周囲の防衛警察)  木の周囲 = _MakeJoinCollection(木の周囲の基本警察, 木の周囲の迎撃警察と防衛警察)  木の周りの警察の数 = _CountCollection(木の周囲) 15の範囲の基本警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.基本警察) 15の範囲の迎撃警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.迎撃警察) 15の範囲の防衛警察 = _CollectAround(My.X, My.Y, 15, World.校庭, World.校庭.防衛警察) 15の範囲の迎撃警察と防衛警察 = _MakeJoinCollection(15の範囲の迎撃警察, 15の範囲の防衛警察) 15の範囲 = _MakeJoinCollection(15の範囲の基本警察, 15の範囲の迎撃警察と防衛警察) 15の範囲の警察の数 = _CountCollection(15の範囲) If 木の周りの警察の数 >= 1 Then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) Elseif 15の範囲の警察の数 == 0 then My.状態 = Color_Mazenta _MoveToSpace(My.X, My.Y, 5) End if //勇敢な泥棒でも隠れている泥棒でもない場合 ElseIf my.状態 == Color_Mazenta or Color_Blue then //捕まっている泥棒は刑務所の周りに泥棒がいたら解放され、紫に戻る。 If my.X == 10 and my.Y == 10 then If 牢屋の周りの数 >= 1 then My.状態 = Color_mazenta _MoveToSpace(My.X, My.Y, 10) Else my.X = 10 my.Y = 10 End if ElseIf (my.X == 0 and my.Y == 0) or (my.X == 0 and my.Y == 空間長Y -1) or (my.X == 空間長X -1 and My.Y == 0) or (my.X == 空間長X -1 and My.Y == 空間長Y -1) Then _MoveToSpace(My.X, My.Y, 3) //3マス以内に他の泥棒がいて、警察がいない場合、泥棒から離れる ElseIf 周りの泥棒の数 >= 2 and 周りの警察の数 == 0 then For i = 1 to 3 周りの猪突猛進な泥棒 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.猪突猛進な泥棒) 周りの慎重な泥棒 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.慎重な泥棒) 周りのバラバラ行動の泥棒 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.バラバラ行動の泥棒) 周りの猪突猛進&慎重な泥棒 = _MakeJoinCollection(周りの猪突猛進な泥棒, 周りの慎重な泥棒) 周りの泥棒 = _MakeJoinCollection(周りの猪突猛進&慎重な泥棒, 周りのバラバラ行動の泥棒) _RemoveCollection(周りの泥棒, my) 要素の数 = _CountCollection(周りの泥棒) If 要素の数 >= 1 then 最も近い泥棒 = _GetObject(周りの泥棒, 0) If my.X - 最も近い泥棒.X >= 0 and My.Y - 最も近い泥棒.Y >= 0 then my.X = my.X + 3 my.Y = my.Y + 3 Elseif my.x - 最も近い泥棒.x >= 0 and my.y - 最も近い泥棒.y < 0 then my.X = my.X + 3 my.Y = my.Y - 3 Elseif my.x - 最も近い泥棒.x < 0 and my.y - 最も近い泥棒.y >= 0 then my.X = my.X - 3 my.Y = my.Y + 3 Elseif my.x - 最も近い泥棒.x < 0 and my.y - 最も近い泥棒.y < 0 then my.X = my.X - 3 my.Y = my.Y - 3 End if Break End if Next i Else 周囲の基本警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, 0, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 警察の数 = _CountCollection(周囲) If 警察の数 >= 1 Then My.X = 10 My.Y = 10 Else 周囲 = _InitCollection() //10マス以内に警察がいるとき For i = 1 to 10 周囲の基本警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.基本警察) 周囲の迎撃警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.迎撃警察) 周囲の防衛警察 = _CollectAround(My.X, My.Y, i, World.校庭, World.校庭.防衛警察) 周囲の迎撃警察と防衛警察 = _MakeJoinCollection(周囲の迎撃警察, 周囲の防衛警察) 周囲 = _MakeJoinCollection(周囲の基本警察, 周囲の迎撃警察と防衛警察) 要素の数 = _CountCollection(周囲) 周囲の木 = _CollectAround(my.X, my.Y, 3, World.校庭, World.校庭.木) 木の数 = _CountCollection(周囲の木) //木が移動可能範囲内にあれば木陰に隠れる If 要素の数 >= 1 and 木の数 >= 1 then 木 = _GetObject(周囲の木, 木の数*Rnd()) My.X = 木.X My.Y = 木.Y My.状態 = Color_Black //木が移動範囲内にない場合は、警察から離れる ElseIf 要素の数 >= 1 and 木の数 == 0 then 近くの警察 = _GetObject(周囲, 0) If my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y >= 0 then my.X = my.X + 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x >= 0 and my.y - 近くの警察.y < 0 then my.X = my.X + 3 my.Y = my.Y - 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y >= 0 then my.X = my.X - 3 my.Y = my.Y + 3 Elseif my.x - 近くの警察.x < 0 and my.y - 近くの警察.y < 0 then my.X = my.X - 3 my.Y = my.Y - 3 End if Break End if Next i //10マス以内に警察がおらず、木陰に隠れていない場合はランダムに移動 If 要素の数 == 0 then _MoveToSpace(My.X, My.Y, 3) End if End if End if If my.X == 10 and my.Y == 10 then my.状態 = Color_Blue End if //空間の制約 If My.X > 空間長X - 1 Then My.X = 空間長X - 1 End If If My.X < 0 Then My.X = 0 End If If My.Y > 空間長Y - 1 Then My.Y = 空間長Y - 1 End If If My.Y < 0 Then My.Y = 0 End If End if } #end_rule WORLD.校庭.バラバラ行動の泥棒 //------------------ エージェントルール --------------- #begin_rule WORLD.校庭.木 Agt_Init{ } Agt_Step{ } #end_rule WORLD.校庭.木 //------------------ シミュレーション設定部 --------------- SINGLE_SIMULATION { STEP_MAX = 0; TIME_MAX = 0; END_CONDITION = "World.囚人の割合 == 100"; EXEC_WAIT = 0; EXEC_ORDER = RANDOM; RANDOM_SEED = 0; LOG_FILE = "",FIXED,OVERWRITE,0; } //------------------ ループ設定部 --------------- REPEAT_SIMULATION { VALUE_CHANGE = NONE; REPEAT_MAX = 100; VARIABLES = ""; START_VALUE = 0.000000; STEP_VALUE = 1.000000; END_VALUE = 1.000000; EXEC_TIMES_SAME = 1; RANDOM_RANGE = 0.000000, 1.000000; SAME_VALUE = YES; EXEC_TIMES_DIFFERENT = 1; } //------------------ 二次元マップ表示出力設定部 --------------- MAP_OUTPUT { MAP_SPACE_NAME = "WORLD.校庭"; MAP_NAME = "校庭"; TITLE = "校庭"; AXIS_LABEL = "", ""; DRAW_RANGE = -3, -3, 39, 39; RULED_LINE = NO; REMARKS = YES; SPACE_KIND = SQUARE_2D; BG_PICT = YES; BG_TYPE = 0; BG_VAR_NAME = ""; BG_FILE_NAME = "koutei.bmp"; DISABLE = NO; POSITION_X = 530; POSITION_Y = 0; SIZE_X = 265; SIZE_Y = 487; OUTPUT { MAP_ELEMENT_NAME = "基本警察"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.基本警察"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 0,0,255; AGENT_COLOR = 0,0,255; MARKER_ID = 1; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } OUTPUT { MAP_ELEMENT_NAME = "迎撃警察"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.迎撃警察"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 0,255,0; AGENT_COLOR = 128,128,255; MARKER_ID = 1; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } OUTPUT { MAP_ELEMENT_NAME = "防衛警察"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.防衛警察"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 127,127,127; AGENT_COLOR = 255,128,128; MARKER_ID = 1; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } OUTPUT { MAP_ELEMENT_NAME = "猪突猛進な泥棒"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.猪突猛進な泥棒"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 255,0,0; AGENT_COLOR = "WORLD.校庭.猪突猛進な泥棒.状態"; MARKER_ID = 1; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } OUTPUT { MAP_ELEMENT_NAME = "慎重な泥棒"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.慎重な泥棒"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 255,255,0; AGENT_COLOR = "WORLD.校庭.慎重な泥棒.状態"; MARKER_ID = 2; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } OUTPUT { MAP_ELEMENT_NAME = "バラバラ行動の泥棒"; MAP_ELEMENT = AGENT_VARIABLE; OUTPUT_EXPRESSION = "WORLD.校庭.バラバラ行動の泥棒"; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_COLOR_MIN = 255,255,255; SPACE_COLOR_MAX = 0,255,255; AGENT_COLOR = "WORLD.校庭.バラバラ行動の泥棒.状態"; MARKER_ID = 3; ICON_TYPE = 0; ICON_VAR_NAME = ""; ICON_FILE_NAME = ""; MAP_COLOR = 0,0,0; NUM_DISPLAY = NO; NUM_VAR_NAME = ""; } } //------------------ 数値画面出力設定部 --------------- NUMERIC_OUTPUT { NUMERIC_NAME = "データ"; TITLE = "データ"; DISABLE = NO; POSITION_X = 265; POSITION_Y = 0; SIZE_X = 265; SIZE_Y = 487; OUTPUT { OUTPUT_ELEMENT_NAME = "ステップ数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_GetCountStep()"; } OUTPUT { OUTPUT_ELEMENT_NAME = "基本警察の数"; FIGURES = 0; FORMAT_ID = 304; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.基本警察)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "迎撃警察の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.迎撃警察)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "防衛警察の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.防衛警察)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "警察の数合計"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "World.警察の数合計"; } OUTPUT { OUTPUT_ELEMENT_NAME = "猪突猛進な泥棒の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.猪突猛進な泥棒)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "慎重な泥棒の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.慎重な泥棒)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "バラバラ行動の泥棒の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "_CountAgent(World.校庭.バラバラ行動の泥棒)"; } OUTPUT { OUTPUT_ELEMENT_NAME = "泥棒の数合計"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "World.泥棒の数合計"; } OUTPUT { OUTPUT_ELEMENT_NAME = "捕まっていない泥棒の数"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "World.捕まっていない泥棒の数合計"; } OUTPUT { OUTPUT_ELEMENT_NAME = "囚人の数"; FIGURES = 0; FORMAT_ID = 304; OUTPUT_EXPRESSION = "World.捕まった泥棒の数合計"; } OUTPUT { OUTPUT_ELEMENT_NAME = "囚人の割合"; FIGURES = 0; FORMAT_ID = 0; OUTPUT_EXPRESSION = "World.囚人の割合"; } } //------------------ 時系列グラフ出力設定部 --------------- TIME_GRAPH { GRAPH_NAME = "時系列グラフ_1"; TITLE = ""; AXIS_LABEL = "", ""; SCALE = 0.000000, 0.000000, 1000.000000, 30.000000, 10.000000, 5.000000; REMARKS = NO; DISABLE = NO; POSITION_X = 0; POSITION_Y = 0; SIZE_X = 265; SIZE_Y = 487; OUTPUT { GRAPH_ELEMENT_NAME = "囚人の数"; LINE_COLOR = 0,0,255; LINE_WIDTH = 1; MARKER_ID = 0; OUTPUT_EXPRESSION = "World.捕まった泥棒の数合計"; } } //------------------ コントロールパネルデータ設定部 --------------- CONTROL_PANEL { PANEL_ITEM { ITEM_NAME = "基本警察の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.基本警察の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 20; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "迎撃警察の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.迎撃警察の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 20; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "防衛警察の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.防衛警察の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 20; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "護衛警官率下限"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.護衛警官率下限; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 100; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "猪突猛進な泥棒の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.泥棒の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 30; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "慎重な泥棒の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.慎重な泥棒の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 30; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "バラバラ行動の泥棒の数"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.バラバラ行動の泥棒の数; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 30; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "泥棒の勇敢さ(%)"; ITEM_TYPE = SLIDER; VAR_NAME = WORLD.泥棒の勇敢さ; CONTROL_ON = NO; CONTROL_ON_INT = 1; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 100; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } PANEL_ITEM { ITEM_NAME = "連携攻撃"; ITEM_TYPE = TOGGLE; VAR_NAME = WORLD.連携攻撃; CONTROL_ON = YES; CONTROL_ON_INT = 0; CONTROL_ON_DOUBLE = 0.000000; CONTROL_ON_STRING = ""; CONTROL_OFF = NO; CONTROL_OFF_INT = 0; CONTROL_OFF_DOUBLE = 0.000000; CONTROL_OFF_STRING = ""; SLIDER_RANGE_MAX = 1; SLIDER_VALUE_MIN = 0.000000; SLIDER_VALUE_STEP = 1.000000; } } //------------------ 説明用HTMLテキスト --------------- #begin_html #end_html //------------------ 空間初期値データ設定部 --------------- SPACE_INITIAL { SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.泥棒"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 255,0,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.警察"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 0,0,255; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.警察2"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 255,0,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.警察4"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 255,255,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.基本警察"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 0,0,255; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.迎撃警察"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 255,0,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.防衛警察"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 0,255,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.猪突猛進な泥棒"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 0,255,255; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.慎重な泥棒"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 0,255,0; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.バラバラ行動の泥棒"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 255,0,255; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } SPACE_ITEM { COMPO_PATH_NAME = "WORLD.校庭.木"; MARKER_ID = 0; COMPO_KIND = COMPO_AGENT; SPACE_COLOR_MIN = 127,127,127; SPACE_COLOR_MAX = 0,0,0; SPACE_DRAW_RANGE = 0.000000, 0.000000; SPACE_DISPLAY = 0; } } //------------------ レポート出力情報設定部 --------------- REPORT_INFO { REPORT_NAME = "猪突.txt"; FIELD_DELIMITER = " "; REPORT_ELEMENT { ELEMENT_NAME = "ステップ数"; FIGURES = 0; FORMAT_ID = 145; REPORT_EXPRESSION = "_GetCountStep()"; REPORT_INTERVAL = 1; REPORT_STEP = 0; REPORT_TYPE = 1; } } //------------------ その他のデータ設定部 --------------- OTHERS_DATA { INDENT = 1; FONT_NAME = "MS ゴシック"; FONT_WIDTH = 0; FONT_HEIGHT = -13; FONT_WEIGHT = 200; FONT_ITALIC = 0; FONT_CHARSET = 128; WINDOW_HIDE_RUN = 0; POSITION_X = 0; POSITION_Y = 0; SIZE_X = 0; SIZE_Y = 0; } //------------------ 再生用ログデータ ---------------