現在、MASに掲載されているレシピブックを参考にダイクストラ法を用いて最短避難経路を算出するモデルを作成しています。
IDが6のポイントにPersonエージェントが到達した際、Personエージェントは建物から避難できたとみなして削除するプログラムを書いたところ、9行目のコードで「Thenの後にEndが必要」というエラー文が出ます。
どこにEnd ifが足りないのでしょうか。よろしくお願いいたします。
以下がコードになります。
Agt_Init{
}
Agt_Step{
Dim targetPointAgt As Agt
Dim distance As Double
If My.RouteCount < CountToken(My.RouteArray) Then
//' 経路に沿って進む
Dim tokenIndex As Integer = CInt(GetToken(My.RouteArray, My.RouteCount))
If tokenIndex >= 0 And tokenIndex < CountAgt(Universe.Map.Point) Then
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
distance = Pursue(targetPointAgt, 1)
If distance > 0 Then
// Pointに到着したとき
My.RouteCount = My.RouteCount + 1
If targetPointAgt.ID > 6 Then
PrintLn("探索中")
ElseIf targetPointAgt.ID < 6 Then
PrintLn("探索中")
Else
PrintLn("ゴールに到着!")
DelAgt(targetPointAgt)
End If
If CountToken(My.RouteArray) > My.RouteCount Then
// 余剰分、次のPointへ向かう
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
Pursue(targetPointAgt, distance)
Else
// 目的地に到着したので、新しい経路を設定する
add_new_route(targetPointAgt)
End If
End If
Else
PrintLn("無効な経路インデックスです。")
// 新しい経路を設定する
add_new_route(targetPointAgt)
End If
Else
PrintLn("経路が無効です。")
If My.RouteCount > 0 Then
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount - 1)))
add_new_route(targetPointAgt)
End If
End If
}
// 新しい経路を追加する
Sub add_new_route(targetPointAgt As Agt)
{
Dim newTargetPointAgt As Agt
Dim newTargetPointAgt2 As Agt
Dim newRoute As String
newRoute = ""
// 2箇所の候補地をランダムに選択する
newTargetPointAgt = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point)))
newTargetPointAgt2 = Universe.Map.Point(CInt(Rnd() * CountAgt(Universe.Map.Point)))
If ((targetPointAgt.ID <> newTargetPointAgt.ID) And (targetPointAgt.ID <> newTargetPointAgt2.ID)) And (newTargetPointAgt.ID <> newTargetPointAgt2.ID) Then
newRoute = @dijkstra(targetPointAgt.ID, CStr(newTargetPointAgt.ID) & "," & CStr(newTargetPointAgt2.ID))
End If
// 新しい経路が有効であれば追加
If Len(newRoute) > 0 Then
My.RouteArray = My.RouteArray & "," & newRoute
End If
}
Agt_Stepで
End Ifが1つ足りないと思います。