追う3は、追う1に障害物を加えた物です。
 それ以外はほぼ同じです。
 追う1と同じ箇所は略します。
 袋小路は無い、という前提で作られています。
 袋小路が有る場合の作り方については、サイトの掲示板にてお問い合わせください。

 追う1に無い数値変数 [止][マップ][確認]
 追う1に無い文字列変数 {XY}
 追う1と扱いが少し違う数値変数 [X][Y]…プレイヤーと敵との距離、移動先のマス目、マス目から換算した座標

スタートページ」「」「」「」「XY」「」「左上」「左下」「右上」「右下」「」「終了」『止』「」「」「」 +調整方法


「スタートページ」

スタートページ

 レイヤー制御 対象レイヤー〈プ〉
(レイヤーの表示状態〜∞レイヤーを非表示にする=j
 レイヤー制御 対象レイヤー〈敵〉
(レイヤーの表示状態〜∞レイヤーを非表示にする=j
 レイヤー制御 対象レイヤー〈背景レイヤー〉
(すぐに画面に反映させる<`ェック有り、レイヤーの表示状態〜∞レイヤーを非表示にする=j
選択肢の表示 「1」「2」

 サンプルでは、マップによって障害物の位置が違う場合の例として、マップ1、2を選択出来るようにしました。
 レイヤー〈プ〉〈敵〉〈背景レイヤー〉を非表示にしているのは、違うマップを選ぶ前の切り替えの為です。
「1」「2」

「1」

 [マップ]←1
 移動「始」
「2」

 [マップ]←2
 移動「始」

 「スタートページ」の選択肢で選んだマップの番号を数値変数[マップ]に入れ、「」に移動します。
「始」

 追う1の「スタートページ」と中身はほぼ同じです。
「XY」

 追う1と同じです。
「プ」

「プ」

 サブルーチンコール「左上」
 サブルーチンコール『止』「止」
 IF[止]=0
  サブルーチンコール「XY」
  ダイナミックレイヤーの作成
 (イメージを表示=@X座標:%X%、Y座標:%Y% 画像:選択.png
  サブルーチンコール「左上」 選択時に〜≠ノチェックする
 ENDIF
 サブルーチンコール「左下」
 サブルーチンコール『止』「止」
 IF[止]=0
  サブルーチンコール「XY」
  ダイナミックレイヤーの作成
 (イメージを表示=@X座標:%X%、Y座標:%Y% 画像:選択.png
  サブルーチンコール「左下」 選択時に〜≠ノチェックする
 ENDIF
 サブルーチンコール「右上」
 サブルーチンコール『止』「止」
 IF[止]=0
  サブルーチンコール「XY」
  ダイナミックレイヤーの作成
 (イメージを表示=@X座標:%X%、Y座標:%Y% 画像:選択.png
  サブルーチンコール「右上」 選択時に〜≠ノチェックする)
 ENDIF
 サブルーチンコール「右下」
 サブルーチンコール『止』「止」
 IF[止]=0
  サブルーチンコール「XY」
  ダイナミックレイヤーの作成
 (イメージを表示=@X座標:%X%、Y座標:%Y% 画像:選択.png
  サブルーチンコール「右下」 選択時に〜≠ノチェックする)
 ENDIF
 マウスの入力を待つ(クリッカブル領域のみ)
 [プX]←[X]
 [プY]←[Y]
 サブルーチンコール「XY」
 レイヤー制御 対象レイヤー〈プ〉
 (レイヤーの表示状態<`ェック無し、レイヤー位置々座標:%X%、Y座標:%Y%)
 移動「敵」

 プレイヤーの番です。
 障害物があるマスにダイナミックレイヤーを作らないようにします。
 追う1のダイナミックレイヤー作成にIFを加えていく方法でも出来ますが、コマンドがつらつら続き、障害物を加える度に調整が必要で、面倒な上にバグの原因になりかねません。
 そこで、ダイナミックレイヤーを作る予定の数値を入れた[X][Y]に障害物の数値が入った時は弾く、ブック『止』のページ「」「」「」を作ります。
 「」などを通り数値変数[止]が[止]=0で戻ってきた時は、障害物が無いので、「XY」をサブルーチンコールし、移動場所のダイナミックレイヤーを作成します。
 [止]=1で戻ってきた場合は、障害物がある、またはマップから出てしまい進めないので、ダイナミックレイヤーは作成しません。
「左上」「左下」「右上」「右下」

 追う1と同じです。
「敵」



 IF[プX]>[敵X]
  [X]←[敵X]+1
 ELSE
  [X]←[敵X]−1
 ENDIF
 IF[プY]>[敵Y]
  [Y]←[敵Y]+1
 ELSE
  [Y]←[敵Y]−1
 ENDIF
 サブルーチンコール『止』「止」
 IF[止]=0
  移動「敵動」
 ENDIF
 [確認]←0
 移動「@」

 敵の番です。
 プレイヤーの番同様、障害物があるマスには進めないようにします。
 単純にプレイヤーに近づくマスを計算し、『止』「」をサブルーチンコールします。
 [止]=0で戻ってきた場合は進めるので、「敵動」に移動して、そのマスに移動します。
 そうでなければ、そのマス以外でプレイヤーに近づくマスに進めないか、確認しなければなりません。
 数値変数[確認]を0にして、「@」に移動します。
「@」

@

 IF[プX]>[敵X]
  [X]←[敵X]+1
 ELSE
  [X]←[敵X]−1
 ENDIF
 IF[プY]>[敵Y]
  [Y]←[敵Y]−1
 ELSE
  [Y]←[敵Y]+1
 ENDIF
 IF[確認]←0
  サブルーチンコール『止』「止」
  IF[止]=0
   [確認]←1
  ENDIF
  移動「A」
 ENDIF
 移動「敵動」

 敵がプレイヤーにより近づくマスが進めない時、袋小路が無い時。
 敵を中心に、進みたかったマスを前とすると、残る候補は左右です。
 その左右を「@」「A」で『止』「」を利用して進めるかどうか判断し、プレイヤーとの位置関係から、@Aの内、進めて且つプレイヤーに近づくマスを選んで進ませます。
 詳しくはおまけを参照してください。
 「@」では@が進めるか、『止』「」をサブルーチンコールして確認します。
 [確認]=0であれば、まだ@もAも確認していないので、@を確認。
 [止]=0であれば@は進めることを確認済み、という印で、[確認]を1にします。
 [止]=1であれば、何もしません。
 どちらの場合でも「A」に移動します。
 その前に[確認]=0でなく、[確認]=1の時は、「敵動」に移動して@に移動します。
「A」

A

 IF[プX]>[敵X]
  [X]←[敵X]−1
 ELSE
  [X]←[敵X]+1
 ENDIF
 IF[プY]>[敵Y]
  [Y]←[敵Y]+1
 ELSE
  [Y]←[敵Y]−1
 ENDIF
 IF[確認]≠0
  移動「敵動」
 ENDIF
 サブルーチンコール『止』「止」
 IF[止]=1
  移動「@」
 ENDIF
 [確認]←2
 [X]←[プX]−[敵X]
 IF[X]<0
  [X]=0−[X]
 ENDIF
 [Y]=[プY]−[敵Y]
 IF[Y]<0
 [Y]←0−[Y]
 ENDIF
 IF[X]>[Y]
  移動「@」
 ENDIF
 IF[X]<[Y]
  移動「A」
 ENDIF
 [止]=[@乱数]mod 2
 IF[止]=0
  移動「@」
 ENDIF
 移動「A」
 「A」の頭で[確認]=0の時、@は進めないことがわかっているので、「敵動」に移動し、Aに移動します。
 [確認]=1の時、@は進めることがわかっているので、『止』「」をサブルーチンコールして、Aは進めるか確認します。
 [止]=1なら、@は進めるがAは進めないので、「@」に移動し、@に移動します。
 そうでなければ、@もAも進めるので、[確認]を2にします。
 [X][Y]にプレイヤーと敵とのX、Y座標それぞれでの距離を入れます。
 X方向の距離がY方向の距離より大きければ、@へ。
 Y方向の距離がX方向の距離より大きければ、Aへ。
 X方向の距離とY方向の距離が等しければ、@Aのどちらに移動してもよいので、ランダムに選びます。
 [@乱数]mod 2は、乱数を2で割った余りを出す、という計算式です。
 今回は2で割ったので、余りは0か1になります。
 この余りで@に進むかAに進むかを決めます。
「敵動」

敵動

 [敵X]←[X]
 [敵Y]←[Y]
 サブルーチンコール「XY」
 レイヤー制御 対象レイヤー〈敵〉
 (レイヤーの表示状態<`ェック無し、レイヤー位置々座標:%X%、Y座標:%Y%)
 IF[プX]=[敵X]
  IF[プY]=[敵Y]
   移動「終了」
  ENDIF
 ENDIF
 移動「プ」
 敵が進むマスが決まったので、[X][Y]を[敵X][敵Y]に移し、「XY」をサブルーチンコールして、敵を移動させます。
 プレイヤーと同じマスになったら、捕まえたので終了です。
「終了」

 追う1と同じです。
『止』「止」

『止』「止」

 [止]←0
 {XY}:(%X%,%Y%)
 IF{XY}⊆(0,
  [止]←1
 ENDIF
 IF{XY}⊆,0)
  [止]←1
 ENDIF
 IF{XY}⊆(12,
  [止]←1
 ENDIF
 IF{XY}⊆,16)
  [止]←1
 ENDIF
 IF[マップ]=1
  移動『止』「1」
 ENDIF
 IF[マップ]=2
  移動『止』「2」
 ENDIF

 「」から移動し、数値変数[止]を0にし、文字列変数{XY}に([X],[Y])になるように(%X%,%Y%)を入れます。
 サンプルでは、(0,〜)(〜,0)(12,〜)(〜,16)は進めません。
 [X][Y]を入れた{XY}に、進めない箇所の数値が入っている時、[止]を1にします。
 例えば(0,4)に進もうとしている時、{XY}⊆(0,で[X]=0とわかり、[止]=1になります。
 そうでなければ、[止]=0のまま。
 マップによって障害物が違うので、数値変数[マップ]で判断し、「」「」に移動します。
『止』「1」、「2」

『止』「1」

 IF{XY}⊆(3,3)
  [止]←1
 ENDIF
 IF{XY}⊆(4,10)
  [止]←1
 ENDIF
 IF{XY}⊆(7,5)
  [止]←1
 ENDIF
 IF{XY}⊆(8,10)
 [止]←1
 ENDIF
 IF{XY}⊆(9,13)
  [止]←1
 ENDIF
 サブルーチンから復帰

 『止』「」と同様に、進めない箇所かどうかを{XY}から判断して、進めなければ[止]を1にし、そうでなければそのままにします。
 サブルーチンから復帰し、「」に戻ります。
 「2」は「1」と同様に。

調整方法

 調整のポイントは、
・マップのマス目の数
・キャラ画像の表示位置
・キャラの初期位置
・マップの形
・障害物の場所
 です。

・マップのマス目の数
・キャラ画像の表示位置
・キャラの初期位置
・マップの形
 については、追う1と同じです。
 追う2に障害物を加えた物については、サイトの掲示板にてお問い合わせください。

・障害物の場所
 (4,8)に障害物がある時は、IF{XY}⊆(4,8) のようにします。
 ブック『止』ページ「1」「2」を参考にしてください。

・他
 敵に捕まるまで何回移動したか、を出したい時については、追う1と同じです。
 もう少しで捕まる!という時に、障害物の周りをぐーるぐーる回り続けてしまうことがあります。
 これは仕方ないので、敵の為に諦めてあげるか、プレイを終了させてください。