| チェックポイント 同じ敵の複製(問題編)および配列とFORループを先に呼んでください。 では解決編です。 |
| ■プログラム |
0001 ' initialize |
それでは解説です。
0001 ' initialize
0002 CLEAR
0003 GOSUB @TMR_INI
0004 GOSUB @TK1_INI
0005 @LOOP
0006 VSYNC 1
0007 CLS
0008 GOSUB @TMR_TASK
0009 GOSUB @TK1_TASK
0010 GOTO @LOOP
メインの変更は変数の初期化のために CLEAR 文を実行します。
それ以外は余り変更しないようにしました。
0012 @TMR_INI
0013 TMR_INT = 2*60
0014 TMR_C = TMR_INT
0015 RETURN
0016 '
0017 @TMR_TASK
0018 TMR_C = TMR_C - 1
0019 IF TMR_C >= 0 THEN RETURN
0020 TMR_C = TMR_INT
0021 '
0022 GOSUB @TK1_GET
0023 IF TK1_N < 0 THEN RETURN
0024 TK1_F(TK1_N) = 1
0025 TK1_X(TK1_N) = 0
0026 TK1_Y(TK1_N) = 0
0027 RETURN
タイマ部分ですが初期化では TMR_INT に2*60要するに2秒待つためのカウンタ値を代入してあります。
今後この変数の値を TMR_C に代入してカウントダウンします。
要するに2秒おきに0020行以降を実行します。
0022行以降は敵1のうちまだ動いていない待ち状態の敵を探しています。
敵1が合計3体いるのですがすでに画面内に3体いれば出せません。
もし1体でも待ち状態(要するにTK1_F(n)が0の敵)があればその敵を表示するのです。
ちなみに @TK1_GET は使用されていない敵がいなければ TK1_N に-1を返します。
そうでないときは何番目の敵が空いているかその番号を返します。
0024行以降は空いている敵の初期化を行っています。
0029 @TK1_INI
0030 DIM TK1_F(3),TK1_X(3),TK1_Y(3)
0031 FOR I=0 TO 2
0032 TK1_F(I) = 0
0033 NEXT I
0034 RETURN
敵の初期化部分です。
配列の宣言とフラグを0に初期化します。
この TK1_F(n) が0のときまだ敵が使用されていないということで、フラグが1のとき画面で移動中となります。
0036 @TK1_TASK
0037 FOR TK1_I=0 TO 2
0038 GOSUB @TK1_SUB
0039 NEXT TK1_II
0040 RETURN
前回のタスク実行のルーチンが3体分のループに変更されています。
0042 @TK1_SUB
0043 ON TK1_F(TK1_I) GOTO @TK1_WAIT,@TK1_MOVE
0044 STOP
0045 '
0046 @TK1_WAIT
0047 RETURN
0048 '
0049 @TK1_MOVE
0050 LOCATE TK1_X(TK1_I),TK1_Y(TK1_I)
0051 PRINT "@"
0052 TK1_Y(TK1_I) = TK1_Y(TK1_I) + 0.1
0053 IF TK1_Y(TK1_I) < 23 THEN RETURN
0054 TK1_F(TK1_I) = 0
0055 RETURN
このTK1_SUBは前回のTK1_TASKと同じです。
ただし敵のデータが配列になっています。
何番目の敵を操作しているかはTK1_Iに代入されています。
0057 @TK1_GET
0058 FOR TK1_N=0 TO 2
0059 IF TK1_F(TK1_N)==0 THEN RETURN
0060 NEXT TK1_N
0061 TK1_N = -1
0062 RETURN
最後に追加された部分ですがこれは空いている敵を探しています。
このアルゴリズムをサーチ(検索)といいます。
今後よく現れるアルゴリズムです。