スコア入力最終表示画面に、「修正」項目を追加。大した作業ではない。

ふと、スコア入力量が増えてきたので、過去のスプリットの種類をずらっと並べる簡単なページを作成してみることに。

mySQLの“のぬけすスコア格納用”テーブルから、“sprit”を含むデータを全て抜き出して、explode関数で配列に直したものを配列に格納し(2次元配列)、重複するものは削除したうえで残りピンを表示する“printImage関数”をちょっと改変したものに渡してずらっと表示。

、、、のはずが。

できない。

重複するものを削除(array_unique関数)の段階で、2番目の配列以降全て重複しているということに。

何故?

調べてみた。

PHP の array_unique で多次元配列の重複削除できるか
http://mgng.getcloudigniter.com/50

なるほど。

原因は、内部比較が文字列で、比較時に全部「Array」文字列になってるため。第2引数に SORT_REGULAR を指定すれば解決。

つまり“array_unique($spritArr,SORT_REGULAR)”とすることで解決。

いろいろ知らないことが多いねえ~。

ちなみに、過去のスプリットは全43種類。全部で何パターンあることやら。

調べてみた。

Javascriptでボウリングのスコア計算
http://wirepuller.org/record/hh/?comment=2009_12_26_1

「ヘッドピンが倒れていてかつ、自分より前に他のピンが無いというピンが2本以上ある」時にスプリットと判定する。

なんとこの条件だとスプリットのパターンは全部で459通りもある。ヘッドピンが倒れているのは最低条件なので残りの9本で作れるパターンは2の9乗=512通り。

つまり459/512=89.6%がスプリットと言える(ヘッドピン含めれば44.8%)。

普通に投げたらこういう残り方しないってのがあるからスプリットが起きる確率とは全然違うけどね。

うわ。ちゃんと考えている人いるんだねえ。

この条件だと、、、

$pinArr = (1投目に残ったピン);
$split_flag = 0;
$count = 0;
if(!in_array("1",$pinArr)){
  if(in_array("2",$pinArr)){
    ++$count;
  }
  if(in_array("3",$pinArr)){
    ++$count;
  }
  if(in_array("4",$pinArr) && !in_array("2",$pinArr)){
    ++$count;
  }
  if(in_array("5",$pinArr) && !in_array("2",$pinArr) && !in_array("3",$pinArr)){
    ++$count;
  }
  if(in_array("6",$pinArr) && !in_array("3",$pinArr)){
    ++$count;
  }
  if(in_array("7",$pinArr) && !in_array("4",$pinArr)){
    ++$count;
  }
  if(in_array("8",$pinArr) && !in_array("4",$pinArr) && !in_array("5",$pinArr)){
    ++$count;
  }
  if(in_array("9",$pinArr) && !in_array("5",$pinArr) && !in_array("6",$pinArr)){
    ++$count;
  }
  if(in_array("10",$pinArr) && !in_array("6",$pinArr)){
    ++$count;
  }
}
if($count > 1){
  $split_flag = 1;
}

ってことになるのかな?

確かめてみた。

すると、2-8と3-9の縦の並行ピンもスプリットとして数えられてしまうため、これは除外。

if($count > 1 && $pinArr != array("8","2") && $pinArr != array("9","3")){
  $split_flag = 1;
}

これで、OK。

さあ、寝よう。