前回、「壁や自分自身に接触すれば初めから」になるように組みました。 コレを元に機能を肉付けして、よりゲームらしくしてみましょう。 まずは、ステージ内のランダムな位置に1つだけアイテムを設置し、 キャラクタが接触したら成長して一段階伸びるようにスクリプトを拡張します。
1 2 3 4 5 6 7 8 9 10 11 |
*draw_item // アイテムが表示されていなければランダムな位置に配置 if item = 0 { itemx = rnd(ginfo_winx / size) itemy = rnd(ginfo_winy / size) item = 1 } color 200, 255, 255 i = itemx * size, itemy * size boxf i.0 + 1, i.1 + 1, i.0 + size - 1, i.1 + size - 1 return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
*move_char // アイテムと先頭部分が接触したら成長する if posx = itemx & posy = itemy { len++ item = 0 } repeat len - 1 dir(len - cnt - 1) = dir(len - cnt - 2) posx(len - cnt - 1) = posx(len - cnt - 2) posy(len - cnt - 1) = posy(len - cnt - 2) loop stick key, 5 if key & 1 : dir = dir / 2 + (dir <= 1) * 8 if key & 4 : dir = dir * 2 - (dir >= 8) * 15 posx += (dir = 4) - (dir = 1) posy += (dir = 8) - (dir = 2) return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
*hantei if posx < 0 | posy < 0 | posx >= ginfo_winx / size | posy >= ginfo_winy / size { i = -1 } else { repeat len - 1 i = cnt repeat len - i - 1, i + 1 if posx.i = posx.cnt & posy.i = posy.cnt { i = -2 break } loop if i = -2 : break loop } if i < 0 { if i = -1 : s = "壁" : else : s = "自分" dialog s + "に激突!", 1, "ゲームオーバー" gosub *init } // クリア判定 if len > 30 { dialog "長さ" + len + "達成おめでとう", , "ゲームクリア!" end } return |
1 2 3 4 5 6 |
*start randomize stage = 0 mission = 30, 40, 60 // 1ステージ:30個, 2ステージ:40個, 3ステージ:60個 gosub *init return |
1 2 |
gosub *start goto *main |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
*hantei if posx < 0 | posy < 0 | posx >= ginfo_winx / size | posy >= ginfo_winy / size { i = -1 } else { repeat len - 1 i = cnt repeat len - i - 1, i + 1 if posx.i = posx.cnt & posy.i = posy.cnt { i = -2 break } loop if i = -2 : break loop } if i < 0 { if i = -1 : s = "壁" : else : s = "自分" dialog s + "に激突!", 1, "ゲームオーバー" gosub *init } if len >= mission.stage { stage++ if stage >= length(mission) { dialog "長さ" + mission(stage - 1) + "達成おめでとう", , "ゲームクリア!" end } else { dialog "長さ" + mission(stage - 1) + "達成です", , "ステージ" + stage + "クリア" gosub *init } } return |
1 2 3 4 5 6 7 |
*start randomize stage = 0 life = 3 // ライフ(残機数) mission = 30, 40, 60 gosub *init return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
*hantei if posx < 0 | posy < 0 | posx >= ginfo_winx / size | posy >= ginfo_winy / size { i = -1 } else { repeat len - 1 i = cnt repeat len - i - 1, i + 1 if posx.i = posx.cnt & posy.i = posy.cnt { i = -2 break } loop if i = -2 : break loop } if i < 0 { life-- if i = -1 : s = "壁" : else : s = "自分" // まだライフが残っているなら続行 if life { dialog "長さ" + len + "で" + s + "に激突!", 1, "残り" + life + "回で終了です" gosub *init // ライフがなくなったら、ステージ0からやり直すかゲーム終了 } else { dialog "長さ" + len + "で" + s + "に激突!\nやり直しますか?", 2, "ゲームオーバー" if stat = 6 : gosub *start : else : end } } if len >= mission.stage { stage++ if stage >= length(mission) { dialog "長さ" + mission(stage - 1) + "達成おめでとう", , "ゲームクリア!" end } else { dialog "長さ" + mission(stage - 1) + "達成です", , "ステージ" + stage + "クリア" gosub *init } } return |