昨日の夜、みんなで自転車で帰るときに、
つい皆を無視してスピード上げて帰ってしまったのには特に意味はありません。
ですが不思議とスカッとするものがありました。


みんな休日ってネットしないで何してんだろ。

…というかどうして私には休日に友達と会うという選択肢が無いんだろう。
と、ちょっとマズイ発言をしてみる。



今日は…。実験やるはずだったんですけど…。


とりあえず、前言ってたalgo(アルゴ)の発表の方やるか…。


とりあえず担当としてはルールの説明なんで、書いてみる。




僕達は、今回アルゴというゲームを題材として、
AIをプログラミングして戦わせました。

まず、algoがどんなゲームか説明します。

algoは2人一組で対戦するカードゲームです。
白黒二種類のカードが、それぞれ0から11の数字の付いたものが一枚ずつあります。
裏は色が分かるだけで数字は付いていません。



先攻後攻を決めます。じゃんけんでも何でも良いでしょう。

まず最初に、山札から四枚ずつプレイヤーに渡します。
それをお互い相手に見せないように、左から小さい順に並べて置きます。



同じ色ならば数字の小さい方が小さく、数字が同じなら黒の方が小さくなります。



並べ終わったらゲーム開始です。まず先攻の人が山札から一枚引きます。
引いたカードは持ちながら、相手のカードを一つ指して、番号を言います。




最初はなんの情報も無いので、普通は当たらないでしょう。
外れた場合は、山札から引いて持っていた一枚を、
自分のカードの列の中に表向きにして加えます。
そして相手のターンになります。





もし指したカードがその番号だった場合は、当てられたカードを表にし、





手に持っているカードを裏向きのまま列に加えてターンを譲るか、
当てるのを続行するか選ぶ事ができます。



カードを伏せて置く事をステイと呼ぶことにします。



これを繰り返して、相手のカードを全部当てて表にしたら勝ちです。



もちろん闇雲に指しては普通は勝てないでしょう。

いくつかシチュエーションを用意して戦略を考えます。



1.の場合、白の7と5の間は6しかありませんので、6で確定です。

2.の場合も、間に入るのは6しかありません。これも確定です。



3.の場合は、白の7と5の間には、黒の6か7が入りますが、
自分が黒の6を持っているので、入るのは黒の7しかありません。

4.の場合は、白の4の右に入るのは0か1か2か3です。
しかし自分が0と1と3を持っているので、入るのは2になります。

手札も知っているカードとして利用できますね。




ここから先はちゃんと実装したりしなかったりなので、
とりあえず文字だけで考えた戦略を。

一度カードを指して呼んだ番号は当然覚えておく。
4か5が入るところで4と指してダメだったら5に確定。

カードをステイするのは序盤ほど有効。後半はカードが多くあるので、
ステイしたら逆に確定してしまう場合もある。
「ステイすると確定してしまう」という条件をうまく表現できれば、
それ以外はステイ、としてもいいかもしれない。


相手のカードを確定したものから指していく必要は無い。
危険な手札(表になったら他のも致命的にバレる)を引いたとき、
それを確実にステイできるように、あまり危険でない手札の時は
まだ未開拓の場所を勝負する。
(当然こんなのは実装できてない)

確定していない時、何から指すかという問題は難しいが、
当たる確率の高いところから指すのが基本。
1と6の間より、7と11の間から。その際、真ん中から言うべきか、
端から言うべきかはまだ結論が出ていない。
今のところ私は、「何と指したか」が覚えやすいと言う理由で、
端から指すようにしている。



相手が何と言って指したか、という情報から、
「指したカードは相手の手札に無い」と考えるのは危険。
人間の場合あいまいに対処できるが、コンピュータには難しい。

逆に、情報が少なく当てようが無い最序盤には嘘をつく方が良いと思われる。
相手の仕様によっては、瞬間的に勝利が確定する。

とはいえ、情報としては、すべて捨てるのは惜しい。
うまく破棄できる方法さえあれば、これも蓄えるべきである。