BatchGoodによりbcc32cでのeasyなコンパイル環境が出来たので、COMプログラミングをやりたかったのですが、まだ適当なものが思いつかないので、私が20代の頃横浜で勤務していた時、先輩社員が吹っ掛けてきた「賭けゲーム」を忠実にプログラム化してみようと思います。

 

1.発端

ある日、とある課長代理さんの担当の業務で川崎の出先に赴き、一仕事終わって昼飯時になったら、「おーい、●●君、こういうの知っているかい?」と10円玉を15個出して並べます。

〇 〇

〇 〇 〇

〇 〇 〇 〇

〇 〇 〇 〇 〇

(1 2 3 4 5列)

「10円玉を5列、5個から1個まで並べ、どの列でもよいから、必ず1個以上とるんだよ。全てとっても良いよ。それで最後に1個残された方が負け、というゲームなんだ。やる?ここのラーメン代、賭けようか?」と誘ってきました。(注)

注:この課長代理、山っ気が強く、悪知恵が働くので客先とよからぬ商売を仕掛けては数字を出すのですが、コンプライアンス的にヤバイ、という極めて昭和的なおっさんでした。因みに彼はその後若くして出世するのですが、最後は懲戒解雇になりました。

 

まぁ、ラーメン代だから、というのでその話に乗って始めたら、体よくカモにされてしまいました。当時若くて何にでも好奇心を持ち、分析しないと気が済まない私は、復讐心からこのゲームを考え続け、「2個以上ある列が裁量権を持ち、列数、個数共に奇数個と偶数個による戦略的な違いがある」ことに注目し(注)、その後大人数で飲み屋に行った際に酔っぱらって当該課長代理に「全員の飲み代をかけて」勝負を挑み、見事勝利しました。

注:例えば、2列同数の10円玉を相手に残すと必ず勝つこと等です。

〇 〇    〇(1個取る)

〇 〇 → 〇 〇 →  〇(負け) またいずれか1列の2個をとっても他方の1個を残される。

 

2.調査

プログラミングネタを考えていて、そんな昔のことを思い出し、キーワードを変えてググってみたら、どうもこのゲーム"Nim"というものらしいことが分かりました。また、矢張りこのゲームには必勝法があり、上記の設定で言えば、1 - 5までのすべての列の個数の排他的論理和が0でない場合必勝形、逆に0の場合必敗形になるんだそうです。

しかし、私がやったのは本来のNim(最後の一つを取った方が勝ち)とはルールが異なり、最後の一つを取った方が負け、という「双対ゲーム」で、Wikiに書かれている通り、必勝法がひっくり返るわけではないことが分かります。(注)

注:「ニムの勝ち負けを反転させたゲームを、ニムの双対ゲームと呼ぶ。 すなわち、双対ゲームはニムと同じルールでゲームが展開していくが、通常のニムと違い最後のコインを取った方が負けになる。双対ゲームの必勝法はニムの必勝法を反転させたものになっていない。」(Wiki)例えば、

〇 〇

〇 〇

このような排他的論理和0の手は必敗形ですが、

〇 〇

の手は、同じ排他的論理和0ですが必勝形となります。

 

3.プログラム仕様

ということで、

【ルール】
(1)5列の5個、4個、3個、2個、1個のコイン群をテーブルに置き、
(2)先手、後手が一回に、一つの列から、1個以上のコインを取ってゆき、
(3)最後のコインを取ることになった方が負け
【プログラム】

MENACEと同じく、CUIで論理部分を開発し、最後にBCCSkeltonを使ってWindowsプログラムに落とします。

【ゲームプレイ】
MENACEと同じく、人間対PCの他、PC対PCも対戦可能としますが、今回はPCのプレーヤーを、

乱 数男(ミダレ カズオ-乱数を使って手を打ってくる)
関 数子(セキ カズコ-排他的論理和を使った関数を判断根拠として手を打ってくる)
経 験太(オサメ ケンタ-MENACEの様に、対戦経験を知見として蓄積して手を打ってくる-注)

注:実際にはMENACEのような純粋な経験蓄積では、乱数または人間が「誤った手」を打った場合、それを将来永劫、後生大事に判断根拠としてしまうのでセキ カズコさんの関数にも手助けしていただいています。

の3者とし、手の打ち方にバリエーションを持たせてみます。

【基本仕様】
MENACEの際のCBOARDとCMENACEの関係のように、CCOINSクラスに基本的なデータ(プロパティ)と処理(メソッド)を与えて、手動での対戦を可能な状態にし、これから派生するCNIMクラスに二つのタイプのプレーヤーを収納し、夫々の評価関数、打手関数を持たせる。(手の記録データベースも持たせる。)

 

4.開発状況
現在の開発状況は、今まで私の不明により根強いバグがあったのですが、本日何とか原因を明らかにして、その対策を立て、しばらくテストランしてからウィンドウズプログラムに移植しようか、という段階です。

 

まぁ、LightCycleやMENACEと同じく、すごいグラフィックや、深遠な手読みなどはなく、環境ソフトのように眺めて楽しむ系列のソフトですが、小生テストランでプログラムに負け始めており、暇つぶしで対戦するのは決して退屈ではないですよ。