【マイレース開発記録(20)】メッセージロジック最終版                              

マイレースでは、レースの結果として「順位」「タイム」「ジャンプ状態(HIGH / NORMAL / LOW)」が表示されます。

しかし、これだけではただのミニゲームの結果に近くなってしまいます。

このアプリは「占いとして眺めるツール」にしたかったため、結果をどう読み取るかのヒントになる言葉を表示する仕組みを作る必要がありました。

そこで導入したのが、ゾーンとメッセージを組み合わせたロジックです。

マイレースでは、
各レーンの状態を次の2つで判断しています。

  • スピード(外側の流れ)
  • ジャンプ(内側のリズム)

この2つの組み合わせから、
その日の状態を 4つのゾーンに分類します。

マイレースでは、
各レーンの状態を次の2つで判断しています。

  • スピード(外側の流れ)
  • ジャンプ(内側のリズム)

この2つの組み合わせから、
その日の状態を 4つのゾーンに分類します。

外の流れ内側のリズムゾーン
速い高い追い風ゾーン
速い低い慎重ゾーン
遅い高い楽しさ重視ゾーン
遅い低い整えるゾーン

この判定は、JavaScript 側で次のような関数として実装しています。

function detectZone(isFast, isJump){
if(isFast && isJump) return "tailwind";
if(isFast && !isJump) return "steady";
if(!isFast && isJump) return "playful";
return "rest";
}

このゾーンをベースにして、表示するメッセージを決めています。

メッセージは、ゾーンごとにいくつかの候補を用意しています。

例えば「追い風ゾーン」は次のような構造です。

tailwind: {
common: [
"追い風。流れに乗って進めそう",
"自然に道が開いていく感覚の日",
"考えるより、動いた方がうまくいく",
"偶然が味方になるタイミング",
"周囲の期待に素直に応えて吉",
"一歩踏み出すと、次が見える"
],
first: "今日は主役。堂々と前に出て"
}

ここでは

  • common
    → 通常メッセージ
  • first
    → 1位専用メッセージ

という形で分けています。

これによって、
「1位になったときだけ特別な言葉を出す」
という演出ができるようになりました。

メッセージの選択は次のルールで行っています。

  1. 1位で、専用メッセージがある場合
  2. それ以外はゾーンの common からランダム

JavaScriptでは次のような関数です。

function pickMessage(zone, rank){
const table = MESSAGE_TABLE[zone];

if(rank === 1 && table.first){
return table.first;
}

return table.common[
Math.floor(Math.random() * table.common.length)
];
}

これにより、

  • 同じゾーンでも毎回同じ文章にならない
  • 1位だけ少し特別な演出になる

というバランスを作ることができました。

バックエンドでは、ゾーンとメッセージの index を生成しています。

message_meta[key] = {
"zone": zone,
"index": msg_index
}

この設計にした理由は、
将来的に次のような拡張を想定しているためです。

  • メッセージを固定する(同じ条件なら同じ文章)
  • ローカライズ対応
  • メッセージ管理をサーバー側に移す

現在は JavaScript 側でメッセージを選んでいますが、
将来的には Python側で完全制御する設計にすることもできます。

このメッセージロジックは、実装よりも 設計の整理に時間がかかりました。

特に悩んだのは次の点です。

  • ゾーンをどこで判定するか
  • メッセージをフロントで持つかサーバーで持つか
  • ランダムにするか固定にするか

AIとの対話を通じて、

  • ロジックを言語化する
  • 設計を分解する
  • 実装方法を比較する

という作業を繰り返しながら、少しずつ形にしていきました。

AIにコードを書かせるというより、設計の壁打ち相手として使った場面が多かった部分です。

マイレースでは、未来を断定する占いにはしたくありませんでした。

そのためメッセージは、

  • 強い断定をしない
  • 行動を命令しない
  • 状態をそっと示す

という方針で書いています。

例えば、「今日は成功する日です」ではなく、

「流れに乗りやすい日」という表現にしています。

結果を当てにいくのではなく、今の自分を眺めるためのヒントとして使えるようにしたかったからです。

メッセージロジックが整ったことで、アプリとしての形がかなり見えてきました。

レースの演出だけだった段階から、

  • 状態を読み取る
  • メッセージで意味づけする
  • ユーザーが自分の状態を眺める

という流れが完成してきました。

このあと仕上げ段階では、

  • UIとUXの調整
  • スコアボードの演出
  • バグの洗い出し

といった部分を整えていきます。

次の記事は

【マイレース開発記録(21) UIとUXの再設計】

として、

  • フォームのレイアウト
  • レース画面の見やすさ
  • ゾーン表示の演出

など、ユーザー体験をどう調整していったかを書いていきます。

\ 最新情報をチェック /

コメントを残す

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