|
そして、もう一度... |
|||||||
| 忘れられたチェック | |||||||
|
できあがった Mastermind で遊んでいる時に、間違って入力する桁数を間違えたことはないですか。前節ではユーザの回答の入力に対して、「数字であるか」と「同じ数字が使われていないか」という 2 種類のチェックを行っていました。 ところが、入力するときに桁数を間違えてしまうと
このように例外が発生してプログラムが終了してしまいます。この例外は配列の大きさ以上の要素にアクセスしたときに発生します。桁数は多くても少なくてもいけないので、正しい桁数の数字が入力されたかどうかのチェックを行わないといけないということです。 さっそく、ソースを書き換えていきましょう。ユーザからの入力の処理を行うのは Solver クラスのオブジェクトですが、Solver オブジェクトは桁数に関する情報をもっていません。どうすれば、桁数が合っているかどうかを確かめられるのでしょうか。 桁数は Mastermind クラスの定数なので、Mastermind クラスに聞きにいくことにしましょう。このために Mastermind クラスにひとつ関数 getAnswerFigure を追加しましょう。
単に桁数を帰すだけですが、変数 answerFigure はstatic な変数なので、Mastermind オブジェクトに問い合わせる必要はありません。そこで、getAnswerFigure 関数も static にしてみました。 まず回答を入れる配列の定義の部分を getAnswerFigure 関数を使用して書きかえてみます。
また、getAnswer 関数の桁数チェックの部分を示します。
入力を受け取るとまず桁数のチェックをします。文字列の長さは length 関数で調べることができます。これと getAnswerFigure 関数の戻り値が等しいか比較して、異なっていればメッセージを出力して、continue 文でもう一度 while ループに戻ります。 面白いことに、数字を全角で入力しても下に示したように、正しく処理を行うことができます。String#length 関数は文字が半角か全角であるにかかわらず、正しく文字数を帰すようになっています。
また、Integer#parseInt 関数も全角数字でも正しく int 型に変換することができるため、正しく処理が行われていくのです。
|
| そしてクラスは | ||||||||||||||||||||||||||||||||||||||||||||
|
クラスの定義は最終的には次のようになりました。変更した部分は赤字にしてあります。
説明はしませんでしたが、実装の部分で実行の効率を上げるために何箇所か変更を加えています。どこが変更されたのか比べてみて、なぜ変更したか考えてみるのもいいかもしれません。
|
||||||||||||||||||||||||||||||||||||||||||||
|
●作成したソースファイルとコンパイルを行ったクラスファイルはここでダウンロードできます mastermind2.zip (Sep. 2000) |
|
|