「たけしのコマ大数学科」の問題をいろいろ Ruby で解いているときに、こんな問題がありました。
問題:
1から6までのトランプ24枚を使い、2人が交互に1枚ずつ取り、2人の取ったカードの合計を先に31にした方が勝ち、というゲームをする。(31を超えたら負け。)
このゲームで先手が勝つためには始めに何を取ればよいか。
(問題の書いてあるサイトはここです。元記事に感謝します。)
「先手が勝つためには始めに何を取ればよいか」とあるように、このゲームは先手必勝です。ちなみにこの問題はここで Ruby で解いています。
で、実際にこのゲームをコンピュータ相手に対戦するためのプログラムを組んでみました。本当はこれも Ruby で書きたかったのですが、コンピュータの思考時間の関係で Ruby では(自分のスキルでは)無理だったので、Go で書いてみました。ソースコードはここにあります。
31ゲーム · GitHub
あなたが先手なので、先手必勝ということはわかっていますから、やり方によっては必ずあなたが勝てます。しかし、コンピュータ側は完璧な対応をしてくるので、ひとつでも手をまちがえれば絶対にコンピュータには勝てません。こんな感じです。
$ go build thirty_one_play.go $ ./thirty_one_play **第1手目** 合計: 0 カードを選んで下さい(1~6): [4 4 4 4 4 4]6 **第2手目** ---あなたの負けは確定しています コンピュータの手は 4 です **第3手目** 合計: 10 カードを選んで下さい(1~6): [4 4 4 3 4 3]4 **第4手目** ---あなたの負けは確定しています コンピュータの手は 3 です **第5手目** 合計: 17 カードを選んで下さい(1~6): [4 4 3 2 4 3]2 **第6手目** ---あなたの負けは確定しています コンピュータの手は 5 です **第7手目** 合計: 24 カードを選んで下さい(1~6): [4 3 3 2 3 3]1 **第8手目** コンピュータの手は 6 です 合計 31 で、あなたの負けです!
こんな風に、あなたが一回でもミスをすると「あなたの負けは確定しています」と出ます。コンピュータのくせに、なまいきですね。なお、カードを選ぶところの例えば「[4 4 4 3 4 3]」というのは、左から順に 1~6 のカードの残りの枚数を表しています(この例の場合だと、4 と 6 のカードがそれぞれ 3 枚づつ残っていて、残りのカードはすべて 4 枚残っているということです。)
じつのところ、なかなか勝てないと思います。是非必勝法を編み出してみて下さい!