← Notes

/ CLOUDFLARE / GAME

「99+を消せ!」の共有カウンターで二重計上を防ぐ

ゲームの爽快感を止めずに、通知バッジの数値を共有集計する。バッチ送信、署名チケット、再送への対応。

スコアと消した通知の数値は別物

「99+を消せ!」は通知バッジをタップやスワイプで消していくゲームです。自分のスコアとは別に、みんなで消した通知を累計として表示する仕組みがあります。

初期版ではバッジの枚数を数えていましたが、後から「バッジに書かれた数値の合計」を集計する方式を追加しました。例えば1、5、9、24を消した場合は4枚ではなく合計39として扱います。旧データは元の数値が分からないため、無理に換算せず別管理にしています。

毎タップ送信しない理由

連続タップや連鎖では短い時間に多数のイベントが起こります。1回ずつデータベースに保存すると通信量が増え、回線が不安定なときにゲーム操作まで影響を受けやすくなります。

そこで通知をまとめてバッチ送信します。サーバーでは受け取った種類別件数から数値合計を再計算し、クライアントから送られた単純な「合計値」をそのまま信用しないようにしています。

再送しても増えすぎない仕掛け

通信が途中で失敗した場合、同じバッチをもう一度送れる必要があります。しかしそのたびにカウンターを足すと数値が二重になります。各プレイを識別するIDと連番を組み合わせ、Cloudflare D1の一意制約とトリガーで重複を防いでいます。

署名付きチケット、送信量の上限、前回バッチとの整合性確認、レート制限も併用します。これらは不自然な更新を減らす仕組みですが、公開ブラウザゲームなのでプレイヤーの行動そのものを完全に証明できるわけではありません。

ゲームを止めないことも要件

集計APIが使えないときでも、ゲームそのものは遊べるように設計しています。画面の共有累計はサーバーが受理した分なので、通信失敗やページをすぐ閉じた場合には一部が反映されないことがあります。

遊びやすさと正確さ、運営コストの折り合いを取ることが、小さなゲームの裏側でも重要でした。

制作メモ一覧へ戻る ←