ブラウザでできる正体隠匿系ゲームを非プログラマがPHPで開発してみた(非公開だが)

ある日いきなり
「できる…理論的には可能だ…!!」
と思いついたので、いつもボードゲームやってる7人組の仲間のために、ブラウザでできる正体隠匿系ゲームを作った。正体隠匿系ゲームとは、人狼とかワンナイト新郎などに代表される、とにかく相手を騙す系のゲームの総称です。

自分はこれが破滅的に弱い。自分の役が与えられても何をどうロールプレイしたらいいのか毎回混乱するので、よく分からないけど事実と異なる事をひたすら言うという戦略しかとれず、気付いたらだいたい正体がバレている。むしろこれでバカスカ勝ってる人を見ると、普段からどれだけ人を騙してるんだろうと思う。ほんと尊敬する。

なお正体隠匿系ゲームは英語ではMafia Gameと言うらしい。

これより以下は、本業プログラマだったら30分で作れそうなものをさも鬼の首を獲ったかのようなテンションで紹介するのだが、世に何のインスピレーションも与えないのは承知の上で、配列の概念すらあやふやだった自分が作ったプログラムがちゃんと動いた時にやたら嬉しかったからという感動だけでこの記事を書く。
なお開発にPHPを選んだ理由は、単に自分がPHPしか知らないからである。

求めた機能

  • ゲームの度に参加者を変更できる(全員が出席できるとは限らないため)
  • 役のリストを自由に変更できる(これができれば人狼でもワンナイト新郎でもプレイできる。もちろんゴリラ人狼も可能。ウホ)
  • ゲームの度に配役をシャッフルする(誰かがボタンを押す)
  • 自分の役は他人からは見れない

作ったものの構成

  • index.php:ただのリンク集
  • settings.php:参加者と役を設定する画面
  • shuffle.php:シャッフルボタンが置いてあるだけの画面
  • room.php:参加者がそれぞれ入る画面。ここに自分の配役が表示される。ボドゲ仲間は7人なので実際は7種類ある。

処理1:参加者と役を設定する


設定画面には2種類のフォームを実装した。

  • 参加者をチェックボックスでON/OFFしてsubmit → 参加者だけのIDを書いたテキストファイルが生成
  • 役のリストをtextareaに1行1役で入力してsubmit → 役のリストが書かれたテキストファイルが生成

生まれて初めて自前でサーバ処理を書いた。最初にサーバにポコッとテキストファイルが産み落とされた瞬間は思わず「おお~…」と声が出た。嬉しかった。

役の設定部分はこんな感じ。

なお「テキストファイルとして保存する」という手段をとっているのはこの方法しか知らないからであって、最適解なのかが全く分からない。誰か教えて欲しい。

一応ささやかながら、参加者と役の数が一致していないとエラーである事を諭してくれる機能も有している。

処理2:シャッフルする


ゲームの度に誰かがボタンを押す。一番年上が押すとかそういう決め方で良い。
こういう挙動をする。

  1. 役リストのテキストファイルを配列として読み込み
  2. 配列をシャッフルして
  3. シャッフル後の役リストとして新しいテキストファイルを生成する

役リストのテキストファイルをオリジナルとシャッフル後で分けたのは、設定画面で表示している「現在設定されている役のリスト」が毎回シャッフルされるのが気持ち悪いからである。

シャッフルボタンを押したお兄さん/お姉さんが、参加者にシャッフルした旨を告げる。たぶん元気よく伝えてあげた方が盛り上がるだろう。

処理3:自分の配役を読み込む


各roomに入った参加者はリロードをする。
この時、こんな処理を行う。

  1. 自分が「参加者リストの中で何番目に該当するか」を読み、キーに格納
  2. シャッフル後の役リストの中から、上記のキーに該当する役を取得
  3. 自分の画面に表示

これでシャッフルする度に配役が更新される。

こんな感じ。

なおindexから他人の部屋に入る事がいとも簡単にできてしまうのだが、これは「そんな事をやってもゲームがおもしろくない」というただの善意によって防ぐ方針をとっている。
まともにやるとすると、room.phpに行く度にランダムに変数をとってパラメータに渡して表示を出し分け、みたいな実装になるだろうか。

公開しないのかね

「できる…理論的には可能だ…!!」
なのだが、プレイヤー名を思いっきり仲間の本名で作っちゃってるのと、サーバ負荷やセキュリティの知識がごっそり抜け落ちているのと(素人ながらXSS対策はしているが)、多分他の誰かがこういうのとっくに作っている気がするので私が公開するほどのものではない。

プログラマは尊い

こんなしょーもない機能ですら考えなきゃいけない事が多くあり、大変勉強になった。
上記の処理系統はある日ラーメンか何か食べてる時に「あ、これでできるやん」と思いつきその時点で95%くらいは出来た気になっていたが、コードに落とすうちに残りの5%を埋めるのがいかに大変かとしみじみ実感した。

これの数万倍複雑な処理を、数十万とか数百万ユーザーの利用に耐えるように、何十人何百人というチームプレーで開発するというのは自分からしたら神業としか言いようがない。仕事では自分はデザインと機能要件を書いて「オナシャス」と言う立場だが、軽々しく言ってはいかんと襟元を正される思いである。プログラマは尊い。

あとよく話題になる「プログラマの効率曲線」というやつはマジだ。

これが話題になる度に「デザイナーも同じだよ」と誰かが言い出す現象を見かけるが、これには同意しかねる。
両方経験してみて思ったが、設計やデザインがハマらない時ももちろんストレスがあるが、エラーで動かないプログラムという「価値ゼロの状態」で放置せざるを得ない状況のストレスは比べ物にならない。マジな話これ作ってる間、バグフィックスの手段をあれやこれやと想像して寝れなくなる夜が2回くらいあった。

という事で、WordPressをちょくちょくいじる以外では、初めて自前でプログラムと呼ばれるものを書いてみた。
錯覚かもしれいないが急に世界が1万倍くらい広がった気がしており、他のものも作りたくなってくる。楽しかったです。