それでは、具体的にメソッドを持つクラスを考えてみましょう。例えば、正六面体のサイコロをプログラムで表現してみましょう。とても単純なので、拍子抜けするかもしれませんが、サイコロを表現するクラスとしては「Dice」クラスを用意します。
そこで、まずはEclipseでDiceクラスを作成しておきましょう。次のような手順で新規にクラスを作成することにします。
Diceクラスが次のように作成されます。
public class Dice { }
次に、「このDiceの振る舞いとは何か」を考えると、「サイコロを振る」ということを思い付くはずです。この振る舞いに名前を付けて「roll」と呼ぶことにしましょう。つまり、「サイコロを振る」ということをプログラムで実行したい場合は、「Diceのオブジェクトへrollと命令をすればよい」ということにします。
このrollメソッドでは、1から6の整数のうちどれかがランダムに選ばれて、「戻り値」となるようにプログラムを作成します。サイコロを振るに当たっては、特に情報はいらないので、パラメータは必要ありません。従って、この振る舞いを表現するメソッドの定義は、次のようになります。
int roll() { }
次に、このメソッドの本体処理をコーディングします。ランダムに整数を生成するのはちょっと難しいので、ここでは取りあえず1から6までの整数値のどれかを戻すようにします。複数の値を扱うには、連載第5回の「データ集合を扱うのに便利なJavaの配列と拡張for文」で解説した「配列」を使えば良かったですね。
フィールドとして戻す値を保持する配列「values」と、この配列での位置を保持する「current」を用意します。Javaのクラスにおけるフィールドはクラスの属性を表すことを思い出してください。つまり、このクラスはvaluesとcurrentという属性を持つことになります。これらを使ってrollメソッドの処理を次のように実現します。
public class Dice { int[] values = new int[] { 3, 4, 2, 1, 5, 6 }; int current = 0; int roll() { current++; if (current == 6) current = 0; return values[current]; } }
「int[ ]」から「int current=0;」まではフィールドの宣言で、残りはrollメソッドのコードです。メソッドの戻り値は「return」という予約語を使って戻すことができます。ここでは、配列valuesの添え字currentの位置の値を戻しています。このメソッドが初めて呼ばれたときは、currentの値は1となるので、values[1]の値である4が戻ることになります。
次に、メソッドが呼ばれるとcurrentの値は2となるので、values[2]の値である2が戻ることになります。配列の添え字は0から始まることに注意してください。こうしてメソッドが呼ばれていくと、currentの値は6となります。そのときは、0に戻して配列valuesの要素数以上の添え字が使われないようにしています。
この例では、配列の値を順に戻しているだけなので、このサイコロは次にどんな値となるかがすぐに推測できてしまうイカサマサイコロとなります。これまで学んだ知識で作ったので仕方がありませんが、一応サイコロであることには変わりありません。ここは、取り合えず妥協して先に進みましょう。
次に、先ほど■作成したサイコロプログラム(Dice)を利用するクラスを作成します。ここでは、動作確認用のクラスということで、「DiceTest」クラスを作成します。Diceクラスと同じようにEclipseで作成すればよいのですが、3、4番目の手順(太字の部分)だけは以下のように置き換えてください。
生成されたDiceTestクラスを、次のように編集します。
public class DiceTest { public static void main(String[] args) { Dice dice = new Dice(); System.out.println(dice.roll()); // 4 System.out.println(dice.roll()); // 2 System.out.println(dice.roll()); // 1 System.out.println(dice.roll()); // 5 System.out.println(dice.roll()); // 6 System.out.println(dice.roll()); // 3 System.out.println(dice.roll()); // 4 } }
DiceTestクラスが作成できたら、動作確認のために「サイコロを連続7回振る」という処理を実行します。そのために、サイコロのインスタンスを「new演算子」で作成して、そのインスタンスのrollメソッドを7回呼んで戻ってきた値をそのまま「System.out.println」でコンソール画面へ出力するプログラムにしました。参考までに、表示される値を各行にコメントとして併記しました。
イカサマサイコロなので何度実行しても結果は同じで、「4 2 1 5 6 3 4」という値が順に出力されます。
4 2 1 5 6 3 4
ちなみに、ここでは一般的なサイコロとして正六面体のものを考えましたが、テーブルゲーム版のロールプレイングゲームなどでは、正四面体や正八面体のサイコロも使います。そういったサイコロを同様なプログラムで表現するとどうなるでしょうか。
例えば、下記のようになります。配列valuesのlengthフィールドは配列に含まれる要素数なので、これを使うと、メソッド内のコードはそのまま流用できて、クラス名とvaluesだけ変更すればよいことに気が付きます。
public class Dice4 { int[] values = new int[] { 3, 4, 2, 1 }; int current = 0; int roll() { current++; if (current == values.length) current = 0; return values[current]; } }
public class Dice8 { int[] values = new int[] { 3, 4, 7, 1, 5, 2, 6, 8 }; int current = 0; int roll() { current++; if (current == values.length) current = 0; return values[current]; } }
次ページでは標準APIのクラスとメソッドを使って、サイコロをイカサマではなくしてみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.