通信が切れた時の動き

『トランプ・ナポレオン』に通信対戦機能を作っていると以前の記事で書きました。

現在は通信対戦の機能を作り終え、テストを行っているところです。早ければ来週か11月の初旬にリリースできるかと思います。はじめは試験版と銘打っておこうと思っています。
マッチングをルームの作成、参加で通信対戦を行っているので、少し面倒かもしれないと感じています。全自動で通信対戦を行う機能を追加すると自分の参加したいルームに参加できなくなってしまいます。これだと誰かと遊ぶということが難しくなります。ユーザーの意見があれば対応というところですが、まずはルームの作成・参加という方式でリリースします。

通信対戦を作っていてわかったことは、進行不能になることや通信の切断への対処が難しいということです。どのような対応をするのが良いかはアプリによるので、以降の話は『トランプ・ナポレオン』についてということになります。

トランプゲームでは誰かが札を出さなくするだけで進行不能になります。通信対戦ではこれが起こると遊ぶのが苦痛になります。
対処としては時間制限をかけることで解決します。一定時間が経ったら、自動でカードを出すようにしてしまえば良いのです。
『トランプ・ナポレオン』では全員の進行を止めるような判断を行うところでは必ずそのように作ることにしました。
宣言、副官指定、カード交換、トリックでのカード選択のときには時間制限を設けています。時間制限が来たら、AIで勝手に処理を行うことにしています。

切断の対処は、注意をダイアログで表示して「なるべく切らないようにしてね」とお願いしています。これだけで済めば良いのですが、おそらくそうはいきません。

お願いしても切断されるでしょうから、その時はなんとかゲームを続けられるようにしています。ホスト(サーバーの役割があるクライアント)がいなくならなければ、クライアントが抜けても通信対戦が継続されます。ホストがいなくなった場合はどうしようもないので、クライアントが個々にゲームを続けられるようにしてあります。

まとめると、以下のような対応をしています。

<通信を切った人(アプリの中断も含む)>

  • 通信対戦は終了し、そのままオフラインでゲームを継続する。

<通信を切られた人>

  • ホストがいなくなった場合は通信対戦が終了し、そのままオフラインでゲームを継続する。
  • クライアントがいなくなった場合はそのプレイヤーはAIで処理されるようになるが、通信対戦は継続する。ただしホストだけになってしまった場合は通信対戦は終了し、そのままオフラインでゲームを継続する。
書くとそんなに処理が多くないように思います。しかしながら実際にこれを対応するのはかなり骨が折れます。