← トップページに戻る

異世界シューティングの難易度
difficultyProgressrate・スポーンとスクロール

テスト環境の縦スクロールシューティング「異世界シューティング」では、難易度が単一の「ステージ係数」ではなく、複数の式が同時に効きます。本記事は実装の正として 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 × progSCROLL_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_RAMPprog の係数。
  • スコアだけで上げたい → DIFFICULTY_SCORE_RAMP、または rate の係数・上限(48001.05)。
  • 出現頻度32 / 54spawn*Mulrate の組み合わせ。

変更後は test/game-isekai-shooting/README.md の定数一覧と整合を取ると、後から追いやすくなります。

8. 関連リンク

← 立ち上げストーリー
← プログラム構築の記録
← デプロイの記録
← ボタン1つデプロイの記録
← デプロイでまたハマった話
← ログイン設定の記録
← 改善記録
← ファイル紹介の使い方
← OGP・SEOの記録
← 統合ログインの設計・経緯
← Search Console・サイトマップ
← 環境変数・.env の管理
← Git 入門・インストール
← インストール後に Git で行う設定
← カード神経衰弱の記録
← 異世界シューティングの記録
← 異世界戦記(全画面・迷路レイアウト)の記録
← 複数人でのゲーム進行
← 異世界衰弱(不具合の修正)
← 異世界衰弱(機能別フローチャート)
← 異世界ポイントの活用について
← 異世界ポイント市場の実装記録