サイズ: 4044
コメント:
|
サイズ: 4836
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 22: | 行 22: |
16個のピースが図のとおりの位置にある場合、配列の内容は次のようになります。 | 16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。 |
行 31: | 行 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|| |
行 36: | 行 36: |
後の課題でbanの内容をこのように初期化します。 | |
行 39: | 行 40: |
インスタンス変数の初期化はどこで行うべきか。 | インスタンス変数の初期化はどこで行うべきでしょうか。 |
行 41: | 行 42: |
3つの方法が考えられます。 | 次の方法が考えられます。 |
行 43: | 行 44: |
=== コンストラクタ内で行う === * インスタンス作成時に値が決まっているもの * 値が変わらないもの |
1. コンストラクタ内で行う。 1. 初期化を行うメソッドを別に用意し、その中で行う。 1. 呼び出し側で行う。 |
行 47: | 行 48: |
=== 初期化を行うメソッドを別に用意する === * インスタンス作成時に値が決まっていないもの * 値か変わるもの * 初期化に手間のかかるもの |
いずれの方法をとるかは、つぎのことを考慮して決めます。 * インスタンス作成時に値が決まっているか * インスタンス使用中に値は変わるか * 初期化に手間がかかるか * 別途値を指定することがあるか |
行 52: | 行 54: |
=== 呼び出し側で初期化する === * 別途指定したいもの ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。 . i,jは0から数えます。 ban[2][1] = 3 は図の位置に3番のピースがあることを表します。 || || || || || || || || || || || ||3|| || || || || || || || |
|
行 66: | 行 58: |
メインメソッドとコンストラクタは前回までと同様に記述しなさい。 | 画像ファイルは [[attachment:game0.png]] を使います。 ダウンロードしてプログラムと同じ場所に保存しなさい。 |
行 68: | 行 61: |
読み込む画像ファイルは [[attachment:game0.png]] を使いなさい。 | 使うインスタンス変数は次のとおりです。 * haba . 1つのピースの1辺の長さ * yoko . 盤は横何個のピースでできているか * tate . 盤は縦何個のピースでできているか * fname . 画像を読み込むファイル名 * img . 読み込んだ画像 * ban . 盤の状態 |
行 70: | 行 75: |
33,34行目の ??? の部分に正しい式を記述しなさい。 | haba, yoko, tate, fname はメインメソッド内で値を指定しています。 この4つは途中で値が変わることはありません。 img, ban はメソッド shokika内で初期化を行います。 今回定義するメソッドは次の3つです * main * shokika * paintComponent paintComponentはbanの内容をもとに盤の状態を表示します。 |
行 100: | 行 115: |
p.fname = "test.jpg"; | p.fname = "game0.png"; |
行 112: | 行 127: |
for(y = 0; y < tate; y++) for(x = 0; x < yoko; x++) ban[x][y] = x + y * yoko; |
演習(1) |
行 124: | 行 137: |
sx = ban[dx][dy] % yoko; sy = ban[dx][dy] / yoko; |
sx = 演習(2) sy = 演習(2) |
行 134: | 行 147: |
---- === 演習 === |
|
行 135: | 行 150: |
ここまでの実行例を示します。 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。 . {{attachment:game4.png}} |
(1)40行目 banの要素を ||0||1||2||3|| ||4||5||6||7|| ||8||9||10||11|| ||12||13||14||15|| に初期化するための文を書きなさい。何行かになります。 (2)50、51行目 . ban[dx][dy]からsxとsyを求める式を書きなさい。 . ban[dx][dy]が0のときはsxは0,syは0です。 . ban[dx][dy]が1のときはsxは1,syは0です。 . ban[dx][dy]が2のときはsxは2,syは0です。 . ban[dx][dy]が4のときはsxは0,syは1です。 . ban[dx][dy]が9のときはsxは1,syは2です。 |
盤の表現
整数型の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 を使います。 ダウンロードしてプログラムと同じ場所に保存しなさい。
使うインスタンス変数は次のとおりです。
- haba
- 1つのピースの1辺の長さ
- yoko
- 盤は横何個のピースでできているか
- tate
- 盤は縦何個のピースでできているか
- fname
- 画像を読み込むファイル名
- img
- 読み込んだ画像
- ban
- 盤の状態
haba, yoko, tate, fname はメインメソッド内で値を指定しています。 この4つは途中で値が変わることはありません。
img, ban はメソッド shokika内で初期化を行います。
今回定義するメソッドは次の3つです
- main
- shokika
- paintComponent
paintComponentはbanの内容をもとに盤の状態を表示します。
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 JFrame f;
15 Container cp;
16 Game12 p;
17
18 f = new JFrame();
19 f.setTitle("15game");
20 f.setVisible(true);
21 f.setSize(500, 500);
22 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
23 cp = f.getContentPane();
24 p = new Game12();
25 p.haba = 100;
26 p.yoko = 4;
27 p.tate = 4;
28 p.fname = "game0.png";
29 p.shokika();
30 cp.add(p);
31 }
32
33 void shokika()
34 {
35 int x, y;
36
37 ImageIcon ii = new ImageIcon(fname);
38 img = ii.getImage();
39 ban = new int[yoko][tate];
40 演習(1)
41 }
42
43 public void paintComponent(Graphics g)
44 {
45 int dx, dy, sx, sy;
46
47 for(dy = 0; dy < tate; dy++)
48 for(dx = 0; dx < yoko; dx++)
49 {
50 sx = 演習(2)
51 sy = 演習(2)
52 g.drawImage(img,
53 dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba,
54 sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba,
55 this);
56 }
57 }
58 }
演習
(1)40行目
- banの要素を に初期化するための文を書きなさい。何行かになります。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(2)50、51行目
- ban[dx][dy]からsxとsyを求める式を書きなさい。
- ban[dx][dy]が0のときはsxは0,syは0です。
- ban[dx][dy]が1のときはsxは1,syは0です。
- ban[dx][dy]が2のときはsxは2,syは0です。
- ban[dx][dy]が4のときはsxは0,syは1です。
- ban[dx][dy]が9のときはsxは1,syは2です。