welcome: please sign in
location: "盤の表現"の差分
43と44のリビジョン間の差分
2011-01-09 00:55:08時点のリビジョン43
サイズ: 5260
編集者: masahiko
コメント:
2012-01-11 01:24:00時点のリビジョン44
サイズ: 3133
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 19: 行 19:
 . 次の図と値が同じです。0と書いてあるピースの値は0。
行 35: 行 36:
後の課題でbanの内容をこのように初期化します。
行 37: 行 37:
== データの初期化 == == 配列の初期化 ==
行 39: 行 39:
インスタンス変数初期化はどこで行うべきでしょうか。 配列banはインスタンス変数として作成し初期化します。

初期化はどこで行うべきでしょうか。
行 53: 行 55:
今回は、初期化を行うメソッドを別に用意しその中で行うことにします。
初期化を行うメソッドはshokika()とし、コンストラクタから呼び出します。


行 57: 行 64:
テスト用の画像ファイルとして [[attachment: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 として宣言していました。

{{{#!java
import javax.swing.*;
import java.awt.*;

public class Game1 extends JPanel
{
 int haba;
 int yoko, tate;
 String fname;
 Image img;
 int[][] ban;
 
 public static void main(String[] args)
 {
  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);
 }
 
 void shokika()
 {
  int x, y;
  
  ImageIcon ii = new ImageIcon(fname);
  img = ii.getImage();
  ban = new int[yoko][tate];
  演習(1)
 }
 
 public void paintComponent(Graphics g)
 {
  int dx, dy, sx, sy;
  
  for(dy = 0; dy < tate; dy++)
   for(dx = 0; dx < yoko; dx++)
   {
    sx = 演習(2)
    sy = 演習(2)
    g.drawImage(img,
     dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba,
     sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba,
     this);
   }
 }
}
}}}

盤の表現

整数型の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になります。
  • 次の図と値が同じです。0と書いてあるピースの値は0。
  • 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. 呼び出し側で行う。

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

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

今回は、初期化を行うメソッドを別に用意しその中で行うことにします。 初期化を行うメソッドはshokika()とし、コンストラクタから呼び出します。


盤を表示する

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


演習

(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です。

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