自動で10フレームを行い、その得点を割り出すプログラム。
| 1Frame | 2Frame | 3Frame | 4Frame | 5Frame | 6Frame | 7Frame | 8Frame | 9Frame | 10Frame | |||||||||||
| 8 | 0 | 8 | 0 | 6 | 3 | 2 | 5 | 2 | 6 | 8 | 0 | × | 1 | 8 | 5 | / | 7 | / | × | |
| 8 | 16 | 25 | 32 | 40 | 48 | 67 | 76 | 93 | 113 | |||||||||||
<?php
// ボーリングの得点結果を格納する配列
$result = array();
// ピンの数を保持
$pin = 10;
// 10フレームの3投目判定用のフラグ
$flag = 0;
for ($i = 1; $i <= 10; $i++) {
// 終了を判断するためのフラグ
$end_flag = 0;
for ($j = 1; $j <= 3; $j++) {
if ($j == 1) {
$nowpin = $pin;
}
if ($i == 10) {
$pin_out = rand(0,$nowpin);
$result[$i][$j] = $pin_out;
$nowpin = $nowpin - $pin_out;
// 10本倒していたら、10本セットして、3投目用のフラグを1にする
if ($nowpin == 0) {
$nowpin = $pin;
$flag = 1;
}
// 2投内でストライクまたはスペアが出ていない場合は、3投目がないので処理終了
if ($j == 2 && $flag == 0) {
break;
}
} else {
// 10フレーム以外は3投目はないので、繰り返し終了
if ($j == 3) {
break;
}
// ランダムで残りピン数の間で数値を求めて、投球箇所にセットする
$pin_out = rand(0,$nowpin);
$result[$i][$j] = $pin_out;
// 残りピン数から求めたピンを引く
$nowpin = $nowpin - $pin_out;
// ストライクの判定
if ($nowpin == 0) {
break;
}
}
}
}
// 合計得点
$sum = 0;
// フレームごとの得点
$frame_cnt = array();
$strike_flg = array();
for ($i =1; $i <= 10; $i++) {
$nowpin = 10;
$cnt = 0;
for ($j = 1; $j <= 3; $j++) {
// 10フレーム以外は3投目はないので、繰り返し終了
if ($j == 3 && $i != 10) {break;}
// 値が空の場合は次の値へ
if (!isset($result[$i][$j])) {continue;}
$nowpin = $nowpin-$result[$i][$j];
$sum += $result[$i][$j];
// ストライクとスペアの判定
if ($nowpin == 0 && $j == 1 && $i != 10) {
$cnt = 2;
} elseif ($nowpin == 0 && $j == 2 && $i != 10) {
$cnt = 1;
}
if ($cnt >= 1) {
for ($k = $i+1; $k <= 10; $k++) {
for ($l = 1; $l <=3; $l++) {
if (!isset($result[$k][$l])) {continue;}
if ($l == 3 || $cnt <= 0) {break;}
$sum += $result[$k][$l];
$cnt--;
}
}
break;
}
}
$frame_cnt[$i] = $sum;
}
print "<table>"."\n";
// フレーム数を表示する(10フレーム)
print "<tr>"."\n";
for ($i = 1;$i <= 10; $i++) {
$col = ($i == 10) ? 3 : 2;
print "<td colspan=\"{$col}\">{$i}Frame</td>"."\n";
}
print "</tr>"."\n";
print "<tr>"."\n";
for ($i = 1;$i <= 10; $i++) {
// 最初のピン数
$pin = 10;
for ($j = 1;$j <= 3; $j++) {
if ($i != 10 && $j == 3) {break;}
// 値が空の場合は次の値へ
if (!isset($result[$i][$j])) {continue;}
// ピンの値から倒したピンの数を引く
$pin = $pin - $result[$i][$j];
if ($i != 10) {
// スペアの場合は表示を記号にする
if ($pin == 0 && $j == 2) {
print "<td>/</td>"."\n";
// ストライクの場合は表示を記号にする
} elseif ($pin == 0 && $j = 1) {
print "<td colspan=\"2\">×</td>"."\n";
break;
// その他の場合は倒したピンの数を表示
} else {
print "<td>{$result[$i][$j]}</td>"."\n";
}
} else {
if ($pin == 0 && $flag ==1) {
print "<td>×</td>";
$pin = 10;
// 2投目か3投目でピンの数が0の場合はスペアの記号を表示する
} elseif ($pin == 0 && ($j == 2 or $j == 3)) {
print "<td>/</td>"."\n";
$pin = 10;
$flag = 1;
// 初球でストライクの場合はストライクの表示をする
} elseif ($pin == 0 && $j == 1) {
print "<td>×</td>"."\n";
$pin = 10;
$flag = 1;
} else {
print "<td>{$result[$i][$j]}</td>"."\n";
$flag = 0;
}
}
}
}
print "</tr>"."\n";
print "<tr>"."\n";
// フレームでの得点を表示する(10フレーム分)
for ($i = 1;$i <= 10; $i++) {
$col = ($i == 10) ? 3 : 2;
print "<td colspan=\"{$col}\">{$frame_cnt[$i]}</td>";
}
print "</tr>"."\n";
?>
</table>