SY GAMESSYGAMES.NET

トップ›制作記録›対戦の勝敗は、サーバーが決める

DEV LOG — GRACE 02

対戦の勝敗は、
サーバーが決める

『GraceForsaken』には、今いるプレイヤーどうしで1手ずつ指し合う対戦があります。
対戦の計算はすべてサーバーで行っていて、そのサーバーはカオスソードガーデンのランキングで使っていたものを流用しています。

2026年10月2日 · GraceForsaken

Ⅰ最初はゴースト対戦だけだった

対戦モードは、もともとゴースト対戦だけでした。他のプレイヤーが設定した防衛パーティを、AIが動かして相手をしてくれる形です。これなら通信がいらないので、サーバーがなくても作れます。

ただ、AI相手だとどうしても読み合いが薄くなります。こっちが並べた隊列を見て、相手が考えて動かしてくる。それをやりたくて、リアルタイム対戦を足すことにしました。

ストーリーやゴースト対戦と違って、これは通信なしには作れません。いきなり作らずに、まず対戦の流れ・時間切れ・通信切れの扱いを設計書に書き出してから着手しています。前の記事で書いた「表に起こしてから渡す」と同じ考え方です。

Ⅱブラウザには計算させない

いちばん最初に決めたのがこれでした。戦闘の計算は、プレイヤーのブラウザではなくサーバーで行います。

ブラウザ側で計算して結果だけ送る形にすると、送る結果を書き換えれば何でも通ってしまいます。なので、ブラウザは「誰が何をするか」だけを送って、ダメージも命中も勝敗も、全部サーバーが計算して両方に配ります。

面白かったのは、サーバーで動かしている戦闘のプログラムが、ストーリーやゴースト対戦で使っているものとまったく同じなことです。1つのコードをブラウザでもサーバーでも読み込んでいます。スキルの仕様を1か所直せば、ストーリーにも対戦にも同じように反映される。2つ作って食い違う心配がありません。

相手が習得しているスキルが見えない、というルールもサーバー側で守っています。使われるまでは、そもそも相手のスキルの情報をブラウザへ送りません。

Ⅲ待たせない、止まらない

人と人が対戦する以上、相手が席を外すことも、通信が切れることもあります。そのとき対戦が止まったままにならないよう、決まりを細かく作りました。

相手が見つからないMATCHING15秒待っても見つからなければ、BOT と対戦します。
配置PLACEMENT60秒以内に確定。相手の配置は戦闘が始まるまで見えません。
手番の時間切れTIMER1体の行動ごとに30秒。過ぎると自動で行動します(届く敵がいれば攻撃、いなければ前進、それも無理なら待機)。
放置AFK3回続けて時間切れになると敗北です。
通信切れRECONNECT30秒以内に戻れば続きから。ページを開き直しても自動で復帰します。

自動行動は当初、時間切れ専用でした。プレイヤーが自分で「待機」を選ぶことはできなかったんです。あとから「対戦でも待機したい」と修正を入れて、いまは選べるようにしています。

もうひとつ、あとから変えたのが判定までのラウンド数です。決着がつかなかったときは、残りHPの割合が多いほうの勝ちにしています。最初はこれを30ラウンドにしていたんですが、さすがに長すぎました。いまは10ラウンドです。

Ⅳランキングのサーバーに相乗りさせた

サーバーは新しく借りていません。カオスソードガーデンの全プレイヤー共通のランキングを動かしている、クラウドの小さなサーバーをそのまま流用して、同じ1台に同居させています。

そのぶん条件ははっきりしていて、「既存のランキングを止めないこと」です。対戦用のプログラムはランキングとは別に動かして、更新のたびにランキングが生きているかも確認しています。

作業そのものは、Claude Code にサーバーへ接続してもらって進めました。自分がやったのは、ドメインの管理画面で対戦用のアドレスを追加したことくらい。暗号化通信の証明書の取得と自動更新の確認、ランキングが生きているかの確認まで、手順ごとにやってもらっています。

ただ、公開に関わる操作だけは、毎回こちらが確認してからにしています。サイトへの反映もサーバーの更新も、「進めてください」と言うまでは手元で止めてもらう。止まった状態で中身を見て、良ければ進める。この線引きは最後まで変えませんでした。

Ⅴテストのほうが間違っていた

対戦は、ひとりで遊んで確かめるのが難しい機能です。そこで、BOT どうしを自動で何十試合も対戦させるテストを用意してもらいました。最後まで決着するか、両者の勝敗が食い違っていないか、時間切れや通信切れが決まりどおりに扱われるか。これを毎回の更新で流しています。

このテストが一度、失敗しました。対戦で待機を選べるようにした直後のことです。何試合か、時間内に決着しない。

原因を調べてもらうと、ゲームのほうは何も壊れていませんでした。テスト用の BOT は「なるべく攻撃を選ぶ」ように作ってあったんですが、その「攻撃っぽい行動」の中に、新しく増えた待機が入ってしまっていたんです。BOT が攻撃と同じくらいの頻度で待機するので、試合がいつまでも終わらない。BOT の選び方を直したら、30試合とも決着しました。

仕様を足すと、ゲームだけじゃなくテストの前提も一緒に変わるんですよね。テストが赤くなったからといって、いつもゲームが悪いとは限らない。原因まで追ってもらってから直すようにしていて良かったと思いました。

PREV‹ 型のあるジャンルを、表から作る NEXT倒れた瞬間に、状態がぜんぶ消えていた ›

ゲームを始める 遊び方を読む 制作記録の一覧へ