welcome: please sign in
location: "盤の表現"の差分
24と25のリビジョン間の差分
2009-12-06 01:24:45時点のリビジョン24
サイズ: 4044
編集者: masahiko
コメント:
2009-12-06 01:28:49時点のリビジョン25
サイズ: 4151
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 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. コンストラクタ内で行う
=== 初期化を行うメソッドを別に用意する
===
行 47: 行 50:
=== 初期化を行うメソッドを別に用意する ===

盤の表現

整数型の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. コンストラクタ内で行う

初期化を行うメソッドを別に用意する

  • インスタンス作成時に値が決まっているもの
  • 値が変わらないもの
  • インスタンス作成時に値が決まっていないもの
  • 値か変わるもの
  • 初期化に手間のかかるもの

呼び出し側で初期化する

  • 別途指定したいもの

ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。

  • i,jは0から数えます。

ban[2][1] = 3 は図の位置に3番のピースがあることを表します。

  •  

     

     

     

     

     

     

     

     

    3

     

     

     

     

     

     


盤を表示する

配列 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                 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 = "test.jpg";
  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                 for(y = 0; y < tate; y++)
  41                         for(x = 0; x < yoko; x++)
  42                                 ban[x][y] = x + y * yoko;
  43         }
  44         
  45         public void paintComponent(Graphics g)
  46         {
  47                 int dx, dy, sx, sy;
  48                 
  49                 for(dy = 0; dy < tate; dy++)
  50                         for(dx = 0; dx < yoko; dx++)
  51                         {
  52                                 sx = ban[dx][dy] % yoko;
  53                                 sy = ban[dx][dy] / yoko;
  54                                 g.drawImage(img,
  55                                         dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba,
  56                                         sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba,
  57                                         this);
  58                         }
  59         }
  60 }

ここまでの実行例を示します。

  • 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。
  • [添付]

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