Simutrans Squirrel Script 講座4日目

スクリプト作れるようになるまでのやっつけ講座です。

今回の目標

繰り返しを使ってカスタマイズできる。

繰り返し(ループ)
例えば複線の線路を引きたい場合を考えます。

script_nd4_2.png


線路1本を引くコマンドを2回行えばできそうです。

include("hm_toolkit_v1")
function hm_build() {
  local way_name = "Rail_120_Tracks"
  hm_way_tl(way_name, [0,0,0], [9,0,0])
  hm_way_tl(way_name, [0,1,0], [9,1,0])
}


2つのコマンドは0と1が変わっているだけです。
これを繰り返し処理(for)を使うと以下のように書けます。

include("hm_toolkit_v1")
function hm_build() {
  local way_name = "Rail_120_Tracks"
  for(local y = 0; y <= 1; y = y+1) {
    hm_way_tl(way_name, [0,y,0], [9,y,0])
  }
}


local y = 0;
ループを開始するときの初期値です。

y <= 1;
ループを続ける条件です。数学的に書けば y ≦ 1 です。
yの値が1以下の時のみ繰り返しを実行します。

y = y+1
ループ終了時の処理です。
ループが終わるごとにカウントの値を1ずつ増やしていきます。


処理の流れは以下のようになります。

まずyが0になる。

ループ内の
hm_way_tl(way_name, [0,y,0], [9,y,0])
hm_way_tl(way_name, [0,0,0], [9,0,0])
を実行したのと同じになる。

yを+1する。

yが1になる。

yが1以下なのでループを継続する。

ループ内の
hm_way_tl(way_name, [0,y,0], [9,y,0])
hm_way_tl(way_name, [0,1,0], [9,1,0])
を実行したのと同じになる。

yを+1する。

yが2になる。

yが1以下を満たさないのでループを停止する。

今回は2回だけ繰り返しましたがユーザーが好きな回数だけ繰り返せるように繰り返し回数も変数にしてみました。
これも説明的な変数の使い方です。for文の値を変えるより変数の値を変える方がどういう結果になるか想像しやすいです。

include("hm_toolkit_v1")
function hm_build() {
  // 軌道アドオンの名前
  local way_name = "Rail_120_Tracks"
  // 線路の数
  local count = 16

  for(local y = 0; y <=count; y = y+1) {
    hm_way_tl(way_name, [0,y,0], [9,y,0])
  }
}

このように繰り返し処理を使うと同じ操作を好きなだけ繰り返すことが簡単にできます。

繰り返しにはもう一つ種類があります。
今度は同じ線路を2つではなく、線路と道路を並べて引いてみます。

include("hm_toolkit_v1")
function hm_build() {
  local way_name1 = "Rail_120_Tracks"
  local way_name2 = "Road_050"
  hm_way_tl(way_name1, [0,0,0], [9,0,0])
  hm_way_tl(way_name2, [0,1,0], [9,1,0])
}

線路用の変数と道路用の変数それぞれ似たものが出来てしまいました。
やっている操作はほとんど同じなので繰り返しを使いたいですね。
ここで配列の値の数だけ繰り返す「foreach」というものがあります。

配列というのは「[0,1,0]」のようにかぎかっこで囲われた値のことで1つの変数に複数の値を持たせるときに使います。
way_name1とway_name2を配列を使ってway_namesという変数にまとめてみます。

local way_names = ["Rail_120_Tracks", "Road_050"]

配列は長くなりやすいので適宜改行するといいです。

local way_names = [
  "Rail_120_Tracks", 
  "Road_050"
]

foreachでこの配列を使って繰り返しにするとこうなります。

include("hm_toolkit_v1")
function hm_build() {
  local way_names = [
    "Rail_120_Tracks", 
    "Road_050"
  ]

  foreach(way_name in way_names) {
    hm_way_tl(way_name, [0,0,0], [9,0,0])
  }
}

foreachは以下の実行順序になります

way_namesの配列の最初の値「Rail_120_Tracks」をway_nameへセットする。

hm_way_tl(way_name, [0,0,0], [10,0,0])を実行する。

way_namesの配列の最初の値「Road_050」をway_nameへセットする。

hm_way_tl(way_name, [0,0,0], [10,0,0])を実行する。

way_namesのすべての値を処理したので終了。


なんかいい感じに見えますが問題があります。

2回目の繰り返し

hm_way_tl(way_name, [0,0,0], [9,0,0])

y座標が同じであるため、1回目に線路を引いた場所に道路を設置しようとして失敗してしまいます。

こんなこともあろうかと便利な機能が用意されています。
実は配列には0から連番で番号が振られています。

local way_names = [
  "Rail_120_Tracks",  // 0番目の値
  "Road_050"          // 1番目の値
]

この番号は添え字(インデックス,index)などとも呼ばれます。
1から開始ではなく0から始まる点に注意が必要です。

foreachではこの添え字も一緒に受け取ることができ、以下のように書けます。

include("hm_toolkit_v1")
function hm_build() {
  local way_names = [
    "Rail_120_Tracks", 
    "Road_050"
  ]

  foreach(index, way_name in way_names) {
    hm_way_tl(way_name, [0,index,0], [9,index,0])
  }
}

foreachは以下の実行順序になります

way_namesの配列の最初の値「Rail_120_Tracks」をway_nameへ、添え字「0」をindexへセットする。

変数を使ってhm_way_tl("Rail_120_Tracks", [0,0,0], [9,0,0])を実行する。

way_namesの配列の最初の値「Road_050」をway_nameへ、添え字「1」をindexへセットする。

変数を使ってhm_way_tl("Road_050", [0,1,0], [9,1,0])を実行する。

way_namesのすべての値を処理したので終了。

これで線路と道路を並べて設置できます。


練習として以下の要件のスクリプトを作成して下さい。

・線路(Rail_120_Tracks)、道路(Road_050)、運河(canal_030)を並べて建設できる
※軌道の名前は使用しているpakセットに合わせて適宜変更してください。
・建設する長さ(x方向)を変数でカスタマイズできる(初期値は10マス)
・シムトラ上で正常に動作する

script_nd4_3.png





回答例
線路を10マス引く=0(クリックした場所)から9のタイルに引くとなるため注意が必要です。

include("hm_toolkit_v1")
function hm_build() {
  local way_names = [
    "Rail_120_Tracks", 
    "Road_050",
    "canal_030",
  ]
  local length = 10

  foreach(index, way_name in way_names) {
    hm_way_tl(way_name, [0,index,0], [length-1,index,0])
  }
}



次回は条件分岐を扱っていきます。

関連記事

コメント

非公開コメント

プロフィール

128な人

うにゅー

ユーザータグ

simutrans squirrel script