【マイレース開発記録(20)】メッセージロジック最終版
結果画面に「意味」を持たせる
マイレースでは、レースの結果として「順位」「タイム」「ジャンプ状態(HIGH / NORMAL / LOW)」が表示されます。
しかし、これだけではただのミニゲームの結果に近くなってしまいます。
このアプリは「占いとして眺めるツール」にしたかったため、結果をどう読み取るかのヒントになる言葉を表示する仕組みを作る必要がありました。
そこで導入したのが、ゾーンとメッセージを組み合わせたロジックです。
「速さ」と「ジャンプ」でゾーンを決める
マイレースでは、
各レーンの状態を次の2つで判断しています。
- スピード(外側の流れ)
- ジャンプ(内側のリズム)
この2つの組み合わせから、
その日の状態を 4つのゾーンに分類します。
マイレースでは、
各レーンの状態を次の2つで判断しています。
- スピード(外側の流れ)
- ジャンプ(内側のリズム)
この2つの組み合わせから、
その日の状態を 4つのゾーンに分類します。
| 外の流れ | 内側のリズム | ゾーン |
|---|---|---|
| 速い | 高い | 追い風ゾーン |
| 速い | 低い | 慎重ゾーン |
| 遅い | 高い | 楽しさ重視ゾーン |
| 遅い | 低い | 整えるゾーン |
この判定は、JavaScript 側で次のような関数として実装しています。
JavaScript
function detectZone(isFast, isJump){
if(isFast && isJump) return "tailwind";
if(isFast && !isJump) return "steady";
if(!isFast && isJump) return "playful";
return "rest";
}
このゾーンをベースにして、表示するメッセージを決めています。
メッセージテーブルの設計
メッセージは、ゾーンごとにいくつかの候補を用意しています。
例えば「追い風ゾーン」は次のような構造です。
JavaScript
tailwind: {
common: [
"追い風。流れに乗って進めそう",
"自然に道が開いていく感覚の日",
"考えるより、動いた方がうまくいく",
"偶然が味方になるタイミング",
"周囲の期待に素直に応えて吉",
"一歩踏み出すと、次が見える"
],
first: "今日は主役。堂々と前に出て"
}
ここでは
- common
→ 通常メッセージ - first
→ 1位専用メッセージ
という形で分けています。
これによって、
「1位になったときだけ特別な言葉を出す」
という演出ができるようになりました。
メッセージ選択のロジック
メッセージの選択は次のルールで行っています。
- 1位で、専用メッセージがある場合
- それ以外はゾーンの common からランダム
JavaScriptでは次のような関数です。
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位だけ少し特別な演出になる
というバランスを作ることができました。
Python側との連携
バックエンドでは、ゾーンとメッセージの index を生成しています。
Python
message_meta[key] = {
"zone": zone,
"index": msg_index
}
この設計にした理由は、
将来的に次のような拡張を想定しているためです。
- メッセージを固定する(同じ条件なら同じ文章)
- ローカライズ対応
- メッセージ管理をサーバー側に移す
現在は JavaScript 側でメッセージを選んでいますが、
将来的には Python側で完全制御する設計にすることもできます。
AIとの開発で助けられた部分
このメッセージロジックは、実装よりも 設計の整理に時間がかかりました。
特に悩んだのは次の点です。
- ゾーンをどこで判定するか
- メッセージをフロントで持つかサーバーで持つか
- ランダムにするか固定にするか
AIとの対話を通じて、
- ロジックを言語化する
- 設計を分解する
- 実装方法を比較する
という作業を繰り返しながら、少しずつ形にしていきました。
AIにコードを書かせるというより、設計の壁打ち相手として使った場面が多かった部分です。
「占いらしさ」をどう作るか
マイレースでは、未来を断定する占いにはしたくありませんでした。
そのためメッセージは、
- 強い断定をしない
- 行動を命令しない
- 状態をそっと示す
という方針で書いています。
例えば、「今日は成功する日です」ではなく、
「流れに乗りやすい日」という表現にしています。
結果を当てにいくのではなく、今の自分を眺めるためのヒントとして使えるようにしたかったからです。
この段階で見えてきたもの
メッセージロジックが整ったことで、アプリとしての形がかなり見えてきました。
レースの演出だけだった段階から、
- 状態を読み取る
- メッセージで意味づけする
- ユーザーが自分の状態を眺める
という流れが完成してきました。
このあと仕上げ段階では、
- UIとUXの調整
- スコアボードの演出
- バグの洗い出し
といった部分を整えていきます。
次回予告
次の記事は
として、
- フォームのレイアウト
- レース画面の見やすさ
- ゾーン表示の演出
など、ユーザー体験をどう調整していったかを書いていきます。


