Flower Fieldは、人気ゲーム「マインスイーパー」を心温まる形で作り直したゲームです。ゲームの目的は、庭にあるすべての花を見つけることです。その手がかりになるのが数字で、そのマスに上下左右と斜めに隣接している花の数を表しています。「Flower Field」は、イタリア、ドイツ、韓国、日本、台湾のMicrosoft Windows各国語版に収録されていました。
完成したFlower Fieldの庭にある空きマスに、花の数を書き込むのが課題です。
庭は長方形の盤で、マスは空きマス(' ')か花('*')のどちらかです。
空きマスごとに、そのマスに隣接する花の数(横・縦・斜め)を数えます。 隣接する花が1つもない空きマスは、空きマスのままにします。 それ以外の場合は、隣接する花の数で置き換えます。
たとえば、次のような5 x 4の盤が渡されることがあります(ここでは画面上に表示するため、空きマスを'·'という文字で表しています):
·*·*·
··*··
··*··
·····
コードはこれを次のように変換します:
1*3*1
13*31
·2*2·
·111·
ときには例外を送出する必要があります。そのときは、エラーの原因を示す意味のあるエラーメッセージを必ず含めるようにしましょう。こうするとコードが読みやすくなり、デバッグもずっと楽になります。エラーの原因が特定のタイプだとわかっている場合は、組み込みのエラータイプのいずれかを送出するのもよいですが、その場合も意味のあるメッセージを含めるようにしてください。
この演習では、board()関数が不正な入力を受け取ったときに、raise文を使ってValueErrorを「スロー」する必要があります。テストに通るのは、exceptionをraiseし、かつメッセージを添えた場合だけです。
メッセージ付きでValueErrorを送出するには、そのメッセージをexception型の引数として書きます。
# when the board receives malformed input
raise ValueError("The board is invalid with current input.")