welcome: please sign in
location: "盤の表現"の差分
7と51のリビジョン間の差分 (その間の編集: 44回)
2009-12-04 05:43:55時点のリビジョン7
サイズ: 1672
編集者: masahiko
コメント:
2012-01-12 05:52:44時点のリビジョン51
サイズ: 3471
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
#acl All:
行 4: 行 3:
整数型の2次元配列 ban で盤面の状態を表すことにします。 整数型の2次元配列 ban で盤面の状態(どのピースがどこにあるか)を表すことにします。
行 6: 行 5:
まず、各ピースに番号をつけます。
 . 左上から0,1,2,...と図の順につけます。
 . 右下が最後で15になります。
 多次元配列を使う場合には、何番目の添え字が何に対応するかをしっかり考えておくこと。

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]||

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

各ピースに図と同じ番号をつけ、これを値として使うことにします。
行 10: 行 18:
 . 0と書いてあるピースの値は0。
 . 1と書いてあるピースの値は1。
 . 値は0から15のいずれかです。
行 11: 行 22:
ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。
 . i,jは0から数えます。
16個のピースが図のとおりの位置にある場合、配列の各要素の値は次のようになります。
行 14: 行 24:
ban[2][1] = 3
|| || || || ||
|| || || || ||
|| ||3|| || ||
|| || || || ||
 ||0||1||2||3||
 ||4||5||6||7||
 ||8||9||10||11||
 ||12||13||14||15||
行 20: 行 29:
 . [[attachment:game0.png]] 値と配列を対応させた表を示します。
行 22: 行 31:
 . {{attachment:game4.png}}  ||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||
行 24: 行 36:
{{{#!java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
----
== 配列の初期化 ==
行 29: 行 39:
public class Game12 extends JPanel implements MouseListener 配列banはインスタンス変数として作成し初期化します。

初期化はどこで行うべきでしょうか。

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

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

いずれの方法をとるかは、次のことを考慮して決めます。
 * インスタンス作成時に値が決まっているか
 * インスタンス使用中に値は変わるか
 * 初期化に手間がかかるか
 * 別途値を指定することがあるか

今回は、初期化を行うメソッドを別に用意しその中で行うことにします。
初期化を行うメソッドはshokika()とし、コンストラクタから呼び出します。
 . 今回は順にならんでいる値に初期化するが、あとでランダムに並べた状態に並べるように変更します。
----
=== プログラム ===
プログラムの一部を示します。
 {{{
public class Game5 extends JPanel implements MouseListener
行 31: 行 64:
 static final int pSize = 100;
 static final int nx = 4;
 static final int ny = 4;
 Image img;
 int cx, cy;
 int[][] ban;
行 35: 行 68:
 Image img;
 int mx = 0;
 int my = 0;
 int[][] ban= {{0,1,2,3}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}};
 
 public static void main(String[] args)
 Game5()
行 42: 行 70:
  ImageIcon ii = new ImageIcon("game0.png");
  img = ii.getImage();
  addMouseListener(this);
  ban = new int[4][4];
  shokika();
 }

 void shokika()
 {
  ban[0][0] = 0;
  ban[1][0] = 2;
  ban[2][0] = 3;
  ban[3][0] = 4;
  ban[0][1] = 5;
  ban[1][1] = 6;
行 43: 行 86:
  ...
  ban[2][3] = 14;
  ban[3][3] = 15;
行 44: 行 90:
   Game12()
 {
  ...
 }
 
 public void paintComponent(Graphics g)
 {
  int i, j, x, y;
  
  for(i = 0; i < ny; i++)
   for(j = 0; j < nx; j++)
   {
    x = ??? ;
    y = ??? ;
    g.drawImage(img,
     i*pSize, j*pSize, (i+1)*pSize, (j+1)*pSize,
     x*pSize, y*pSize, (x+1)*pSize, (y+1)*pSize,
     this);
   }
  g.setColor(Color.orange);
  g.drawRect(mx, my, pSize, pSize);
 }
 
 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) { }
 ...
 ...
行 80: 行 93:
}}}  }}}

----
=== 演習 ===
配列banの要素の値を
 ||0||1||2||3||
 ||4||5||6||7||
 ||8||9||10||11||
 ||12||13||14||15||
に初期化するために、
上の例では16個の代入文を使っていますが、
for文を使って簡潔に書き直しなさい。

盤の表現

整数型の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]

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

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

  • game0s.png

  • 0と書いてあるピースの値は0。
  • 1と書いてあるピースの値は1。
  • 値は0から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はインスタンス変数として作成し初期化します。

初期化はどこで行うべきでしょうか。

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

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

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

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

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

  • 今回は順にならんでいる値に初期化するが、あとでランダムに並べた状態に並べるように変更します。


プログラム

プログラムの一部を示します。

  • public class Game5 extends JPanel implements MouseListener
    {
            Image img;
            int cx, cy;
            int[][] ban;
            
            Game5()
            {
                    ImageIcon ii = new ImageIcon("game0.png");
                    img = ii.getImage();
                    addMouseListener(this);
                    ban = new int[4][4];
                    shokika();
            }
    
            void shokika()
            {
                    ban[0][0] = 0;
                    ban[1][0] = 2;
                    ban[2][0] = 3;
                    ban[3][0] = 4;
                    ban[0][1] = 5;
                    ban[1][1] = 6;
                    ...
                    ...
                    ban[2][3] = 14;
                    ban[3][3] = 15;
            }
            ...
            ...
    }


演習

配列banの要素の値を

  • 0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

に初期化するために、 上の例では16個の代入文を使っていますが、 for文を使って簡潔に書き直しなさい。

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