終わらない争いに終止符を~「番兵」の存在
Pi STARTER(ラズベリーパイ用BASIC言語パッケージ)版
ひとりで遊べる人狼ゲームを公開中(要ラズパイ&Pi STARTER)
http://www.ne.jp/asahi/chitose/net/download/jinrou/
ひさびさにこの連載に帰ってきました。更新がごぶさたになっているのは、いまPi STARTERで新作を作っていてまさに追い込み中(誰にも知らせてないプロジェクトに追い込みも何もありませんが…)なのと、前回noteで書いたように新しいタイトルを作っていたためです。新タイトル画像今回はじめて使ってみましたがいかがなもんでしょうか。
さて、今回はタイトルの説明から言ってみましょか。
「番兵」
私はこの言葉、知っているプログラマーの方に教えてもらいました。
「人狼ゲームブログラムで、いつまでもいつまでも決選投票が終わらないので、しょうがないから特定回数繰り返したら神様が登場して裁定することにしましたわー!」って言ったら、「あぁそれ番兵ですね」って。
やっぱしプログラムの世界にはそうした経験則に基づいたいろんな解決方法があるもんですね。私はそんなテクニックだと知らずに、自身が困ったからとりあえずの解決策としてそういう処理作ってみた次第なのですが。
「番兵 プログラミング」でいろいろ検索すると言葉の定義は諸説あるようですが、Wikipediaの説明が最もしっくりきて分かりやすいです。
Wikipedia 「番兵」
「データの終了を示すために配置される特殊なデータを指す」
(中略)実際にはこの用語は、微妙に異なる以下の2つの意味で使われる。
・実データには出現しない、データの終了を表すための専用の値
・入力データを処理するループの終了条件が複数ある場合に、条件判定の数を削減するために置くダミーのデータ
https://ja.wikipedia.org/wiki/%E7%95%AA%E5%85%B5
「分かりやすいです」と書いたが、まったく分かりやすくないな(笑)。
これに限らずプログラミング関係の解説ってもう少し初学者に優しくならんもんかと常に思っています。近年は小学生だって読むんだから。「幾何学に王道無し」なのは分かるんですけどね。
私のところでは具体的な実例をもって説明しましょう。
「人狼ゲーム」では議論フェーズのあとに「誰が人狼だと思うか」について投票が行われるのですが、このとき同数の票を集めた者がいると、選ばれた者を除いた生存者全員による決選投票が行われます。
私の作った「人狼ゲーム」でもそこらへんはぬかりなく再現したのですが、いざテストプレイしてみると、絶対に決選投票が終わらないことがたびたび発生したのです。何度やっても必ず同じ人が同じ相手に投票するので、争いが終わらないという…。
これ人間同士でやってたら、さすがに何回目かでどっちかが折れるか司会者がとりなすとか、なんかやりようがあるでしょう。でもそこらへんの融通が利かないのがコンピュータープログラムなんですよね。
投票処理に際して各キャラクターはそれぞれの役職に基づいたうえで、各キャラの持っている信用度や抱いている感情値を加味して誰に投票するかを算出しています。そこに乱数(サイコロ1個分)による不確定要素も加えているのですが、それでも揺るがないときは決して揺るがないのですね。なにしろコンピューターなので。
かくして何十回、いや何百回(以下無限)も同じ結果が繰り返されるという終わらない悪夢の法廷。
「真実」に到達することは決して…「死ぬ」という真実にさえ到達することは決して…「無限に」
ということで、これへの対策が必要となったのですよ。
ブログラム内部における特殊処理で誰かしらに投票を集中させるとかも考えたのですが、それはやりたくなかったのですね。各キャラクターはそれぞれ判断基準をもって選んでるのに、それをイカサマでブチ壊しては、ゲームが一気に嘘っぽくなってしまう。
じゃあどうするのか?
いろいろ悩んだ末、私がとった方法は
「決選投票を特定回数繰り返したら、神様が登場して追放者を決定する」
という、ゲーム本来のルールを逸脱した、ある意味「逃げ」みたいな方法でした。
これはプログラム的にはそんなに難しくはありません。
決選投票の回数をカウントする変数を用意し、その回数が一定の値に達したら「神様処理」のサブルーチンに飛ばすだけです。
神様は決選投票に残った候補の中からランダムに選んで追放するので(神様ですから!)、恨みっこなし?でゲームも進みます。
ちなみに最初は決選投票が10回目に達したら神様登場としていましたが、テストプレイを繰り返した結果5回目でも十分だという結論に達したため、発表したバージョンではそのようになっています。
この解決の仕方に100%納得してるわけではありませんが、こうするしかやりようがなかったのも確か。
それにしても「番兵」とはよく言ったものです。きっとプログラミングの世界にはこの類の問題が山積しており、これもまた問題解決のために編み出された手法なのでしょう。会社にも定時になったら強制的に処理を終わらせる番兵がほしいものです。ということでまた次回。