新入社員、オセロを同時に何組でも対戦できるようにする

こんにちは。シンメトリック新入社員の田中です。今週はオセロのルーム機能を実装し、大勢での対戦を可能にしました。

新入社員、選択を間違える

現在、私が作ったオセロでは、なんとかオセロっぽくゲームをすることが出来ています。 しかし、今の状態のオセロでは最大で1組(2人)しか一度にオセロをすることが出来ません。

その状態では7月1日に行われる会社内でのオセロ大会ではグダってしまいます。 対戦が終わるまで次の人が使うことが出来ず、時間がかかってしまうからです。

そこで、一度に何組でもオセロが対戦できるようにしよう、と私は考えました。 それが地獄の始まりだと知らずに・・・。

ちなみにこれは研修課題の要件の中には入っていませんでした。

新入社員、盤面をたくさん作ろうとする

大勢で対戦が出来るようにといったものの、どのようにすればそれが出来るのか分かりませんでした。

そこで、まずはどのような機能が必要で、どこに問題があるのかを考えました。

私が作ったオセロではサーバ側でオセロの盤面の状態を持っていますが、その盤面が1つしか存在していません。 そのため、1組以上がゲームをしようとしても、全員が同じ盤面の状態を反映してしまいます。これが問題点1です。

images (1)

これより、サーバには1つのオセロの盤面だけではなく、対戦ごとの碁盤の情報を持ち、管理する必要があることが分かりました。

新入社員、ルームIDに旅をさせる

そこで、それぞれの対戦画面にルームIDを設定することを考えました。 それを毎回ブラウザ側からサーバ側に送ることによって、そのルームIDに紐づけられた盤面を参照し使う、というやり方にしました。

しかし、ここで詰まったことがあります。

それはルームIDをどのようにしてサーバに渡すか、でした。

先週オセロのログイン機能を実装しましたが、ログインした後、オセロの画面に遷移するときにルームIDを設定します。 その設定はサーブレットで行っているのですが、そこからWebSocketを使っているJavaに直接ルームIDを渡すことが出来なかったのです。

そのため、ルームIDを決めるサーブレットから一旦、オセロのHTMLに送り、そこからオセロのJavaScriptに送り、WebSocketを使ってオセロのJavaに送るという長いルートを移動させる必要がありました。

オセロのJavaまでルームIDを届けるために、経由するものが多く、データの受け渡しの仕方がそれぞれ異なるため非常に時間がかかりました。

データの渡し方が分からなかったり、エラーの直し方が分からなかったりと、この時はルーム機能の実装をやめようか、やめまいかの葛藤がすごかったです。

ようやく、長い道のりでしたがオセロのJavaまでルームIDを届けることが出来るようになりました。

ルームIDごとにオセロの盤面を使う処理ですが、これはHashMapを使いました。keyをルームID、valueを盤面にしました。 これによってルームIDに対応した碁盤を使えるようにしたのです。

しかし、HashMapをどこで設定して、どこで取り出すのか、またそれをどうやって書くのかが分からず、エラーと闘いながらなんとかルームごとに盤面を使えるようにしました。

新入社員、プレーヤーの管理をしたい

これで対戦が大勢で出来るようになったと思いました。しかし他にも必要な機能があったのです。

それはプレーヤーの判定です。

今まではオセロの対戦ページにアクセスしてきた時に、ブラウザのセッションをセッションリストに入れていました。 そして、1組のみの対戦を想定していたため、ブラウザにデータを送信するときは、セッションリストに入っている人全員にオセロの盤面などのデータを送っていました。

この方法は1組のみの対戦の場合では、プレーヤーの判別は必要なかったのですが、ルーム機能を使って対戦する場合は、どのプレーヤーがどのルームにいるのかを判別したうえで、それぞれに違うデータを送らなければいけませんでした。

これが問題2です。

images (1)

ユーザを判定するためには、セッションを使いました。 Javaの方でルームIDの時と同じようにHashMapを使い、keyをルームID、valueをセッションとしました。 valueにはListを使って2人分のセッションを入れました。

images (1)

新入社員、デバックのコツを知る

今までは新しいコードをドンと追加してから、確認、修正していたため、どの部分が間違っているのか分かり難く、デバックが大変でした。 そこで、新しいコードを少し追加しては確認し、修正、少し追加しては確認し、修正、という工程を繰り返して、少しずつコードを変更していくという風に意識してするようにしました。

こうすることによってデバックもやりやすく、エラーにも対処しやすくなりました。

今までは上手く動作しなかった場合、どこがどう間違っているのか分かるのにとても時間がかかり、エラーを見るたびにげんなりしていました。

しかし、細かく修正していくことによって、だんだんエラーに対して恐怖感はなくなり、うまく動作するようになった時の快感を覚えました。

来週は、ランキングを出す、プロセスを表示する部分を完成させて、サーバに上げたいと思います。