サイズ: 3375
コメント:
|
← 2012-01-12 05:52:44時点のリビジョン51 ⇥
サイズ: 3471
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
#acl All: | |
行 4: | 行 3: |
整数型の2次元配列 ban で盤面の状態を表すことにします。 | 整数型の2次元配列 ban で盤面の状態(どのピースがどこにあるか)を表すことにします。 |
行 6: | 行 5: |
多次元配列を使う場合には、何番目の添え字が何に対応するかをしっかり理解しておくこと。 | 多次元配列を使う場合には、何番目の添え字が何に対応するかをしっかり考えておくこと。 |
行 9: | 行 8: |
配列と位置の対応はこのようになります。 | 配列要素と位置の対応はこのように考えられます。 |
行 15: | 行 14: |
各位置にどのピースが置かれているかを、この配列の要素の値で表します。 | この配列の要素の値により、各位置にどのピースが置かれているかを表します。 |
行 17: | 行 16: |
各ピースに番号をつけ、これを値として使うことにします。 . 番号は左上から0,1,2,...と図の順につけます。 . 右下が最後で15になります。 |
各ピースに図と同じ番号をつけ、これを値として使うことにします。 |
行 21: | 行 18: |
. 0と書いてあるピースの値は0。 . 1と書いてあるピースの値は1。 . 値は0から15のいずれかです。 |
|
行 22: | 行 22: |
16個のピースが図のとおりの位置にある場合、配列の内容は次のようになります。 | 16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。 |
行 29: | 行 29: |
値と配列を対応させた表を示します。 | |
行 30: | 行 31: |
||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[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|| |
行 35: | 行 36: |
---- == 配列の初期化 == |
|
行 36: | 行 39: |
ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。 . i,jは0から数えます。 |
配列banはインスタンス変数として作成し初期化します。 |
行 39: | 行 41: |
ban[2][1] = 3 は図の位置に3番のピースがあることを表します。 || || || || || || || || || || || ||3|| || || || || || || || |
初期化はどこで行うべきでしょうか。 次の方法が考えられます。 1. コンストラクタ内で行う。 1. 初期化を行うメソッドを別に用意し、その中で行う。 1. 呼び出し側で行う。 いずれの方法をとるかは、次のことを考慮して決めます。 * インスタンス作成時に値が決まっているか * インスタンス使用中に値は変わるか * 初期化に手間がかかるか * 別途値を指定することがあるか 今回は、初期化を行うメソッドを別に用意しその中で行うことにします。 初期化を行うメソッドはshokika()とし、コンストラクタから呼び出します。 . 今回は順にならんでいる値に初期化するが、あとでランダムに並べた状態に並べるように変更します。 |
行 45: | 行 59: |
=== 盤を表示する === 配列 ban の内容にしたがって画像を指定の位置に表示するプログラムを作ります。 |
=== プログラム === プログラムの一部を示します。 {{{ 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(); } |
行 48: | 行 77: |
メインメソッドとコンストラクタは前回までと同様に記述しなさい。 | 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; } ... ... } }}} |
行 50: | 行 95: |
読み込む画像ファイルは [[attachment:game0.png]] を使いなさい。 33,34行目の ??? の部分に正しい式を記述しなさい。 {{{#!java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Game12 extends JPanel implements MouseListener { static final int pSize = 100; static final int nx = 4; static final int ny = 4; Image img; int mx = 0; int my = 0; int[][] ban= {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}}; public static void main(String[] args) { ... } Game12() { ... } public void paintComponent(Graphics g) { int i, j, x, y; for(i = 0; i < ny; i++) for(j = 0; j < nx; j++) { x = ??? ; y = ??? ; g.drawImage(img, i*pSize, j*pSize, (i+1)*pSize, (j+1)*pSize, x*pSize, y*pSize, (x+1)*pSize, (y+1)*pSize, this); } g.setColor(Color.orange); g.drawRect(mx, my, pSize, pSize); } public void mousePressed(MouseEvent e) { mx = e.getX(); my = e.getY(); repaint(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } } }}} ここまでの実行例を示します。 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。 . {{attachment:game4.png}} |
---- === 演習 === 配列banの要素の値を ||0||1||2||3|| ||4||5||6||7|| ||8||9||10||11|| ||12||13||14||15|| に初期化するために、 上の例では16個の代入文を使っていますが、 for文を使って簡潔に書き直しなさい。 |
盤の表現
整数型の2次元配列 ban で盤面の状態(どのピースがどこにあるか)を表すことにします。
- 多次元配列を使う場合には、何番目の添え字が何に対応するかをしっかり考えておくこと。
ban[x][y]で左からx番目、上からy番目を表すとすると、盤の大きさが4×4の場合 配列要素と位置の対応はこのように考えられます。
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と書いてあるピースの値は0。
- 1と書いてあるピースの値は1。
- 値は0から15のいずれかです。
16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。
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
に初期化するために、 上の例では16個の代入文を使っていますが、 for文を使って簡潔に書き直しなさい。