Skip to content

Instantly share code, notes, and snippets.

@SotaYamaguchi
Last active October 22, 2022 06:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SotaYamaguchi/9189c85b586b56f6965ae5d90781a6ad to your computer and use it in GitHub Desktop.
Save SotaYamaguchi/9189c85b586b56f6965ae5d90781a6ad to your computer and use it in GitHub Desktop.
ボーリングのスコア計算

ボウリング

この記述は Coding Dojo_Bowling の記述を元にしています。

ワークショップにおけるこの問題の目的

問題を解ききることは重要ではありません。 TDDのプラクティスである、「レッド:失敗するテスト」「グリーン:最低限の実装」「リファクタリング」を積み重ねを体験することが目的。

問題の概要

ボウリングの 1 ゲーム分の投球記録が与えられたとき、そのゲームの合計スコアを生成するプログラムを作成してください。

スコア計算の参考例

image

※ スコアリングの際、「X」はストライク、「/」はスペア、「-」はミスを意味します。

12 34 56 78 9- -- 11 11 X X5/

上記の記録を渡したら 99 点を返す。

ここでのボウリングの採点について説明します。

  • ボウリングの 1 ゲームには、投手のターン、つまり「フレーム」が 10 回あります。
  • 各フレームでは、投手は最大 2 回の投球ですべてのピンを倒すことができます。
  • 2 回の投球ですべて倒せなかった場合、そのフレームのスコアは 2 回の投球で倒したピンの数の合計となります。
  • 2 回ですべて倒した場合は「スペア」と呼び、そのフレームのスコアは 10 + 次の投球で倒したピンの数(次のターン)となります。
  • フレーム内の最初の投球で、彼がすべてのピンを倒した場合、これをストライクと呼びます。彼のターンは終了し、フレームの彼のスコアは 10 + 彼の次の 2 回の投球で倒したピンの合計になります。
  • 最後の( 10 個目の)フレームでスペアまたはストライクを取った場合、投手は、それぞれ 1 個または 2 個のボーナスボールをさらに投げられます。これらのボーナススローは、同じターンの一部として行われます。ボーナススローですべてのピンを倒した場合、このプロセスは繰り返されません。ボーナススローは、最終フレームのスコアを計算するためにのみ使用されます。
  • ゲームスコアは、全フレームのスコアの合計です。

ルールの詳細はこちらで。ボウリングのスコアリング方法

この問題の進め方

まずは仕様を洗い出して TODO リストに書き出しましょう。 本ワークショップでは7分間のタイムボックスで TODO リストの作成を行ってください。

TODO リストの作り方はそれぞれの TODO をタイトルとした空のテストを作成する方法がおすすめです。

TODO リストの作成が終わったら簡単なテストから「レッド」「グリーン」「リファクタリング」の手順を確認しながら早速実装してみましょう!

おすすめ TODO

最初に用意する TODO として以下の TODO(テストケース) を用意することをおすすめします。

  • 2投とも1ピンのフレームが10連続なら20点を返す

以降の TODO はペアで相談して問題から洗い出してみましょう。

ピンポンプログラミングのやり方

ピンポンプログラミングを試してみましょう。

  • 開発者A, Bでペアプロする時
  • AがTODOの中でテストを作り、そのテストが失敗することを確認する
  • Bがそのテストが成功するように最小限の実装をする
  • A,Bで相談し、リファクタリングを実施する
  • 1~3を繰り返す。繰り返すごとにA,Bの役割を反転させる

TDDサイクルのなかでリファクタリングの余地がないと感じたときは、リファクタリングをしないという決断をしましょう。

その他のフレームの表記例

  • X X X X X X X X X X X X (12 投球: 12 ストライク)
  • 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/5 (21 投球: 10 スペア)
  • 1- 1- 1- 1- 1- 1- 1- 1- 1- 1- (20 投球: 1 とミスの繰り返し)
@sloth-wq
Copy link

最初に用意する TODO として以下の TODO(テストケース) を用意することをおすすめします。

のところが、パッとわからなかったので、具体例(11 11 11 11 11 11 11 11 11 11)みたいな感じで書いておいた方がスムーズに進められるかもしれないです。

@rito328
Copy link

rito328 commented Oct 21, 2022

いい感じに改善されてますね!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment