welcome: please sign in

2009-12-16 04:35:48時点のリビジョン40

メッセージを消す
location: 盤の表現

盤の表現

整数型の2次元配列 ban で盤面の状態を表すことにします。

ban[x][y]で左からx番目、上からy番目を表すとすると、盤の大きさが4×4の場合 配列と位置の対応はこのようになります。

各位置にどのピースが置かれているかを、この配列の要素の値で表します。

各ピースに番号をつけ、これを値として使うことにします。

16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。

値と配列を対応させた表を示します。

後の課題でbanの内容をこのように初期化します。


データの初期化

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

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

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

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


盤を表示する

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

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

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

haba, yoko, tate, fname の値はメインメソッド内で指定しています。 この4つは途中で値が変わることはありません。

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

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

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行目

(2)50、51行目