誰が一番信用できる?~最大値(MAX)・最小値(MIN)
Pi STARTER(ラズベリーパイ用BASIC言語パッケージ)版
ひとりで遊べる人狼ゲームを公開中(要ラズパイ&Pi STARTER)
http://www.ne.jp/asahi/chitose/net/download/jinrou/
ちょっと前回の「できるかな人狼」から間が空きすぎてしまいました。皆様自粛してお過ごしでしょうか?これを書いている現在はコロナウイルス禍の真っただ中。非常事態宣言が発令され、どの自治体でも不要不急の外出を避けるべくアナウンスされ、「三密」(密集、密閉、密接)を避けろと言われ、都民は県外に行くなと言われ。そんな今日このごろの様子を端的に表しているシーンと言えば、やっぱりこれじゃないでしょうか。
前振りはその辺にして「人狼ゲーム」に話を戻しますね(いつ読まれるか分からないんだから、一応時勢のネタ少しは書いとかないと)。
さて、「人狼ゲーム」の肝は何といっても「信用」に尽きると思います。
いまコイツの言ったことは本当に信用できるのか?
信用できたとして、そのうえで自身はいまどう振る舞うべきか?
もし信用できないとすれば、それは何故なのか?
これをゲームの要素として表現できないことには、「人狼ゲーム」を作ったとは言えないと思います。
前回までで作った登場人物の発言全ランダムも、あれはあれでカオスってて面白かったのですが、やはりそこで満足しちゃいけない。
私の作った「人狼ゲーム」では「信用値」というパラメータがプレイヤーを含む各キャラクターに設定されており、以下のようなファクターで値が変化するようになっています。
<自分の信用を上げる発言(例)>
・「私は役職者のひとりです」
・「占いによれば〇〇〇〇は人間(人狼)です」(※)
・「昨日追放された〇〇〇〇は人間(人狼)です」(※)
<他人の信用を上げる発言(例)>
・「今晩は〇〇〇〇を守りませんか」
・「〇〇〇〇は人間だと思います」
<自分の信用を下げる発言(例)>
・「実は俺様がじんろ…冗談だよ冗談」
・「へへへ、楽しい宴の始まりだぜ」
<他人の信用を下げる発言(例)>
・「今晩は〇〇〇〇をに投票しないか?」
・「〇〇〇〇が夜中にうろついているのを見ました」
これらに各人が個別の面々に対して持っている感情(恨み・感謝)、さらに乱数による不確定要素を加えて信用判定を行ない、
「投票の時に誰を選ぶか」
「人狼が誰を襲うか」
「予言者が誰を占うか」
「ボディーガードが誰を守るか」
といった意思決定をするように作っています。
(※ とはいえ予言者と霊媒師に関しては、これを名乗る者が増えるとかえって疑いを持たれ信用が落ちていく「予言者(霊媒師)ダウト」という概念がこのプログラムには存在しています)
信用が上がり過ぎると人狼に狙われやすくなり、信用を落とし過ぎると投票で追放される。このあたりが「人狼ゲーム」のゲームバランス。本物の「人狼」にしてもそうではないでしょうか。
さて、問題はその「信用判定」をどうやってプログラミングしたかです。
参加者は10人いるから、10個変数があるわけですよね。
その中から最大値のものと最小値のものをパッと出す方法。
どうでしょうか?
これどうしたらいいか、すぐ思いつきますか?
プログラマーの方ならそんなに悩まない課題なのかな?
私は当初、かなり遠回りなやり方でこの問題を解決しようとしていました。
そのやり方とはこうです。
<最大値の出し方の例>
① 比較用変数 X を「100」とする(注:この「100」とは、ゲーム中にまず到達しないくらいデカい数値だったら何でもいい)
② 全員の信用合計値(A,B,C,D,E,F,G,H,I,J)を、それぞれ X と比較する
③ X と同じ値の変数がA~Jにひとつもなければ、X から1を引く
④ ②~③を繰り返すと、いつかA~Jのどれかの値がXとイコールになる。
その値こそがこの集合の中の最大値である。
⑤ その最大値 X をもとにA~Jの中から同値の誰かひとりを選択する
(同値の者が複数いる場合、誰かひとりを選ばなくてはならないため)
一応このやり方で何とかなっていたのですが、やってみるとこれ結構長いプログラムになるのですね。しかも当時これで不具合が多く(不具合の理由はまったく別のところにありましたが)、もうちょっと何かこう、スマートに解決できないもんかなと、私にとってのバイブルとも呼べる「ALL ABOUT Pi STARTER」を見ていたところ…
「ALL ABOUT Pi STARTER」(電波新聞社刊:松原拓也著)
見つけてしまったのですね。
複数の数値の中の一番小さい値を調べる
変数=MIN(数値1,数値2,数値3…)
複数の数値の中の一番大きい値を調べる
変数=MAX(数値1,数値2,数値3…)
え…?
何よ、それ。
@MAXCOUNT '最大値の算出'
V=MAX(A[3],B[3],C[3],D[3],E[3],F[3],G[3],H[3],I[3],J[3])
@MINCOUNT '最大値の算出'
V=MIN(A[3],B[3],C[3],D[3],E[3],F[3],G[3],H[3],I[3],J[3])
終わっちゃったよ!!
あんなに!あんなに悩んで苦しんで、ようやく編み出した最大値と最小値の求め方が、たった1行で終わっちゃったよ!!
この命令は「ALL ABOUT Pi STARTER」の「数学関係の命令」という項目に載っていたので、数学超苦手の私は読まずにスルーしていたのでした。こういうところでツケが回ってくるものなんだなぁ…。
ということでプログラムもスッキリまとまり、めでたしめでたしなのですが…でもちょっと待って!?
私が勉強不足なのは確かに認めるよ。
でもこんな命令、昔からあった?
だってこれ、かゆいとこに手が届きすぎでしょ?
少なくとも私はこんな命令が存在するの聞いたことないんだけど?
ちょっと悔しいので調べてみました。
ウチにまだあるBASIC関連のマニュアル…。
・PC-6001mkⅡ用「N60mBASIC」
・X1 turboZ用「CZ-880C BASIC」
・MSX BASIC Ver 4.01
これらのマニュアルの中から命令や関数に関するページをひととおりあさってみたけど、ないよこんなの。
(もし「あるよ!」というのをご存じの方いたらご連絡ください)
Smile BASICは…。あ、これにはあるようです。
<Smile BASIC 命令表>
http://smilebasic.com/reference/
ってことは、これSmile BASICで初めて搭載された新機能?
うわー、BASICってこんだけ時代を経ても進化するもんなんだなぁ。
…と、機能の5%も満足に使えてない奴が言うのもなんですが。
こうして「信用」や「感情」の概念が加わり、ますますエキサイティングになった私の「人狼ゲーム」、夜の投票シーンもより真に迫ったものになったはずなのですが…。
え?何だって、決選投票がいつになっても終わらない?
何十回やっても誰も譲らず無限ループ??
ひええええええー。
まったく次から次へと出てくるわ不具合が。
次回はそのあたりをネタにひとつ。