#acl All: == 盤の表現 == 整数型の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になります。 . {{attachment: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|| ---- == データの初期化 == インスタンス変数の初期化はどこで行うべきか。 3つの方法が考えられます。 === コンストラクタ内で行う === * インスタンス作成時に値が決まっているもの * 値が変わらないもの === 初期化を行うメソッドを別に用意する === * インスタンス作成時に値が決まっていないもの * 値か変わるもの * 初期化に手間のかかるもの === 呼び出し側で初期化する === * 別途指定したいもの ban[i][j]で上からi番目、左からj番目にどのピースがあるかを表します。 . i,jは0から数えます。 ban[2][1] = 3 は図の位置に3番のピースがあることを表します。 || || || || || || || || || || || ||3|| || || || || || || || ---- === 盤を表示する === 配列 ban の内容にしたがって画像を指定の位置に表示するプログラムを作ります。 メインメソッドとコンストラクタは前回までと同様に記述しなさい。 読み込む画像ファイルは [[attachment:game0.png]] を使いなさい。 33,34行目の ??? の部分に正しい式を記述しなさい。 {{{#!java import javax.swing.*; import java.awt.*; public class Game12 extends JPanel { int haba; int yoko, tate; String fname; Image img; int[][] ban; public static void main(String[] args) { JFrame f; Container cp; Game12 p; f = new JFrame(); f.setTitle("15game"); f.setVisible(true); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cp = f.getContentPane(); p = new Game12(); p.haba = 100; p.yoko = 4; p.tate = 4; p.fname = "test.jpg"; p.shokika(); cp.add(p); } void shokika() { int x, y; ImageIcon ii = new ImageIcon(fname); img = ii.getImage(); ban = new int[yoko][tate]; for(y = 0; y < tate; y++) for(x = 0; x < yoko; x++) ban[x][y] = x + y * yoko; } public void paintComponent(Graphics g) { int dx, dy, sx, sy; for(dy = 0; dy < tate; dy++) for(dx = 0; dx < yoko; dx++) { sx = ban[dx][dy] % yoko; sy = ban[dx][dy] / yoko; g.drawImage(img, dx*haba, dy*haba, (dx+1)*haba, (dy+1)*haba, sx*haba, sy*haba, (sx+1)*haba, (sy+1)*haba, this); } } } }}} ここまでの実行例を示します。 . 画像が表示され、クリックするとその位置を左上とする長方形が描かれます。 . {{attachment:game4.png}}