PHPのお勉強 : ボーリングの得点計算

自動で10フレームを行い、その得点を割り出すプログラム。

1Frame 2Frame 3Frame 4Frame 5Frame 6Frame 7Frame 8Frame 9Frame 10Frame
9 0 0 6 3 9 5 4 5 4 5 3 9 0 4 2
92534495867758599105


<?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>