/ CLOUDFLARE / GAME
「99+を消せ!」の共有カウンターで二重計上を防ぐ
ゲームの爽快感を止めずに、通知バッジの数値を共有集計する。バッチ送信、署名チケット、再送への対応。
スコアと消した通知の数値は別物
「99+を消せ!」は通知バッジをタップやスワイプで消していくゲームです。自分のスコアとは別に、みんなで消した通知を累計として表示する仕組みがあります。
初期版ではバッジの枚数を数えていましたが、後から「バッジに書かれた数値の合計」を集計する方式を追加しました。例えば1、5、9、24を消した場合は4枚ではなく合計39として扱います。旧データは元の数値が分からないため、無理に換算せず別管理にしています。
毎タップ送信しない理由
連続タップや連鎖では短い時間に多数のイベントが起こります。1回ずつデータベースに保存すると通信量が増え、回線が不安定なときにゲーム操作まで影響を受けやすくなります。
そこで通知をまとめてバッチ送信します。サーバーでは受け取った種類別件数から数値合計を再計算し、クライアントから送られた単純な「合計値」をそのまま信用しないようにしています。
再送しても増えすぎない仕掛け
通信が途中で失敗した場合、同じバッチをもう一度送れる必要があります。しかしそのたびにカウンターを足すと数値が二重になります。各プレイを識別するIDと連番を組み合わせ、Cloudflare D1の一意制約とトリガーで重複を防いでいます。
署名付きチケット、送信量の上限、前回バッチとの整合性確認、レート制限も併用します。これらは不自然な更新を減らす仕組みですが、公開ブラウザゲームなのでプレイヤーの行動そのものを完全に証明できるわけではありません。
ゲームを止めないことも要件
集計APIが使えないときでも、ゲームそのものは遊べるように設計しています。画面の共有累計はサーバーが受理した分なので、通信失敗やページをすぐ閉じた場合には一部が反映されないことがあります。
遊びやすさと正確さ、運営コストの折り合いを取ることが、小さなゲームの裏側でも重要でした。