welcome: please sign in
location: "盤の表現"の差分
25と41のリビジョン間の差分 (その間の編集: 16回)
2009-12-06 01:28:49時点のリビジョン25
サイズ: 4151
編集者: masahiko
コメント:
2010-12-23 02:25:17時点のリビジョン41
サイズ: 4913
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
#acl All:
行 22: 行 21:
16個のピースが図のとおりの位置にある場合、配列の内容は次のようになります。 16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。
行 44: 行 43:
 1. コンストラクタ内で行う
=== 初期化を行うメソッドを別に用意する ===
 1. コンストラクタ内で行う
 1. 初期化を行うメソッドを別に用意し、その中で行う。
1. 呼び出し側で行う。
行 47: 行 47:
 * インスタンス作成時に値が決まっているもの
 * 値が変わらないもの
いずれの方法をとるかは、次のことを考慮して決めます。
 * インスタンス作成時に値が決まっているか
 * インスタンス使用中に値は変わるか
 * 初期化に手間がかかるか
 * 別途値を指定することがあるか
行 50: 行 53:
 * インスタンス作成時に値が決まっていないもの
 * 値か変わるもの
 * 初期化に手間のかかるもの

=== 呼び出し側で初期化する ===
 * 別途指定したいもの
ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。
 . i,jは0から数えます。

ban[2][1] = 3 は図の位置に3番のピースがあることを表します。
 || || || || ||
 || || || || ||
 || ||3|| || ||
 || || || || ||
行 68: 行 57:
メインメソッドとコンストラクタは前回までと同様に記述しなさい。 テスト用の画像ファイルとして [[attachment:game0.png]], [[attachment:game0.gif]] を用意しました。
それぞれのピースに数が書かれている画像です。
ダウンロードしてプログラムと同じ場所に保存して利用しなさい。
行 70: 行 61:
読み込む画像ファイルは [[attachment:game0.png]] を使いなさい。 使うインスタンス変数は次のとおりです。
 * haba
   . 1つのピースの1辺の長さ
 * yoko
   . 盤は横何個のピースでできているか
 * tate
   . 盤は縦何個のピースでできているか
 * fname
   . 画像を読み込むファイル名
 * img
   . 読み込んだ画像
 * ban
   . 盤の状態
行 72: 行 75:
33,34行目の ??? の部分に正しい式を記述しなさい。 haba, yoko, tate, fname の値はメインメソッド内で指定しています。
この4つは途中で値が変わることはありません。

img, ban はメソッド shokika内で初期化を行います。

今回定義するメソッドは次の3つです
 * main
 * shokika
 * paintComponent

paintComponentはbanの内容をもとに盤の状態を表示します。
行 78: 行 91:
public class Game12 extends JPanel public class Game1 extends JPanel
行 89: 行 102:
  Container cp;
  Game12 p;
  JPanel p;
行 97: 行 109:
  cp = f.getContentPane();
p = new Game12();
  p = new Game1();
行 102: 行 113:
  p.fname = "test.jpg";   p.fname = "game0.png";
行 104: 行 115:
  cp.add(p);   f.add(p);
行 114: 行 125:
  for(y = 0; y < tate; y++)
   for(x = 0; x < yoko; x++)
    ban[x][y] = x + y * yoko;
  演習(1)
行 126: 行 135:
    sx = ban[dx][dy] % yoko;
    sy = ban[dx][dy] / yoko;
    sx = 演習(2)
    sy = 演習(2)
行 136: 行 145:
----
=== 演習 ===
行 137: 行 148:
ここまでの実行例を示します。
 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。
 . {{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になります。
  • game0s.png

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の内容をこのように初期化します。


データの初期化

インスタンス変数の初期化はどこで行うべきでしょうか。

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

  1. コンストラクタ内で行う。
  2. 初期化を行うメソッドを別に用意し、その中で行う。
  3. 呼び出し側で行う。

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

  • インスタンス作成時に値が決まっているか
  • インスタンス使用中に値は変わるか
  • 初期化に手間がかかるか
  • 別途値を指定することがあるか


盤を表示する

配列 ban の内容にしたがって画像を指定の位置に表示するプログラムを作ります。

テスト用の画像ファイルとして game0.png, game0.gif を用意しました。 それぞれのピースに数が書かれている画像です。 ダウンロードしてプログラムと同じ場所に保存して利用しなさい。

使うインスタンス変数は次のとおりです。

  • 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 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                 JPanel 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.haba = 100;
  24                 p.yoko = 4;
  25                 p.tate = 4;
  26                 p.fname = "game0.png";
  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)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です。

盤の表現 (最終更新日時 2012-01-12 05:52:44 更新者 masahiko)