異世界シューティングの難易度
— difficultyProgress・rate・スポーンとスクロール
テスト環境の縦スクロールシューティング「異世界シューティング」では、難易度が単一の「ステージ係数」ではなく、複数の式が同時に効きます。本記事は実装の正として static/js/isekai-shooting.js を参照し、時間(フレーム)とスコアから求まる prog と、スコアだけで効く rate を中心に整理します。定数の一覧・操作仕様は test/game-isekai-shooting/README.md を正とします。
1. 用語:プレイ上の「ステージ」とコード上の prog
- スコア帯でのステージ(例:500点ごとに区切る考え方)は、説明の便宜上の呼び方です。コードに「ステージ1」の変数はありません。
- difficultyProgress() が返す prog(0〜1、上限で頭打ち)は、後述のとおり経過フレームとスコアの両方から計算されます。
2. 中核:difficultyProgress()(prog)
プレイ中のみ有効です(ゲームオーバーで 0 扱い)。定数は次のとおりです。
- DIFFICULTY_FRAME_RAMP = 7200(フレーム)
- DIFFICULTY_SCORE_RAMP = 11000(スコア)
式は次の形です(実装どおり)。
prog = min(1, max(0, (frame / 7200) × 0.55 + (score / 11000) × 0.45))
つまり難易度の「基調」はプレイ時間と得点の加重和で上がります。prog が 1 に達すると、prog に比例して変化する各種倍率は頭打ちになります。
3. prog が効く主な要素
以下はいずれも isekai-shooting.js 内の update や敵・障害物ループで参照されます(代表例)。
| 要素 | 式・挙動の要約 |
|---|---|
| 背景スクロール | scrollMul = 0.72 + 0.28 × prog を SCROLL_SPEED に乗算。prog が高いほど速い。 |
| 敵・障害物のスポーン間隔の補正 | spawnEnemyMul = spawnObsMul = 1.35 − 0.35 × prog。閾値に掛かるため、小さいほど出現が早い(厳しい)。 |
| ハートのスポーン間隔の補正 | spawnItemMul = 1.15 − 0.15 × prog。同様に、小さいほど出現が早い。 |
| 障害物の落下 | OBSTACLE_FALL_SPEED × (0.68 + 0.32 × prog) など、係数が prog で上がる。 |
| 上から来る敵の落下 | ENEMY_FROM_TOP_FALL × (0.82 + 0.18 × prog) を基準に移動(パターンにより倍率が掛かる行もある)。 |
| 敵弾(速度・クールダウン) | tryEnemyShoot 内で、速度 ENEMY_BULLET_SPEED × (0.52 + 0.48 × prog)、再発射までの待ち ENEMY_FIRE_COOLDOWN × (1.35 − 0.35 × prog) にランダム加算など。 |
細部の分岐(敵の移動パターンごとの係数)はソースを参照してください。
4. prog と独立してスコアだけで効く:rate
スポーン処理の直前で、次のように定義されます。
rate = 0.48 + min(1.05, score / 4800)
敵の出現判定はおおむね (32 / rate) × spawnEnemyMul、障害物は (54 / rate) × spawnObsMul が閾値に関与する形です。スコアが上がるほど rate が大きくなり、同じ prog でも出現が速くなる方向に働きます。min(1.05, …) により、スコア側からの増分には上限があります。
5. 「ステージ1を難易度 1」としたときの比率(目安)
フレームとスコアの関係はプレイ内容で変わるため、ステージごとの難易度比率は一意に決まりません。ここでは説明用に、次の仮定のもと代表点での比較を示します。
- スコアを 500点刻みで「ステージ1 … ステージ6」とみなし、各ステージの中央のスコア(250, 750, …, 2750)を代表点とする。
- 代表点での経過フレームは、500点あたり 7200 フレーム(60FPS で約 2 分)に相当すると仮定し、frame = (score / 500) × 7200 とする。
- 比較用の単一指標として H = (rate / spawnEnemyMul) × scrollMul を定義する(敵圧の目安とスクロール速度の合成)。
- ステージ1中央(スコア 250)の H を 1.00 としたときの比率を次表に示す。
| 区間(目安) | 代表スコア | H の比率(ステージ1中央 = 1) |
|---|---|---|
| ステージ1 | 250 | 1.00 |
| ステージ2 | 750 | 約 1.71 |
| ステージ3 | 1250 | 約 2.18 |
| ステージ4 | 1750 | 約 2.49 |
| ステージ5 | 2250 | 約 2.79 |
| ステージ6 | 2750 | 約 3.10 |
この仮定では、prog はステージ3前後で 1 に近づき、その後は主に rate 側が効いて難易度が伸びるイメージになります。実プレイではスコアの上がり方・ボス戦の有無で変わるため、公式の固定ステージ表ではありません。
6. ボス戦との関係
スコアがしきい値に達するとボス戦に入り、通常の敵・障害物・ハートのスポーンは止まります(実装は bossActive などで分岐)。したがって、道中だけを式で説明しても実感難易度と必ずしも一致しません。
7. バランスをいじるときのメモ
- 時間だけで上げたい → DIFFICULTY_FRAME_RAMP や prog の係数。
- スコアだけで上げたい → DIFFICULTY_SCORE_RAMP、または rate の係数・上限(4800 や 1.05)。
- 出現頻度 → 32 / 54、spawn*Mul、rate の組み合わせ。
変更後は test/game-isekai-shooting/README.md の定数一覧と整合を取ると、後から追いやすくなります。
8. 関連リンク
- 異世界シューティング(プレイ)
- 異世界シューティングの記録(デプロイ・ポイント連携・全画面など)
← 立ち上げストーリー
← プログラム構築の記録
← デプロイの記録
← ボタン1つデプロイの記録
← デプロイでまたハマった話
← ログイン設定の記録
← 改善記録
← ファイル紹介の使い方
← OGP・SEOの記録
← 統合ログインの設計・経緯
← Search Console・サイトマップ
← 環境変数・.env の管理
← Git 入門・インストール
← インストール後に Git で行う設定
← カード神経衰弱の記録
← 異世界シューティングの記録
← 異世界戦記(全画面・迷路レイアウト)の記録
← 複数人でのゲーム進行
← 異世界衰弱(不具合の修正)
← 異世界衰弱(機能別フローチャート)
← 異世界ポイントの活用について
← 異世界ポイント市場の実装記録