ボードゲームの盤面

将棋は、以下の様に盤面をテキストに起こすことができます。

▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢歩▢▢▢▢
▢▢▢▢▢▢▢▢▢
▢▢▢▢王▢▢▢▢
(駒の向きは考えません。向きを変えたかったら別の文字を使ってください)

 

他のボードゲームでは、盤面が六角形を敷き詰めた形(ヘックス)になっているものも多くあります。
これも以下の様にテキストで表すことが可能です。

▢▢▢▢▢▢▢▢▢
  ▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
  ▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
  ▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢
  ▢▢▢▢▢▢▢▢▢
▢▢▢▢▢▢▢▢▢

それぞれのマスは四角ですが、全てのマスが平等に他の6マスと接しているため、ヘックスとみなすことが可能です。

 

しかしボードゲームの盤面は他の形もあります。

私がテキスト化しようと考えていたのは、こんなの

f:id:syaik:20171218213237p:plain
(ちなみに再現しようとしていたのは台湾の流轉大地というボードゲームですが、他にもこの形の盤面は見たことはあります)

どうにかテキスト化できないか四苦八苦していたのですが、「特定のマスを無いものと見なす」という形で再現することに成功しました。
何言ってるか分からないと思うので、実際に盤面を作りながら説明します。

 

f:id:syaik:20171218213316p:plain

左の盤面を右で再現することにして、まず赤い2マスを対応させます。

左盤面の赤マスはどちらも別の2マスと隣接していますが、その4マスそれぞれは隣接していません。
これを四角盤面上に表すと、こうなります。

f:id:syaik:20171218213342p:plain

三角盤面上の赤マスはもうどこのマスにも隣接していないため、四角盤面上で赤マスと隣接しているマスは存在しないものとします。

f:id:syaik:20171218213401p:plain

三角盤面上で青と黄色に挟まれているマスも確定します。

f:id:syaik:20171218213413p:plain

三角盤面上で黄色のマスに隣接するマスがありますが、四角盤面上で黄色の下のマスは使えないので、右のマスが対応します。

f:id:syaik:20171218213426p:plain

三角盤面上で、緑と紫に同時に隣接するマスは黄色以外に存在しないので、四角盤面上の間にあるマスが使用不能になります。

f:id:syaik:20171218213447p:plain

なんだか形が見えてきた気がしませんでしょうか。
以降、このような操作を繰り返していくと完成です。
見やすいように色数を減らしたものがこちら

f:id:syaik:20171218213655p:plain


おー、なんかかっこいい。
というわけで、これからはメールとかでも流轉大地が遊べちゃうわけです。


「磯野ー、流轉大地やろうぜー

   黄白      
   黄緑黄青    
  黄白 白白黄青  
  黄青白黄 黄白白緑
 青黄 白緑白青 黄黄
 白白黄緑 白黄緑白 
白青 白白黄緑 黄黄 
黄黄白黄 黄白緑黄  
  白青青白 白白  
    黄黄白緑   
      白黄   

最初は白9な」

「全然わかんねえ」


今後の展望
もっといろいろ考えてたんですが塗り絵で疲れちゃいました。
とりあえず今回の三角盤面はヘックス上では再現できません。
逆に、正三角形充填盤面は四角盤面でダメでヘックス上ならできます。
その他の形の盤面はそのうち。

ババ抜き

ババ抜きは選択肢のない運ゲーのように見えますが、実は戦略もあります。

カードを引かせるときに1枚だけ突出させるとか、引くときにフェイントをかけるとかみたいな心理的要素ではありません。今回はそういうのなしで淡々としたババ抜きを考えます。そんなババ抜きは面白くない、というのは禁句です。

私が前々から考えていたのは「そろったカードを捨てない」という行為(以下、見逃し)がゲームにどんな影響を与えるか、ということ。もちろん自分は不利になってしまいますが、それとは別に、世界にゴミが広がることで他の人へ嫌がらせができます。特に自分の後ろの人は不要カードを引く確率が上がるので強烈に叩くことができそう。例えばババ抜きを何度か繰り返していて後ろの人がトップを独走、自分は2位、みたいなときは自爆覚悟でやってみる価値があるのかもしれません。

 

で、調査の前にグーグル先生にお伺いをたててみたんですが、なんと別の戦略がでてきました。それは「手札の枚数が偶数か奇数かで上がる確率が変わる」というもの。

自分の番にカードを引いてそろわなかった場合は手札の枚数が変わらず、そろった場合は2枚減ります。どちらの場合も偶奇は不変です。初期手札が偶数枚の人は最終的に2枚になり、奇数枚の人は1枚になります。(ただし、最初の人にカードを引かれる人のみ逆になります)

ここで、2枚の人はそのうちどちらかを隣から引いてこれれば最後の1枚を下家に渡してあがりなので有効牌が2つ。1枚の人は有効牌が1枚しかなく、2倍不利だと。

 

ははぁなるほど。っていうか見逃しとかよりよっぽど重要そうですね。私がゲーム中に小賢しい真似をできないかと考えたところで、勝敗は始まる前についていたと。

具体的な確率は調べても出てこなかったので、いつものようにコンピュータをブン回してみました。4人のプレイヤーにカードを配り100万回ずつやってもらうのですが、最初の人が誰かによって偶奇性が変わるので最初の人を変えて4セットやります。

f:id:syaik:20171126144233p:plain

うわー、おっそろしい差。今までこれを知らずに散々騙されてきたと考えるとぞっとしたりしなかったりですわ。

 

というわけで本題の見逃しに移るわけですが、公平を期すために全員奇数枚スタート(図の2段目)とします。

また、見逃す条件ですが、簡単に「初期手札から全く捨てない」「引いてきたカードでそろったら捨てる」とします。実際にやる際も、引いてきたカードと別のを捨てると怪しさ爆発なのでこんなもんでしょう。

見逃し者を1人配置し、先ほどと同じように100万回やってみた結果がこちら

f:id:syaik:20171126150043p:plain

後ろの人が有利になってる。想定と逆の結果か……。

後ろの人目線で考えると、「自分の欲しいカードを、本当は前の人が持っていないはずなのにくれることがある」というメリットと、「ゴミカードを渡されやすくなる」というデメリットがあり、デメリットは「ゴミカードと同じ数字をすぐ前の人が持っている」という理由で薄くなっている、というのが正しいのでしょうか。

つまり、見逃しは前の人を攻撃する戦略だったわけです。そう考えて上の表を見てみると、えー、うーん。。。

 

 

今後の展望

ペアを見逃すことについて、「ゲームを長引かせることになるので、初手でジョーカーを持っているときに効果がある」と書いている文章がどっかにありました。

今回の条件で実際に検証してみたところでは初手ジョーカーの有無は勝率に影響していませんでしたが、条件を変えてみると結果も変わるかもしれません。見逃しがどの程度ゲームを長引かせるのか、ゲームの長さによってジョーカーはどのように移動するのか、を調べる必要があります。

また、見逃しはジジ抜きでこそ効果を発揮するとも考えられます。早い段階でジジを特定し、2枚持っておけば3枚目を渡されても次の人に渡せる確率が3倍。渡してから「そろってたのに気づかなかった」とか言ってしれっと捨てれば強いに違いありません。いや、そうでもないか。

暇なときにでも考えるかも。

 

指でやるあれ

小学生の頃、指を使ったシンプルな大富豪みたいなゲームが一瞬だけ流行りました。
Wikipedia「手を用いた遊び」の「数字を無くす遊び」です。ルールの説明はしないのでまずこれを読んでください。


エチケットっていうらしいですが聞いたことないし意味不明ですね。私の小学校では名前が付いておらず、「あれ」としか呼んでなかったです。
「手を用いた遊び」に載ってる遊びはいくつか流行りましたが全て無名で、あれをやるときは「あれやろうぜ」と言いながら手をあれの形にしないとあれでした。
そんなあれですが、実は先手必勝とのこと。その戦法は「出せる一番小さい数字を出す」だけ。
えええ、確かに先手有利だとは思ってましたが、そんなしょうもない戦法で勝ててしまうなんてちょっとがっかり。
もうちょっと面白くなってもらうために拡張してみます。
といっても、あれはゲーム理論でいう云々々々々々々々々々々々ゲームなので絶対に必勝法があるんですが、とりあえずは必勝戦法が複雑になれば良いでしょう。
拡張方法はシンプルに指の本数を増やすこととして、まずは先手のワンパターン戦法がどの程度通用するか考えてみます。

 

...えーと、結論から言うと、指が何本あっても「出せる一番小さい数字を出す」で先手必勝でした。
正確に言えば自動勝利ではなくて、「残りが2枚で、そのうち1枚が最強」という勝ち確の形に持っていけます。
以下、証明です。

 

先手と後手の持っている指を以下の様に表します。
    1 2 3 .. N
        1 2 .. n N
上が先手、下が後手。ずれているのは仕様です。
ここから、使った数字を消していきます。まず先手が1を出して
    2 3 .. N
    1 2 .. n N

先手はオートマチックなので後手の視点で考えます。
後手がN以外の数字を出すと先手はそれ+1を出すので、図の縦1列が消えて再度後手番になります。
つまり、最初に後手が取れる選択肢は「縦列1つ選んでを取り除く」を好きなだけ繰り返した後に「最大数を出す」または「パス」となります。
ルール上隣り合う縦列は取り除けませんが、ここではOKとします。
言い換えると、「後手は先手と同じ数字を出しても良い」という後手に一方的有利なルールを追加してもなお先手必勝ということです。

■最大数を出した場合

場は以下の様になっていて、後手の手番です。
    2 X X .. N
    1 X X .. n
全部出していけば1枚差で勝利のように見えますが、実際には最後の2枚になったところで
    A B
    C D
後手のCに先手はAでなくBを出すことでリード権を得てそのまま先手勝利です。
数字を1と2しか使用しない場合は例外で、先手1→後手2→後手1と後手の勝利ですが、その時は最初から先手2で負けます。

後手がどこかでパスすると先手は最小の数字を出し、場は以下の形になります。
       X X .. X
    X X X .. X
さっきよりも不利で、特に後手の最弱カードは一生出せません。
つまり、このプランは必敗です。

■パスした場合

先手が最小数を出し、場は以下の様になります。
       X X .. X
    X X X .. X X
後手が最弱数を出すためには、最強カードで切って出すしかありません。
最弱カードを最後の1枚に残すのは明らかに先手が既に勝っているので、他にもカードを残しておく必要があります。
再び縦列をいくつか取り除いた後に最強数→最弱数と出すと、先手は一番小さい数字を出し、場は
       X X .. X
    X X X .. X
上で見た形。このプランも必敗です。


というわけで、後手がどんなに頭をひねっても先手は寝ながら勝ててしまうわけです。
しかも「後手のみ相手と同じ数字が出せる」どころか、「先手が世界最強カード以外を出したら、後手は何を出しても良い」というぶっ飛んだハンデをつけてもなお先手必勝。こんなん、紛うことなきクソゲーですわ。

 


今後の展望
必勝法がもっと複雑になるような後手のハンデを考えたいですね。
また、「先手がミスをした場合にどうすれば後手勝ちに持っていけるか」を研究すると上級者になれますし、「他の先手必勝法」があれば織り交ぜていくことで相手にばれにくくなります。
両方会得したら絶対無敵のあれマスターですが、小学生でもなけりゃあれを他の人とやることなんて無いですね。黒の組織に出会ったら考えます。
あとは、あれとは違うほかのあれもあれしてみるかもしれません。あれですし。

タルタリアの三角形2

「タルタリアの三角形」の2回目、今回は項の増やし方を変更します。

三角形の角度が変わり、こんな感じになります。

f:id:syaik:20171019221238p:plain

証明は前回と大体同じ感じ。
項数の増分(上の図では2)をsとして、以下の様に定義します。

    L0 = N + N+1 + ... + N+a               R0 = N+a+1 + ... + N+a+b
    L1 = N+a+b+1 + ... + N+2a+b+s   R0 = N+2a+b+s+1 + ... + N+2a+2b+2s

 

Ln, Rnの項数をPLn, PRnとすると、

    PLn = a + sn
    PRn = b + sn

一番右の項をRRn、一番左の項をLLn、項を縦に見た時の差をDnとすると、n'=n-1として

    RRn = RRn' + a+b+2sn

    LLn = RRn'+1 = RRn - s - Dn' + 1
           = RRn - (a+b+2sn)-1

    Dn = RRn - RRn' - s
         = a + b + 2s(n+1) - s

 

前回と同様に、Rn-Lnを計算します。

    Rn = Rn' + PRn * Dn' + sRRn - s(s-1)/2
    Ln = Ln' + PLn * Dn' + sLLn + s(s-1)/2

    Rn - Ln = Rn' - Ln'
                   + ( b-a )Dn'
                   + RRn*s - RRn*s + s^2 + sDn' - s
                   - s(s-1)

                = Rn' - Ln' + (b-a+s)Dn'

 

やはりというか、前回と同じような結果が出ました。

項数の増分がsの三角形が成立するのは、左項数=右項数+s の場合となります。

実際に作ってみるとこんな感じ

f:id:syaik:20171109214829p:plain

なんというか、前回と変わんなくて思ったよりつまんないでした。

 

 ところで

左右で項数の増分を変えてみると、Dnの係数にnが現れ、Rn-Ln がnの2次式になります。縦一列を飛ばすだけでは成立しなくなり、一段下がるごとに飛ばす項数を増やしたりする必要がでてきます。

以下はどっちも同じですが、こんな感じ。

f:id:syaik:20171109215846p:plain

f:id:syaik:20171109220657p:plain

秘書問題

「秘書問題」という問題があります。
別の呼び方として「結婚問題」とか「最適選択問題」とかあるらしいですが、私は「浜辺の美女問題」という呼び方が一番あっていると思うので、この例えで説明します。

 

・浜辺にN人の女がそれぞれバラバラにいて、そのうち誰かをナンパしたいと考えています。
・イケメンなので成功率は100%です。
・女に近づくとその人がどれくらい美人かが分かり、声をかけるかスルーするか選べます。
・声をかけた場合、そこで終了です。スルーした場合、その女性とは二度と会えません。
・男はどのようにすれば最も美人をゲットできるでしょうか。

 

ググればたくさん出てきますが、最適戦略は
「最初の何人かは必ずスルーし、そのうち一番の美人を覚えておく。それより美人が現れたら決定。スルーするのは全体の37%(1/e)」というもの。
これで、37%の確率でNo.1を選ぶことができるらしいです。

 

この問題には応用形もいくつかあります。
一番美人じゃなくても期待値が高ければ良いとか、一番美人をスルーしちゃった気がする場合は妥協していくとか、だんだん現実に即していく感じが面白いのですが、計算はどんどん複雑になっていってよく分からない。
計算する気が無いので、コンピュータ君にひたすらナンパしてもらって数を数えました。

 

条件はこちら。
・女は100人。美人度は一様にランダム
・ナンパ師は最初のN人をスルーする。N=0~99として100人のナンパ師が同時に浜辺に繰り出す。
・ナンパが終了した後、それぞれ何位の女をゲットしたか記録する
・これを100000回行ない、集計する。

したものがこちら。

f:id:syaik:20171103192840p:plain
横軸は何人をスルーしたか。縦にみて一番下の青い部分は1位をゲットした回数。下から順に1位,2位,3位...をゲットした回数です。
1位をゲットするのは37%スルーが最強ですが、2位でも良いとなると29%スルーの方が良いらしい。
許容順位と最適スルーはこちら

f:id:syaik:20171103192909p:plain
んー...何か1位ゲットは38%スルーの方が良いような誤差が出てますが気にしない。
4%スルーすれば、94%の確率で平均以上をゲットできます。

順位の期待値をグラフにしたものがこちら。

f:id:syaik:20171103192926p:plain
6,7人スルーがほぼ同数で一番良いらしいです。
0スルーは当然50点が期待値ですが、1人スルーしただけで期待値は74点にもなります。

重ねてみましたが、特にどうということはない。

f:id:syaik:20171103192944p:plain

要するに「その道に精通していなくても、ほんのちょっとでいいから知識や経験があれば初見よりずっとずっと良い」ってことですね。 

 

ジェンガ

ジェンガのある段から棒を抜くとき、左右の2本が抜けるのか中央の1本しか抜けないのかの違いは、3本の高さが微妙に異なることから生まれます。
...本当は摩擦とか重心とか抜く人の技術とか色々ありますが、そんなことまで計算できないので許してください。


パターンは以下の通り

 

1. 中央に一番高い棒がある場合

f:id:syaik:20171025230035p:plain
左右の2本が抜けます。

 

2. 中央に一番低い棒がある場合

f:id:syaik:20171025230057p:plain
中央の1本が抜けます。

 

3. 高さの順に並んでいる場合
これは中央の棒の高さによって分岐して、
3-1. 下に凸

f:id:syaik:20171025230130p:plain
中央の1本が抜けます。


3-2. 上に凸

f:id:syaik:20171025230147p:plain
一番低い棒が抜けますが、大抵の場合一番高い棒も抜けるので、2本抜けるということにします。
そんなこと言ったらパターン1とかパターン3-1も頑張れば2本抜けるじゃん、というのは無しです。

 

パターン1,2,3はどれも等確率で発生します。
棒の高さが一様にばらけている場合は3-1と3-2も等確率で発生するため、各段は期待値1.5本抜くことができ、全体の高さは2倍になると予想されます。

 

嘘です。

 

抜いた棒は上に積んでいくため、ジェンガは途中から「一度抜かれた棒だけで構成された段から更に棒を抜く」という動作になります。
「一度抜かれた棒」は低い棒が多いため、高さが一様にばらけているという前提は成り立ちません。
つまり、パターン3-2が占める割合はどんどん小さくなっていき、全体の高さは2倍まではいかないと予想するのが正しいでしょう。

 

例によって計算ではなくコンピュータの力業で行きます。
10万段のジェンガを組み、下から順番に抜けなくなるまでジェンガするのを100回繰り返して平均をとります。
棒1本の高さが1.5センチらしいので、10万段のジェンガは1500メートルです。

 計算結果がこちら

    段数:197688
    パターン1の回数:65986回(33.3%)
    パターン2の回数:65977回(33.3%)
    パターン3の回数:65723回(33.2%)
        パターン3-1の回数:36333回(18.4%)
        パターン3-2の回数:29390回(14.9%)

2965メートルにしかなりませんでした。

うーん、誤差。

 

各パターンが何回出てきたかグラフにしたものがこちら

f:id:syaik:20171025230242p:plain
最初の10万段を抜いた時点で、目に見えて3-2が衰えています。
よーく見ると、次の5万段を抜いたところで更に傾きが落ちているのも分かるでしょうか。

タルタリアの三角形

以下の式は、タルタリアの三角形と呼ばれています。

f:id:syaik:20171019220505p:plain
すばらしいですね。私は小学生の頃、これを見て生まれて初めて「数学の美しさ」というものを感じました。
足し算ができれば理解できる感動。全国の小学生にこれを見せれば理系離れも止まると思います。
Excelで作りました。

f:id:syaik:20171019220553p:plain
証明は手垢まみれなので省略します。

 

さて、昔の私はこの式が大好きで、しょっちゅうノートの隅とかに書いてました。形を変えたら似たようなのができないかとこねくり回していたら、以下のような式を見つけます。

f:id:syaik:20171019220640p:plain

f:id:syaik:20171019220700p:plain

いくらでもできるぞ、と思っていると、以下の場合は成立しません。

f:id:syaik:20171019220803p:plain
成立している式については基本形と同じような感じで個別に証明できると思いますが、やはりここはまとめて証明したいっていうのと「どういう条件で成立するのか」「このような式は無数にあるのか」が気になるところ。

 

まずは一般化して左辺L(n)と右辺R(n)を以下の様に定義します。
この段階では、項を飛ばすことは考えません。

    L(1) = 1 + 2 + ... + a  R(1) =    a+1 + ... + a+b
    L(2) = a+b+1 + ... + 2a+b+1 R(2) = 2a+b+1 + ... + 2a+2b+2

また、各項を縦に見たときの差をd(n)、L,Rの項数をPL,PRとします。

以下は明らかです。

    PL(n) = a + n -1
    PR(n) = b + n -1

 
R(n) = R(n-1)の右端項 + R(n) + PR(n-1) * d(n)
L(n) = L(n-1)の左端項 + L(n) + PL(n-1) * d(n)
なので、差を取ると

    R(n) - L(n) = R(n-1) - L(n-1)

                          + R(n-1)の右端項 - L(n-1)の左端項
                          + ( PR(n-1) - PL(n-1) ) * d(n)

                      = R(n-1) - L(n-1)
                         + d(n)    ...(※)
                         + (b-a)d(n)
                      = R(n-1) - L(n-1) + (b-a+1)d(n)

 ※右端項 - 左端項 = (右端項-1) - (左端項-1) = 右端から2番目の項 - 上の段の右端項 = 縦の差

よって、これが常に0になるためには R(1)=L(1) かつ b-a+1=0 となれば良いです。
そのようなものは基本形(1+2=3, ...)しかありません。

 

次に、項を飛ばすことを考えます。
ある縦一列を k(n) とすると、d(n) の定義から k(n) = k(n-1) + d(n) です。
縦一列を飛ばすというのは R(n)-L(n) にk(n)を足すか引くかすることを意味するので、

    R(n) - L(n) ± k(n) = R(n-1) - L(n-1) ± k(n-1) + (b-a+1±1)d(n)

d(n)の係数は、左辺から1項飛ばす度に+1,右辺から1項飛ばす度に-1されます。
これが0になるためには、
    右辺全体の項数 - 左辺全体の項数 + 1 + 左辺から抜いた項数 - 右辺から抜いた項数 = 0

       <=> 左辺の実際の項数 = 右辺の実際の項数 + 1

左辺の項数 = 右辺の項数 +1 のとき、右辺と左辺の差は常に等しいことになります。
この条件で差が0になる式はいくらでも作ることができるため、三角形も無限に作ることができます。
また、1から始まるという条件は使わなかったので、どこからでも開始できます。

 

いろいろ作ってみました。

f:id:syaik:20171019221307p:plain

f:id:syaik:20171019221352p:plainf:id:syaik:20171019221720p:plain

f:id:syaik:20171019221753p:plain

 

ところで
拡張は他にも考えられます。
これは2項ずつ増やした場合

f:id:syaik:20171019221238p:plain


これは項の飛ばし方を変えた場合

f:id:syaik:20171019221924p:plain

まだまだ楽しめそうです。