サイズ: 3988
コメント:
|
サイズ: 5260
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
#acl All: | |
行 22: | 行 21: |
16個のピースが図のとおりの位置にある場合、配列の内容は次のようになります。 | 16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。 |
行 31: | 行 30: |
||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: | 行 35: |
後の課題でbanの内容をこのように初期化します。 | |
行 39: | 行 39: |
インスタンス変数の初期化はどこで行うべきか。 | インスタンス変数の初期化はどこで行うべきでしょうか。 |
行 41: | 行 41: |
3つの方法が考えられます。 | 次の方法が考えられます。 |
行 43: | 行 43: |
=== コンストラクタ内で行う === * インスタンス作成時に値が決まっているもの * 値が変わらないもの |
1. コンストラクタ内で行う。 1. 初期化を行うメソッドを別に用意し、その中で行う。 1. 呼び出し側で行う。 |
行 47: | 行 47: |
=== 初期化を行うメソッドを別に用意する === * インスタンス作成時に値が決まっていないもの * 値か変わるもの * 初期化に手間のかかるもの |
いずれの方法をとるかは、次のことを考慮して決めます。 * インスタンス作成時に値が決まっているか * インスタンス使用中に値は変わるか * 初期化に手間がかかるか * 別途値を指定することがあるか |
行 52: | 行 53: |
=== 呼び出し側で初期化する === * 別途指定したいもの ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。 . i,jは0から数えます。 ban[2][1] = 3 は図の位置に3番のピースがあることを表します。 || || || || || || || || || || || ||3|| || || || || || || || |
|
行 66: | 行 57: |
メインメソッドとコンストラクタは前回までと同様に記述しなさい。 | テスト用の画像ファイルとして [[attachment:game0.png]] を用意しました。 それぞれのピースに数が書かれている画像です。 ダウンロードしてプログラムと同じ場所に保存して利用しなさい。 |
行 68: | 行 61: |
読み込む画像ファイルは [[attachment:game0.png]] を使いなさい。 | 使うインスタンス変数は次のとおりです。 * haba . 1つのピースの1辺の長さ * yoko . 盤は横何個のピースでできているか * tate . 盤は縦何個のピースでできているか * fname . 画像を読み込むファイル名 * img . 読み込んだ画像 * ban . 盤の状態 |
行 70: | 行 75: |
33,34行目の ??? の部分に正しい式を記述しなさい。 | fname, haba, yoko, tate の値はメインメソッド内で指定しています。 この4つは途中で値が変わることはありません。 img, ban はメソッド shokika内で初期化を行います。 今回定義するメソッドは次の3つです * main * shokika * paintComponent paintComponentはbanの内容をもとに盤の状態を表示します。 クラス名は '''Game1''' としました。 mainメソッド内で p.属性 や p.メソッド() の形で使うため 変数 p の宣言は実際のクラスである Game1 でなければなりません。 * このような使い方がなければ親クラスである JPanel としてよい。 * 前回までは JPanel として宣言していました。 |
行 75: | 行 98: |
import java.awt.event.*; | |
行 77: | 行 99: |
public class Game12 extends JPanel implements MouseListener | public class Game1 extends JPanel |
行 79: | 行 101: |
static final int pSize = 100; static final int nx = 4; static final int ny = 4; |
int haba; int yoko, tate; String fname; |
行 84: | 行 105: |
int mx = 0; int my = 0; int[][] ban= {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}}; |
int[][] ban; |
行 90: | 行 109: |
... | JFrame f; Game1 p; f = new JFrame(); f.setTitle("15game"); f.setVisible(true); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p = new Game1(); p.fname = "game0.png"; p.haba = 100; p.yoko = 4; p.tate = 4; p.shokika(); f.add(p); |
行 93: | 行 126: |
Game12() | void shokika() |
行 95: | 行 128: |
... | int x, y; ImageIcon ii = new ImageIcon(fname); img = ii.getImage(); ban = new int[yoko][tate]; 演習(1) |
行 100: | 行 138: |
int i, j, x, y; | int dx, dy, sx, sy; |
行 102: | 行 140: |
for(i = 0; i < ny; i++) for(j = 0; j < nx; j++) |
for(dy = 0; dy < tate; dy++) for(dx = 0; dx < yoko; dx++) |
行 105: | 行 143: |
x = ??? ; y = ??? ; |
sx = 演習(2) sy = 演習(2) |
行 108: | 行 146: |
i*pSize, j*pSize, (i+1)*pSize, (j+1)*pSize, x*pSize, y*pSize, (x+1)*pSize, (y+1)*pSize, |
dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba, sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba, |
行 112: | 行 150: |
g.setColor(Color.orange); g.drawRect(mx, my, pSize, pSize); |
|
行 115: | 行 151: |
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) { } |
|
行 129: | 行 153: |
---- === 演習 === |
|
行 130: | 行 156: |
ここまでの実行例を示します。 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。 . {{attachment:game4.png}} |
(1)38行目 banの要素を ||0||1||2||3|| ||4||5||6||7|| ||8||9||10||11|| ||12||13||14||15|| に初期化するための文を書きなさい。何行かになります。 (2)48,49行目 . 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
- 盤の状態
fname, haba, yoko, tate の値はメインメソッド内で指定しています。 この4つは途中で値が変わることはありません。
img, ban はメソッド shokika内で初期化を行います。
今回定義するメソッドは次の3つです
- main
- shokika
- paintComponent
paintComponentはbanの内容をもとに盤の状態を表示します。
クラス名は Game1 としました。
mainメソッド内で p.属性 や p.メソッド() の形で使うため 変数 p の宣言は実際のクラスである Game1 でなければなりません。
- このような使い方がなければ親クラスである JPanel としてよい。
- 前回までは JPanel として宣言していました。
1 import javax.swing.*;
2 import java.awt.*;
3
4 public class Game1 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 Game1 p;
16
17 f = new JFrame();
18 f.setTitle("15game");
19 f.setVisible(true);
20 f.setSize(500, 500);
21 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22 p = new Game1();
23 p.fname = "game0.png";
24 p.haba = 100;
25 p.yoko = 4;
26 p.tate = 4;
27 p.shokika();
28 f.add(p);
29 }
30
31 void shokika()
32 {
33 int x, y;
34
35 ImageIcon ii = new ImageIcon(fname);
36 img = ii.getImage();
37 ban = new int[yoko][tate];
38 演習(1)
39 }
40
41 public void paintComponent(Graphics g)
42 {
43 int dx, dy, sx, sy;
44
45 for(dy = 0; dy < tate; dy++)
46 for(dx = 0; dx < yoko; dx++)
47 {
48 sx = 演習(2)
49 sy = 演習(2)
50 g.drawImage(img,
51 dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba,
52 sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba,
53 this);
54 }
55 }
56 }
演習
(1)38行目
- banの要素を に初期化するための文を書きなさい。何行かになります。
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(2)48,49行目
- 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です。