Starship Sim は、単一の HTML ファイルで完全に動作する 2次元宇宙戦闘シミュレーションアプリです。
- 外部ライブラリなし - Vanilla JavaScriptのみで実装
- 即座に実行可能 - ブラウザで index.html を開くだけで動作
- 物理ベース - 慣性・加速・回転などリアルな物理演算を実装
- モジュラー艦船設計 - 船体・エンジン・武器・レーダーを組み合わせて多様な艦を構成
- 決定論的AI - すべてのチームが統一ルールに従って自動で動く
- 複数テストシーン - 5種類の異なる艦隊構成でシミュレーション実行可能
3チームの艦隊が同時に自動戦闘を繰り広げる様子。左上でテストシーンを選択、右上でビーコン操作チームを選択し、画面をクリックしてビーコンを配置することでシミュレーションを制御します。
- ファイル形式: 単一の HTML ファイル(
index.html) - 実行方法: ブラウザで
index.htmlを開くだけ - 実行時依存: なし(外部ライブラリ不要)
- 開発時依存: Node.js(ビルド時のみ)
- 総行数: 約 2,016 行(HTML + CSS + JavaScript 一体)
- クラス数: 11 個
- 技術: Canvas API + requestAnimationFrame + vanilla JavaScript
このプロジェクトは以下を実証・実験するための研究的シミュレーターです:
-
物理エンジンの実装
- 慣性・加速・減速・回転
- 摩擦(毎フレーム速度の 2% を減速)
- 画面端での斥力
-
AI 戦闘ロジック
- 敵認識・追跡・目標選択
- 決定論的な自動制御(乱数なし)
-
モジュラー艦船設計
- 船体 + エンジン + 武器 + レーダーの組み合わせ
- コスト(重量)ベースのバランスシステム
配布物は従来どおり index.html 単体です。
開発時は分割ソースを編集し、ビルドで index.html を再生成します。
- テンプレート:
index-src.html - CSSソース:
src/css/app.css - TypeScriptソース:
src/ts/main.tssrc/ts/components.tssrc/ts/projectiles-effects.tssrc/ts/starship.tssrc/ts/scenes.tssrc/ts/game-loop.ts
- 開発実行用JS(ビルド生成):
src/js/main.jssrc/js/components.jssrc/js/projectiles-effects.jssrc/js/starship.jssrc/js/scenes.jssrc/js/game-loop.js
- ビルドスクリプト:
scripts/build.mjs
開発中の素早い確認:
# ブラウザで index-src.html を直接開いて動作確認配布用単一ファイルの再生成:
npm run buildユーティリティテストの実行(Vitest):
npm testTypeScript 型チェック:
npm run typecheck- HTML の
<title>はstarship-sim : Starship Simulationを固定値とする index-src.html/index.htmlのタイトルは、明示的な合意がない限り変更しない
画面上で 3 チームの艦隊が同時に戦闘します:
| チーム | 色 | 制御方式 |
|---|---|---|
| チーム A | 水色 | ビーコン操作 + 自動AI |
| チーム B | 桃色 | ビーコン操作 + 自動AI |
| チーム C | 黄色 | ビーコン操作 + 自動AI |
艦船 = 船体 × 1
+ 推進エンジン × 1
+ 射撃ユニット × 1~2
+ レーダー × 1
各コンポーネントは独立した HP を持ち、破壊されると段階的に機能喪失します。
- 索敇 - レーダー範囲内(120~200px)で敵を認識
- 追跡 - 敵に向かって加速・回転
- 射撃 - 距離と角度が条件を満たしたら自動発火
- ダメージ - 被弾時に HP 低下、要素破壊時は機能喪失
- 破壊 - 最後のユニット破壊時に爆発
- テストシーン選択 - 画面左上のボタンで艦隊構成を選択
- ビーコン操作モード選択 - 画面右上で対象チームを選択
- ビーコン配置 - 画面をクリック/タッチして検出ビーコンを配置
- シミュレーション開始 - ビーコン配置時点で自動開始
検出ビーコン内に入ったユニットは自動的に活性化され、周囲を索敇・攻撃開始します。
| クラス | 用途 | 主なパラメータ |
|---|---|---|
HullA |
標準船体 | HP: 100, 重さ: 1 |
HullB |
大型船体 | HP: 300, 重さ: 3 |
HullC |
軽巡船体 | HP: 500, 重さ: 5 |
ThrusterEngine |
推進エンジン | 推進力: 0.15, 旋回: 0.1 rad/frame |
RadarA |
レーダーA | 探知距離: 120 |
RadarB |
レーダーB | 探知距離: 160 |
RadarC |
レーダーC | 探知距離: 200 |
IndependentTurretA |
砲塔A | HP: 100, 射撃間隔: 60f |
IndependentTurretB |
砲塔B | HP: 150, 射撃間隔: 60f |
IndependentTurretC |
砲塔C | HP: 200, 射撃間隔: 90f |
| クラス | 用途 |
|---|---|
Starship |
複数コンポーネントを統合した艦船 |
Bullet |
弾丸(最大 300 フレーム存在) |
Particle |
パーティクル(爆発エフェクト) |
DetectionBeacon |
検出ビーコン |
プリセット構成で異なる艦隊構成をテストできます:
- L1D2C8 - 3チーム混合艦隊戦(各チーム L1 + D2 + C8)
- C8vsD2 - コルベット8隻 vs 駆逐艦2隻
- L1vsD2 - 軽巡洋艦1隻 vs 駆逐艦2隻
- Mass D1C8 - 大規模編成戦(上下2陣営)
- L1D4C16 - 3チーム混合艦隊戦(各チーム L1 + D4 + C16)
各シーン選択時に艦隊が自動配置され、すぐにシミュレーションが開始されます。
| パラメータ | 値 |
|---|---|
| 最高速度 | 2.0 u/frame |
| 標準加速 | 0.5 u/frame² |
| 減速(摩擦) | 毎フレーム速度の 2% |
| 旋回速度 | 0.1 rad/frame(標準) |
| パラメータ | 値 |
|---|---|
| 斥力範囲 | 画面端から 50px |
| 最大斥力 | 0.05 u/frame² |
| パラメータ | 値 |
|---|---|
| 索敇範囲(レーダー) | 120~200px |
| 射撃間隔(標準) | 60 フレーム |
| 射撃間隔(高火力) | 90 フレーム |
| ダメージ(1発) | 10~20 |
画面上に以下の情報がリアルタイム表示されます:
- 艦船の状態: 位置・速度・回転角度
- HP 情報: 全体 HP・各コンポーネント HP
- 戦闘情報: 敵艦数・残弾数
- HP バー: HP 状態を色で表示
- 緑: HP > 30%
- 赤: HP ≤ 30%
- パーティクル爆発 - 艦船破壊時に発生
- 破損表示 - 破損ユニットをオレンジ色の破線円で表示
- トレイル - 弾丸の軌跡表示
このプロジェクトが外部ライブラリに依存しない理由:
- 即座の共有性 - ファイル 1 つで配布可能
- 教育的価値 - コード全体が 1 ファイルで即座に理解可能
- オフライン実行 - ネットワーク接続不要
- 実験性 - 配布は単一HTMLのまま、開発時のみビルド導入で迅速に改善可能
- 透明性 - すべてのロジックがオープン(ブラックボックスなし)
starship-sim/
├── index-src.html # 開発用テンプレート
├── index.html # 配布用単一ファイル(ビルド生成物)
├── src/
│ ├── css/app.css # 開発用CSS
│ ├── ts/
│ │ ├── main.ts # TypeScriptソース
│ │ ├── catalog.ts
│ │ ├── components.ts
│ │ ├── projectiles-effects.ts
│ │ ├── starship.ts
│ │ ├── scenes.ts
│ │ ├── game-loop.ts
│ │ └── teams.ts
│ └── js/
│ ├── main.js # ビルド生成JS(開発実行用)
│ ├── catalog.js
│ ├── components.js
│ ├── projectiles-effects.js
│ ├── starship.js
│ ├── scenes.js
│ ├── game-loop.js
│ └── teams.js
├── scripts/build.mjs # 単一HTML生成スクリプト
├── package.json # npm scripts(build)
├── tsconfig.json # TypeScript設定
├── README.md # プロジェクト説明
├── BUILD_PROCESS.md # ビルド方式の設計
├── ARCHITECTURE.md # 設計方針と技術決定
├── SHIP_TYPES.md # 艦船の仕様定義
├── UNIT_TYPES.md # コンポーネント仕様一覧
├── SCREEN.md # 画面構成ガイド
├── DETECTION_LOGIC.md # 索敇・目標選択ロジック
├── TODO.md # 拡張予定
└── LICENSE # MIT License
このプロジェクトから学べること:
- 物理エンジンの実装 - 2D 物理シミュレーションの基礎
- ゲームループ設計 - requestAnimationFrame を使った効率的な描画ループ
- AI 制御 - 決定論的な NPC 動作・目標選択アルゴリズム
- モジュラー設計 - コンポーネントの組み合わせによる柔軟な拡張性
- Canvas API - ブラウザネイティブなグラフィックス描画
- イベント駆動設計 - マウス/タッチ入力の処理
Starship Sim は、シンプルながら奥深い物理演算とゲーム AI を備えた、教育的かつ実験的なシミュレーションです。
単一 HTML ファイルという制約の中で、複雑なゲームロジックを実装する優れた事例として、また新しい艦設計や AI アルゴリズムを迅速にテストするプラットフォームとして機能しています。
| 呼称 | 正式名 | 説明 |
|---|---|---|
| 船種C | 搭載艦(Corvette) | 小型艦。1つの射撃ユニットを搭載 |
| 船種D | 駆逐艦(Destroyer) | 大型艦。2つの射撃ユニットを搭載 |
| 船種L | 軽巡洋艦(Light Cruiser) | 大型艦。3つの射撃ユニットを搭載 |
各コンポーネントのコストは重量に一致します:
- 船体A(HullA): コスト1(重量1)
- 船体B(HullB): コスト3(重量3)
- 船体C(HullC): コスト5(重量5)
- 標準推進エンジン: コスト1(重量1)
- 砲塔A (IndependentTurretA): コスト1(重量1)
- 砲塔B (IndependentTurretB): コスト2(重量2)
- 砲塔C (IndependentTurretC): コスト4(重量4)
- レーダーA (Radar A): コスト0(重量0)
- レーダーB (Radar B): コスト1(重量1)
- レーダーC (Radar C): コスト2(重量2)
艦隊構成別コスト
- 船種C(Corvette): 1 + 2 + 1 + 0 = コスト4
- 船種D(Destroyer): 3 + 4 + 2 + 1 = コスト10
- 船種L(Light Cruiser): 5 + 12 + 3 + 2 = コスト22
- 艦のサイズ: 12 ピクセル
- 最高速度: 2 u/frame
- 回転速度: 0.1 rad/frame(標準推進エンジン)
- スラスタ出力: 0.05 u/frame²
- 推力調整: 目標方向との角度差に応じて 0~100% に調整
- 摩擦: 毎フレーム速度の 2% を減速
- 斥力範囲: 画面端から 50 ピクセル
- 最大斥力: 0.05 u/frame²
- 敵艦の目標修正: 画面端近くで中央方向に 60% 修正
MIT License
