【PHP】場合分けの数を数える

思い出したかのようにブログ更新してみる。

2ヶ月ちょいぐらいギークハウス高円寺というところに住んでいます。
先日@soramugiさんがボードゲームをなにやらたんまりと持ってきて
ボードゲームなんて中学生の時にやってたMTG以来なんですが、めっちゃおもろかったです。
昨日やったのはカタンっていうゲームで、無人島をどんどん開拓してポイントためましょうってやつ。

カタンの開拓者たち
カタンの開拓者たち - Wikipedia

単純に単純にポイント貯めてくだけじゃなくて、カードを交渉でゲットしたりできたりできます。
かなり自由度高く交渉できて、そういう政治的要素が濃く絡んでくるっていうのはボードゲームならではって感じ。

で、この中ゲームは進行上「サイコロを二つふる」アクションがあって、その出目もかなり大事になってます。
自分の陣取った地域には1から12の数字が割り振られていて、2つのサイコロの出目を合計した数の地域を所有している人が恩恵を受けられるんです。
例えば「2」の陣地を所有していても、「2」はサイコロ2つが「1,1」となった一通りでしかでてこないので、「2」の陣地を持っていてもあまり意味が無いとかそういう話です。

==

ここから本題。
サイコロ2つを同時にふった場合、その出目の合計で一番出やすいのは「7」だそうです。
ゲーム中は「ふーん」と思って聞いてましたが、あとになって「ほんとにそうなの?」という疑問がふつふつとww
確かめて見るには数学といてとけばいい。でも僕は純粋培養の文系なので数学とくいじゃない。
数学得意じゃなくても数えてみればわかる。でもそんな面倒くさいことしたくない。

「数学でとけなければプログラムを書けばいいじゃない。」

ということで、プログラムを書いてみました。
2つの数字の合計を数えてくれるプログラムです。

<?php
define("COUNT",12);
define("DICE_A",6);
define("DICE_B",6);
$all_number = array();
for ($x=1;$x<=DICE_A;$x++) {
  for ($y=1;$y<=DICE_B;$y++) {
    $all_number[] = $x + $y;
  }
}
for ($i=1;$i<=COUNT;$i++) {
  $count_number = array();
  foreach($all_number as $key) {
    if ($key == $i) {
      $count_number[] = $key;
    }
  }
  echo 'cout'.$i.':'.count($count_number).PHP_EOL;
}

こんな感じでやってみました
①どんな数字が出るのかを全て配列に突っ込む
②どの数字が何回出てきているのかを数える

一応気をつけたのはこんなところ
①1〜12で条件分岐するとかいうイケてないことしない
②定数値を用いて拡張性を高く
12個if文を続けていいなら、今回の目的は簡単に達成できますが、まぁ、仮にもプログラマならそんなダサいことはけしてやっちゃあいけないですね。イケてないですね。
あとは定数をの中身を差し替えればどんな数字も数えれるようになってるところ?まぁ拡張なんてする機会ないと思いますが、可読性高く、拡張性高くっていう基本姿勢を忘れると先輩に怒られちゃうね。
あと、ここまで計算すると確率の計算をするのも楽なんですが、今回は面倒なのでやりませんw

このプログラムの実行結果はこんな感じです。

count1:0
count2:1
count3:2
count4:3
count5:4
count6:5
count7:6
count8:5
count9:4
count10:3
count11:2
count12:1

うん、7が一番多いから大丈夫そうw

最後に反省点
①for($x=1;...)はどう考えてもイケてない
②そもそも全部の場合を書きだそうっていう発想が文系wwwwwwww
まぁfor文の方はループ回数を一個減らせばいいのでそんなに大きな問題ではないんですが
全部の場合を書きだそうっていうのしか思い浮かばなかったのはいかにも数学できない人の発想だなと思うwwwww
コンピューターは繰り返しの処理が得意だからそれをうまく使ったといえば聞こえはいいけど
アルゴリズムの段階からもう少し頭いい感じで作れたらもっと良かったっすね。
2つの数字の合計を書きだしてみるとある程度の法則性あるし・・・。