【マイレース開発記録(6)】phase設計の試行錯誤                      

ユリウス日と天体計算が安定し、
スピードのロジックもある程度形になりました。

けれど、レースを動かしてみると違和感がありました。

確かに順位は変わる。
でも、どこか単調。

私はこのアプリを、

「流れ」だけでなく
「リズム」も見えるもの

にしたかったはずでした。

そこで必要になったのが、phase(フェーズ)設計です。

フェーズとは、周期の中での“位置”です。

例えば、

  • 月の周期(約29.5日)
  • 火星の周期(約687日)

といった周期を持つ天体は、
常にぐるぐると回り続けています。

この「何周目のどの位置か」を
0〜1の値に正規化したものがフェーズです。

私はまず、非常に単純な式を書きました。

def calc_phase(days, period):
return (days % period) / period

理論的にはきれいです。

  • 周期の中の現在位置
  • 常に0〜1の範囲

しかし、ここからが試行錯誤の始まりでした。

最初は、すべてのテーマを月フェーズで統一しようとしました。

しかし、それでは動きが似通ってしまいます。

そこで分けました。

  • 恋愛・健康 → 月(29.5日)
  • 勝負・仕事 → 火星(687日)

こうすることで、

  • 短期的な揺れ
  • 長期的な流れ

を同時に表現できるようになりました。

ここでようやく、

外の流れ(スピード)× 内側のリズム(フェーズ)

という構造が安定しました。

フェーズは0〜1の数値です。

しかしそのままでは面白くありません。

私はそれを「ジャンプ」に変換しました。

rhythm = (phase - 0.5) * 2

これで値は -1.0 〜 +1.0 の範囲になります。

さらに補正をかけます。

return -rhythm * 0.15

これが「ゴール直前のジャンプ補正」です。

ただし、ここも簡単ではありませんでした。

最初は ±0.3 にしていました。

すると、

  • 順位がフェーズに引きずられすぎる
  • スピードの意味が薄れる

次に ±0.05 にすると、

  • ほとんど差が出ない
  • ジャンプが体感できない

最終的に ±0.15 に落ち着きました。

ここで私が学んだのは、

数式の正しさより、体験の自然さ

が重要だということです。

ロジックは正しくても、
ユーザーが「しっくり来ない」と意味がない。

フェーズから「跳ねているかどうか」を判定するために、

phase > 0.65

という閾値を設けました。

これもかなり試しました。

  • 0.5 だと頻繁に跳ねすぎる
  • 0.8 だとほとんど跳ねない

0.65 に落ち着いたのは、

  • 適度に変化がある
  • でも暴れすぎない

というバランスを取れたからです。

設計とは、

美しい式を作ることではなく、
振る舞いを調整すること
だと実感しました。

phase設計では、

  • 周期の選定
  • 正規化
  • 値域変換
  • 補正値調整
  • 閾値設計

と、想像以上に多くの検討が必要でした。

私は発達特性の影響で、

  • 数式にこだわりすぎる
  • 一部を最適化しすぎる
  • 全体バランスを見失う

傾向があります。

しかし今回は、

AIとの対話を通じて、

  • いま何を最適化しているのか
  • 目的は何か
  • ユーザー体験に寄与しているか

を常に言語化しました。

その結果、

理論と体験のバランスを取る設計にたどり着けました。

12月1日から始まった設計フェーズ。

  • 思想を整理し
  • ロジックを迷走し
  • 天体計算に詰まり
  • 時間概念と格闘し
  • 周期をモデル化した

ここまでで、ようやく
設計の土台が完成しました。

次の記事では、バックエンド実装とAPI設計に入っていきます。

【マイレース開発記録(7)】Flask API設計

ロジックが“概念”から“コード”へと固定される過程を書いていきます。

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です