参加者がスマートフォンの加速度センサーを使用して、線香花火を揺らさないようにするマルチプレイヤーウェブゲーム。最後まで線香花火を燃やし続けた人が勝ち!
temochiHanabi/
├── server.py # Flask + SocketIO メインサーバー
├── game_state.py # ゲーム状態管理, プレイヤー管理
├── requirements.txt # Python依存関係
├── templates/
│ ├── host.html # ホスト用ダッシュボード画面
│ └── play.html # プレイヤー用ゲーム画面
├── static/
│ ├── styles.css # グローバルスタイルシート
│ ├── host.js # ホスト側 JavaScript ロジック
│ ├── player.js # プレイヤー側 JavaScript ロジック
│ └── sparkler.js # 線香花火粒子アニメーションエンジン
└── README.md # このファイル
Python 3.8+ がインストールされていることを確認してください。
cd temochiHanabi
python -m venv venvvenv\Scripts\activatesource venv/bin/activatepip install -r requirements.txtpython server.pyサーバーは http://localhost:5000 で起動します。
ブラウザで以下にアクセス:
http://localhost:5000/host
-
ホスト画面に表示されたQRコードをスマートフォンで読み込む
-
または直接以下にアクセス(
<host_ip>はサーバーのIP):http://<host_ip>:5000/play -
iOSの場合: DeviceMotionEvent 権限を許可してください
-
待機フェーズ:
- ホストが QR コードを表示
- 参加者がQRコードから参加
-
ゲーム開始:
- ホストが「ゲームスタート」ボタンをクリック
- 参加者の画面に線香花火が表示される
-
ゲーム進行中:
- 参加者がスマートフォンをなるべく揺らさないようにする
- 加速度センサーデータがサーバーに送信され、スコアが累積される
- ホスト画面に全員の線香花火が表示される
-
ゲーム終了:
- スコアが閾値(デフォルト: 200)を超えたプレイヤーが脱落
- 最後の1人が優勝
- バックエンド: Python Flask + Flask-SocketIO (WebSocket通信)
- フロントエンド: Vanilla HTML/CSS/JavaScript (フレームワーク不要)
- 通信: WebSocket (リアルタイム同期)
- アニメーション: Canvas 2D (粒子効果)
server.py の GameSession クラスで以下を調整できます:
elimination_threshold: float = 200.0 # 脱落スコア閾値(高いほど難易度が低い)player.js でも確認できます:
scoreThreshold = 200;プレイヤー画面でデバッグ情報を表示したい場合、ブラウザのコンソールで以下を実行:
document.getElementById('debugInfo').style.display = 'block';加速度センサーのリアルタイムデータが表示されます。
- サーバーが正常に起動しているか確認
/qrエンドポイントが正常に動作しているか、ブラウザコンソールでエラーを確認
- ホストとプレイヤーが同じWiFiネットワークに接続しているか確認
- ファイアウォール設定を確認(ポート 5000 が許可されているか)
- ホスト IP アドレスが正しいか確認(
ipconfigで確認)
- iOS 13+の場合は権限許可ダイアログが表示されるはず
- Android: 設定 > アプリ権限 > センサー アクセスが許可されているか確認
- デバイスが加速度センサーに対応しているか確認
- ブラウザコンソールでエラーメッセージを確認
http://localhost:5000/socket.io/にアクセスして、Socket.IOが正常に動作しているか確認
- クライアントとサーバーのSocket.IOプロトコル版が不一致のときに出ます
- 本プロジェクトは Socket.IO v4 クライアントを使用するように修正済みです(
templates/host.html,templates/play.html) - 端末側ブラウザで強制再読み込みを実施してください(キャッシュされた古いJSを使っている場合があります)
- スマホで改善しない場合は、ブラウザのサイトデータ削除後に再アクセスしてください
- CDNへアクセスできない閉域ネットワークでは、
/socket.io/socket.io.jsに戻す運用を検討してください
複数のデバイスでテストする場合:
-
ホスト PC のIPアドレスを確認:
# Windows ipconfig # macOS / Linux ifconfig
-
参加者は以下のURLでアクセス:
http://<Host_IP>:5000/play
- 粒子数:
SparklerAnimatorのemitRateで調整 - フレームレート: Canvas アニメーションは
requestAnimationFrameで自動最適化 - WebSocket 更新頻度:
player.jsのlastSendTime間隔で調整(デフォルト: 100ms)
- 複数ラウンドサポート
- プレイヤーレーティング / ランキング機能
- リプレイ機能
- カスタマイズ可能なテーマ・アバター
- モバイルネイティブアプリ化 (React Native等)
- ローカルストレージでのゲーム履歴保存
MIT License
TemochiHanabi Project