盤の表現

整数型の２次元配列 ban で盤面の状態(どのピースがどこにあるか)を表すことにします。

多次元配列を使う場合には、何番目の添え字が何に対応するかをしっかり考えておくこと。

ban[x][y]で左からx番目、上からy番目を表すとすると、盤の大きさが４×４の場合 配列要素と位置の対応はこのように考えられます。

ban[0][0]

ban[1][0]

ban[2][0]

ban[3][0]

ban[0][1]

ban[1][1]

ban[2][1]

ban[3][1]

ban[0][2]

ban[1][2]

ban[2][2]

ban[3][2]

ban[0][3]

ban[1][3]

ban[2][3]

ban[3][3]

この配列の要素の値により、各位置にどのピースが置かれているかを表します。

各ピースに図と同じ番号をつけ、これを値として使うことにします。

０と書いてあるピースの値は０。

１と書いてあるピースの値は１。

値は0から15のいずれかです。

１６個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

値と配列を対応させた表を示します。

ban[0][0]の値は0

ban[1][0]の値は1

ban[2][0]の値は2

ban[3][0]の値は3

ban[0][1]の値は4

ban[1][1]の値は5

ban[2][1]の値は6

ban[3][1]の値は7

ban[0][2]の値は8

ban[1][2]の値は9

ban[2][2]の値は10

ban[3][2]の値は11

ban[0][3]の値は12

ban[1][3]の値は13

ban[2][3]の値は14

ban[3][3]の値は15

配列の初期化

配列banはインスタンス変数として作成し初期化します。

初期化はどこで行うべきでしょうか。

次の方法が考えられます。

コンストラクタ内で行う。

初期化を行うメソッドを別に用意し、その中で行う。

呼び出し側で行う。

いずれの方法をとるかは、次のことを考慮して決めます。

インスタンス作成時に値が決まっているか

インスタンス使用中に値は変わるか

初期化に手間がかかるか

別途値を指定することがあるか

今回は、初期化を行うメソッドを別に用意しその中で行うことにします。 初期化を行うメソッドはshokika()とし、コンストラクタから呼び出します。

今回は順にならんでいる値に初期化するが、あとでランダムに並べた状態に並べるように変更します。

プログラム

プログラムの一部を示します。

public class Game5 extends JPanel implements MouseListener{ Image img; int cx, cy; int[][] ban; Game5() { ImageIcon ii = new ImageIcon("game0.png"); img = ii.getImage(); addMouseListener(this); ban = new int[4][4]; shokika(); } void shokika() { ban[0][0] = 0; ban[1][0] = 2; ban[2][0] = 3; ban[3][0] = 4; ban[0][1] = 5; ban[1][1] = 6; ... ... ban[2][3] = 14; ban[3][3] = 15; } ... ...}

演習

配列banの要素の値を

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

に初期化するために、 上の例では１６個の代入文を使っていますが、 for文を使って簡潔に書き直しなさい。