Skip to content

Repository files navigation

kakureru

広い範囲で遊ぶ「かくれんぼ」(鬼ごっこ + 缶蹴り)のスマートフォンアプリ。

GPS だけの鬼ごっこは鬼が不利になりやすい。そこで屋内でも効く測位手段(Wi-Fi の電波強度・気圧・BLE)を足して鬼側の情報量を増やし、逃走者と鬼のゲームバランスを対等にすることを狙う。

ゲームの流れ

  1. ホストがルームを作成し、遊ぶ範囲・時間・鬼を設定する。参加者は4桁コードで参加する
  2. 鬼放出待機時間のあいだ逃走者が散らばる。カウントダウンと端末の振動で放出を知らせる
  3. 鬼が逃走者を探す。捕まった逃走者は自己申告で鬼になり、鬼が増えていく

補助ルールとして、5分に1回全員が足元の写真を撮って共有する(隠れっぱなし防止)。範囲外に出るとアラートが出る。

測位の考え方

知りたいこと 手段
相手がどこにいるか(地図上) GPS
近いか遠いか BSSID ごとの Wi-Fi 電波強度と、その変化の共有
上の階か下の階か 互いの気圧の差
確実に至近距離にいるか(終盤のみ) BLE の捕捉

機能の優先順位

must

  • 逃走者と鬼が、測位した GPS の位置を地図上で互いに見られる。どの役割から見ても正確な点で表示する(以前は鬼から見た逃走者をマス目単位に丸めていたが、プレイテストを経て廃止した。issue #118)。同じ場所にいる人のピンは重ならないよう少しずつずらして並べる
  • 逃走者と鬼が互いの距離感がわかる(BSSID ごとの Wi-Fi 強度と変化の共有)
  • 鬼放出のカウントダウンと全体終了時間の共有(ゲーム時間は鬼放出後から数える)
  • 逃走者が鬼になる宣言機能(捕まったら自己申告し、鬼が増えたことが全員にわかる)

should

  • 互いが上にいるか下にいるかがわかる(気圧の値を送り続ける。開始時のキャリブレーションが必要になる可能性あり)
  • ホストが逃げる範囲を指定できる
  • 範囲外に出たときのアラート

want

  • 一定半径(GPS 測位)に入るまで距離感を表示しない
  • ルーム作成・参加まわりの作り込み
  • 終盤、鬼が BLE で逃走者の至近を確実に捕捉できる(近づくと振動)
  • 5分に1回、全員が足元の写真を撮影・共有
  • ミッション(例: GPS を1分間止める)

技術構成

  • Flutter(Dart SDK ^3.12.2)
  • 対象は Android のみ。iOS には周辺 Wi-Fi アクセスポイントをスキャンする公開 API がなく、must 機能である Wi-Fi ベースの距離感が実装できないため
  • 状態管理: flutter_hooks + Riverpod(使い分けは AGENTS.md の規約に従う)
  • データクラス: Freezed のみ
  • バックエンド: Firebase Realtime Database
  • 静的解析: very_good_analysis(strict lint)

運用上の前提

Android 9 以降、WifiManager.startScan() は 2分間に4回(実質30秒に1回)に制限される。本プロジェクトでは参加者全員が開発者オプションで「Wi-Fi スキャンのスロットル」を解除した状態で遊ぶことを前提とする。一般配布を想定した作りではない。

設計ドキュメント

  • docs/glossary.md — 用語集(ユビキタス言語)。コード上の型名・enum値はここに揃える
  • docs/scenarios.md — 集合からゲーム終了までのシナリオ(SVOC分解)
  • docs/rtdb-schema.md — Realtime Database のデータ構造
  • history/ — 作業ごとの知見の記録(日報形式)。仕様の正本ではないので、実装の根拠には使わない

Getting Started

flutter pub get
dart run build_runner build --delete-conflicting-outputs   # Freezed の生成コード
flutter run
flutter test
flutter analyze

地図タイルのAPIキー

地図は CARTO の Voyager タイルを使っている。2026年8月末以降、APIキー無しのリクエストには「API KEY REQUIRED」の透かし入りタイルが返るようになったため、開発・リリースいずれのビルドでもキーが必要。

  1. https://carto.com/basemaps/apikey で無料キーを取得する

  2. リポジトリ直下に dart_defines.example.json をコピーして dart_defines.json を作り、取得したキーを書く(このファイルは .gitignore 対象でコミットされない)

    {"CARTO_API_KEY": "取得したキー"}
  3. 実行・ビルドには必ず --dart-define-from-file=dart_defines.json を付ける(flutter run だけでなくリリースビルドも同様)。ターミナルからの実行は毎回フラグを付ける代わりに scripts/run.sh を使うと楽(中身は flutter run に --dart-define-from-file=dart_defines.json を足すだけのラッパー。dart_defines.json が無ければ警告を出して素の flutter run にフォールバックする)

    ./scripts/run.sh -d <device>          # flutter run と同じ引数を渡せる
    flutter run --dart-define-from-file=dart_defines.json   # 素のflutterコマンドを使う場合
    flutter build apk --release --dart-define-from-file=dart_defines.json

    VS Codeから実行する場合は .vscode/launch.json の "kakureru" 構成を使えば、F5でも同じフラグが自動で付く。

キー未設定でもビルド・テスト自体は失敗しない(地図に透かしが出るだけ)。CI・夜間実行など dart_defines.json を置いていない環境ではこの状態で動く。

AIエージェントで作業する場合

このリポジトリには AI コーディングエージェント向けの共通指示と安全網が入っている。作業前に AGENTS.md を読むこと。Claude Code 固有の補足は CLAUDE.md にある。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages