/**********************************/ /*                */ /* 15ゲームを作る第三回   */ /*                */ /* 1998/ 6/16 宍戸 輝光   */ /*                */ /**********************************/ import java.awt.*; import java.util.Random; public class g153 extends java.applet.Applet { Button nob[][]=new Button[4][4]; Button clb; Panel bp,p,cp; int ban[][]=new int[4][4]; public void init(){ int i,j; setBackground(Color.white); setLayout(new BorderLayout()); bp=new Panel(); bp.setBackground(Color.white); p=new Panel(); // 磐面用パネル作成 p.setBackground(Color.gray); // 灰色にする cp=new Panel(); cp.setBackground(Color.white); p.setLayout(new GridLayout(4,4,2,2)); // 磐面のレイアウト for (i=0;i<4;i++) // ボタン作成 for (j=0;j<4;j++) { nob[j][i]=new Button(); // ボタン作成 p.add(nob[j][i]); // 磐面にボタン配置 ban[j][i]=j+i*4+1; // 磐面情報初期設定 } ban[3][3]=0; bp.add(p); clb=new Button("New Game"); // ボタン配置 cp.add(clb); add("Center",bp); // 磐面をアプレットに配置 add("South",cp); drawBan(); // 磐面描画 } public void drawBan() { // 磐面描画 int i,j; for (i=0;i<4;i++) // 各マスの駒を調べ、ボタンに反映 for (j=0;j<4;j++) { // (j,i) のマスを調べる if (ban[j][i]==0) // 駒がなければ nob[j][i].show(false); else { // 駒の数字をボタンの文字にする nob[j][i].setLabel (String.valueOf(ban[j][i])); nob[j][i].show(true); } } repaint(); } public void clearGame() { int i,x1,y1,x2,y2,w; Random rnd=new Random(); do { for (i=0;i<20;i++) { // 乱数で各マスを入れ替える x1=Math.abs(rnd.nextInt()) % 4; y1=Math.abs(rnd.nextInt()) % 4; x2=Math.abs(rnd.nextInt()) % 4; y2=Math.abs(rnd.nextInt()) % 4; w=ban[x1][y1]; // (x1 ,y1)と(x2 ,y2)を交換 ban[x1][y1]=ban[x2][y2]; ban[x2][y2]=w; } } while ((hyouka() % 2)==0); // クリアできなければ再度配置 } public boolean action(Event evt,Object What) { int i,j; for (i=0;i<4;i++) // クリックされた駒があるか for (j=0;j<4;j++) if (evt.target==nob[j][i]) idou(j,i); if (evt.target==clb) { // New Game ボタン clearGame(); // 乱数で駒を配置 drawBan(); return true; } return false; } private void idou(int x,int y) { // 駒が移動可能なら移動 int w; if (x>0 && ban[x-1][y]==0) { // 上に移動可能か w=ban[x][y]; // 移動可能なら移動 ban[x][y]=ban[x-1][y]; ban[x-1][y]=w; } if (x<3 && ban[x+1][y]==0) { // 下に移動可能か w=ban[x][y]; ban[x][y]=ban[x+1][y]; ban[x+1][y]=w; } if (y>0 && ban[x][y-1]==0) { // 左に移動可能か w=ban[x][y]; ban[x][y]=ban[x][y-1]; ban[x][y-1]=w; } if (y<3 && ban[x][y+1]==0) { // 右に移動可能か w=ban[x][y]; ban[x][y]=ban[x][y+1]; ban[x][y+1]=w; } drawBan(); } private int hyouka() { // クリアできるか判定 int i,j,n; int koma[]=new int[16]; int kt[]=new int[15]; n=0; for (i=0;i<4;i++) koma[i]=ban[0][3-i]; koma[4]=ban[1][0]; koma[5]=ban[1][1]; koma[6]=ban[1][2]; koma[7]=ban[2][2]; koma[8]=ban[2][1]; koma[9]=ban[2][0]; for (i=10;i<14;i++) koma[i]=ban[3][i-10]; koma[14]=ban[2][3]; koma[15]=ban[1][3]; for (i=0;i<16;i++) if (koma[i]!=0) { kt[n]=koma[i]; n++; } n=0; for (i=0;i<14;i++) for (j=i+1;j<15;j++) if (kt[i]>kt[j]) n++; return n; } }