サイズ: 4151
コメント:
|
サイズ: 3385
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 44: | 行 44: |
1. コンストラクタ内で行う === 初期化を行うメソッドを別に用意する === |
1. コンストラクタ内で行う。 1. 初期化を行うメソッドを別に用意し、その中で行う。 1. 呼び出し側で行う。 |
行 47: | 行 48: |
* インスタンス作成時に値が決まっているもの * 値が変わらないもの |
いずれの方法をとるかは、つぎのことを考慮して決めます。 * インスタンス作成時に値が決まっているか * インスタンス使用中に値は変わるか * 初期化に手間がかかるか * 別途値を指定することがあるか |
行 50: | 行 54: |
* インスタンス作成時に値が決まっていないもの * 値か変わるもの * 初期化に手間のかかるもの === 呼び出し側で初期化する === * 別途指定したいもの ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。 . i,jは0から数えます。 ban[2][1] = 3 は図の位置に3番のピースがあることを表します。 || || || || || || || || || || || ||3|| || || || || || || || |
|
行 88: | 行 78: |
JFrame f; Container cp; |
... |
行 92: | 行 81: |
f = new JFrame(); f.setTitle("15game"); f.setVisible(true); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cp = f.getContentPane(); |
... |
行 102: | 行 86: |
p.fname = "test.jpg"; | p.fname = "game0.png"; |
行 104: | 行 88: |
cp.add(p); | ... |
行 114: | 行 98: |
for(y = 0; y < tate; y++) for(x = 0; x < yoko; x++) ban[x][y] = x + y * yoko; |
初期化 |
行 126: | 行 108: |
sx = ban[dx][dy] % yoko; sy = ban[dx][dy] / yoko; |
sx = 計算式; sy = 計算式; |
行 136: | 行 118: |
ここまでの実行例を示します。 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。 . {{attachment:game4.png}} |
盤の表現
整数型の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,1,2,...と図の順につけます。
- 右下が最後で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の内容をこのように初期化します。
データの初期化
インスタンス変数の初期化はどこで行うべきでしょうか。
次の方法が考えられます。
- コンストラクタ内で行う。
- 初期化を行うメソッドを別に用意し、その中で行う。
- 呼び出し側で行う。
いずれの方法をとるかは、つぎのことを考慮して決めます。
- インスタンス作成時に値が決まっているか
- インスタンス使用中に値は変わるか
- 初期化に手間がかかるか
- 別途値を指定することがあるか
盤を表示する
配列 ban の内容にしたがって画像を指定の位置に表示するプログラムを作ります。
メインメソッドとコンストラクタは前回までと同様に記述しなさい。
読み込む画像ファイルは game0.png を使いなさい。
33,34行目の ??? の部分に正しい式を記述しなさい。
1 import javax.swing.*;
2 import java.awt.*;
3
4 public class Game12 extends JPanel
5 {
6 int haba;
7 int yoko, tate;
8 String fname;
9 Image img;
10 int[][] ban;
11
12 public static void main(String[] args)
13 {
14 ...
15 Game12 p;
16
17 ...
18 p = new Game12();
19 p.haba = 100;
20 p.yoko = 4;
21 p.tate = 4;
22 p.fname = "game0.png";
23 p.shokika();
24 ...
25 }
26
27 void shokika()
28 {
29 int x, y;
30
31 ImageIcon ii = new ImageIcon(fname);
32 img = ii.getImage();
33 ban = new int[yoko][tate];
34 初期化
35 }
36
37 public void paintComponent(Graphics g)
38 {
39 int dx, dy, sx, sy;
40
41 for(dy = 0; dy < tate; dy++)
42 for(dx = 0; dx < yoko; dx++)
43 {
44 sx = 計算式;
45 sy = 計算式;
46 g.drawImage(img,
47 dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba,
48 sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba,
49 this);
50 }
51 }
52 }