マインスイーパーは、マスの周囲(上下左右と斜め)にいくつの地雷があるかを示す数字のヒントを頼りに、地雷を見つけていく人気のゲームです。
課題は、完成したマインスイーパーのボードにある空のマスに、地雷の数を書き込むことです。ボード自体は長方形で、空のマス(' ')か地雷('*')のどちらかであるマスからできています。
それぞれの空のマスについて、そのマスに隣り合う地雷の数(上下左右と斜め)を数えます。隣り合う地雷が1つもない空のマスは、空のままにします。そうでなければ、隣り合う地雷の数に置き換えます。
たとえば、次のような5×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.")