import java.applet.*; import java.awt.*; import java.awt.event.*; public class board_wh extends Applet implements Runnable{ Image os; Graphics og; Thread th = null; int bd[][] = {{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,1}, {1,0,0,1},{0,1,1,0},{0,1,1,1},{1,0,1,1}}; int td[][][] = {{{1,2,3,4},{0,0,0,0},{5,6,7,8}}, {{0,0,0,0},{0,0,0,0},{0,0,0,0}}}; int hd[][] = new int[4][4]; int dd = 0,dn = 0; int px,py,sx,sy; int sw = 0; int sp; public void init(){ os = createImage(560,210); og = os.getGraphics(); setBackground(Color.white); addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e){ if((e.getClickCount() == 2)&&(Math.abs(e.getX()-280)<80)&&(Math.abs(e.getY()-195)<15)){ sw = 0; if((dn == 4)&&(dd == 0)){ for(int k = 0;k < 4;k ++){ td[1][0][k] = td[0][0][k] ; td[0][0][k] = 0; td[1][2][k] = td[0][2][k] ; td[0][2][k] = 0; } dd = 1; }else if((dn == 4)&&(dd == 1)){ for(int k = 0;k < 4;k ++){ td[0][0][k] = td[1][0][k] ; td[1][0][k] = 0; td[0][2][k] = td[1][2][k] ; td[1][2][k] = 0; } dd = 0; } }else{ if(sw == 0){ if(dd == 0){ sx = (e.getX() - 20) / 180; sy = (e.getY() - 20) / 40; }else if(dd == 1){ sx = (e.getX() - 20) / 180; sy = (e.getX() - 20 - sx * 180) / 40; } if(sy > 3)sy = 3; sw = 1; }else if(sw == 1){ if((sx == px)&&(sy == py)){ if(td[dd][sx][sy] != 0){ sp = bd[td[dd][sx][sy]-1][0] ; bd[td[dd][sx][sy]-1][0] = bd[td[dd][sx][sy]-1][3] ; bd[td[dd][sx][sy]-1][3] = sp; sp = bd[td[dd][sx][sy]-1][1] ; bd[td[dd][sx][sy]-1][1] = bd[td[dd][sx][sy]-1][2] ; bd[td[dd][sx][sy]-1][2] = sp; } sw = 0; }else{ sp = td[dd][sx][sy] ; td[dd][sx][sy] = td[dd][px][py] ; td[dd][px][py] = sp; sw = 0; } } } dn = 0; for(int k = 0;k < 4;k ++){ if(td[0][1][k] != 0)dn ++; if(td[1][1][k] != 0)dn ++; } if((dn == 4)&&(dd == 1)){ for(int t1 = 0;t1 < 4;t1 ++){ for(int t2 = 0;t2 < 4;t2 ++){ hd[t1][t2] = bd[td[0][1][t1]-1][t2]; } } } repaint(); } } ); addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ if(dd == 0){ px = (e.getX() - 20) / 180; py = (e.getY() - 20) / 40; }else if(dd == 1){ px = (e.getX() - 20) / 180; py = (e.getX() - 20 - px * 180) / 40; } if(py > 3)py = 3; repaint(); } } ); } public void paint(Graphics g){ og.setColor(Color.white); og.fillRect(0,0,560,210); og.setColor(Color.black); og.fillRoundRect(202,22,156,156,15,15); if(dd == 0){ for(int i1 = 0;i1 < 3;i1 ++){ for(int i2 = 0;i2 < 4;i2 ++){ if(td[0][i1][i2] != 0)board(20+180*i1,20+40*i2,td[0][i1][i2]); } } }else if(dd == 1){ dd = 0; for(int i0 = 0;i0 < 4;i0 ++){ if(td[0][1][i0] != 0)board(20+180,20+40*i0,td[0][1][i0]); } dd = 1; for(int i1 = 0;i1 < 3;i1 ++){ for(int i2 = 0;i2 < 4;i2 ++){ if(td[1][i1][i2] != 0)board(20+40*i2+180*i1,20,td[1][i1][i2]); } } } if(sw == 1){ if(dd == 0){ frame(px*180+20,py*40+20,0); frame(sx*180+20,sy*40+20,1); }else if(dd == 1){ frame(px*180+py*40+20,20,0); frame(sx*180+sy*40+20,20,1); } } og.setColor(Color.red); if(dn == 4)og.drawString("Direction changes by double click.",195,200); g.drawImage(os,0,0,this); } public void board(int x , int y , int no){ if(dd == 0){ og.setColor(new Color(153,51,0)); og.fillRoundRect(x,y,160,40,15,15); og.setColor(Color.gray); og.drawRoundRect(x,y,160,40,15,15); for(int h = 0;h < 4;h ++){ if(bd[no-1][h] == 1){ if(x == 200){ og.setColor(Color.black); }else{ og.setColor(Color.white); } og.fillOval(x+40*h+4,y+4,32,32); og.setColor(Color.gray); og.drawOval(x+40*h+4,y+4,32,32); } } }else if(dd == 1){ og.setColor(new Color(153,51,0)); og.fillRoundRect(x,y,40,160,15,15); og.setColor(Color.gray); og.drawRoundRect(x,y,40,160,15,15); for(int h = 0;h < 4;h ++){ if(bd[no-1][h] == 1){ if((x >= 200)&&(x <= 320)){ if(hd[h][(x-200)/40] == 1){ og.setColor(Color.black); }else{ og.setColor(new Color(145,51,0)); } }else{ og.setColor(Color.white); } og.fillOval(x+4,y+40*h+4,32,32); og.setColor(Color.gray); og.drawOval(x+4,y+40*h+4,32,32); } } } } public void frame(int x , int y , int c){ if(c == 0){ og.setColor(Color.blue); }else if(c == 1){ og.setColor(Color.green); } if(dd == 0){ og.drawRect(x,y,160,40); og.drawRect(x-1,y-1,162,42); }else if(dd == 1){ og.drawRect(x,y,40,160); og.drawRect(x-1,y-1,42,162); } } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void stop(){ th = null; } public void run(){ while(th != null){ try{ Thread.sleep(30); } catch (InterruptedException e){ } } } public void update( Graphics g ){ paint( g ) ; } }