import java.applet.*; import java.awt.*; import java.awt.event.*; public class container extends Applet implements Runnable{ Image os; Graphics og; Thread th = null; int co; double pi = 3.14159263 / 2; double rs[] = new double[3]; int td[][] = new int[4][3]; int px,py,pr,pn,kx,ky; int sx=3,sy=0,sw; int fg,dd = -1; Button shuf; public void init(){ os = createImage(320,340); og = os.getGraphics(); setBackground(Color.white); setLayout(new BorderLayout()); Panel pan = new Panel(); pan.setLayout(new FlowLayout()); pan.add(shuf = new Button(" shuffle ")); add("South",pan); for(int i1 = 0;i1 < 4;i1 ++){ for(int i2 = 0;i2 < 3;i2 ++){ td[i1][i2] = i1 + 1; } } td[3][0] = 0; addMouseListener( new MouseAdapter(){ public void mousePressed(MouseEvent e){ if(fg == 0){ px = e.getX(); py = e.getY(); pr = (int)Math.sqrt((px-160)*(px-160)+(py-160)*(py-160)); if((px>180)&&(px<300)&&(py>140)&&(py<180)){ if(sx == 0){ pn = (px - 180) / 40; if(sy == 0){ if(pn == 1){ td[0][0] = td[0][1] ; td[0][1] = 0 ; sy = 1 ; repaint() ; }else if(pn == 2){ td[0][0] = td[0][1] ; td[0][1] = td[0][2] ; td[0][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 1){ if(pn == 0){ td[0][1] = td[0][0] ; td[0][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 2){ td[0][1] = td[0][2] ; td[0][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 2){ if(pn == 0){ td[0][2] = td[0][1] ; td[0][1] = td[0][0] ; td[0][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 1){ td[0][2] = td[0][1] ; td[0][1] = 0 ; sy = 1 ; repaint() ; } } } }else if((px>140)&&(px<180)&&(py>180)&&(py<300)){ if(sx == 1){ pn = (py - 180) / 40; if(sy == 0){ if(pn == 1){ td[1][0] = td[1][1] ; td[1][1] = 0 ; sy = 1 ; repaint() ; }else if(pn == 2){ td[1][0] = td[1][1] ; td[1][1] = td[1][2] ; td[1][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 1){ if(pn == 0){ td[1][1] = td[1][0] ; td[1][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 2){ td[1][1] = td[1][2] ; td[1][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 2){ if(pn == 0){ td[1][2] = td[1][1] ; td[1][1] = td[1][0] ; td[1][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 1){ td[1][2] = td[1][1] ; td[1][1] = 0 ; sy = 1 ; repaint() ; } } } }else if((px>20)&&(px<140)&&(py>140)&&(py<180)){ if(sx == 2){ pn = 2 - (px - 20) / 40; if(sy == 0){ if(pn == 1){ td[2][0] = td[2][1] ; td[2][1] = 0 ; sy = 1 ; repaint() ; }else if(pn == 2){ td[2][0] = td[2][1] ; td[2][1] = td[2][2] ; td[2][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 1){ if(pn == 0){ td[2][1] = td[2][0] ; td[2][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 2){ td[2][1] = td[2][2] ; td[2][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 2){ if(pn == 0){ td[2][2] = td[2][1] ; td[2][1] = td[2][0] ; td[2][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 1){ td[2][2] = td[2][1] ; td[2][1] = 0 ; sy = 1 ; repaint() ; } } } }else if((px>140)&&(px<180)&&(py>20)&&(py<140)){ if(sx == 3){ pn = 2 - (py - 20) / 40; if(sy == 0){ if(pn == 1){ td[3][0] = td[3][1] ; td[3][1] = 0 ; sy = 1 ; repaint() ; }else if(pn == 2){ td[3][0] = td[3][1] ; td[3][1] = td[3][2] ; td[3][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 1){ if(pn == 0){ td[3][1] = td[3][0] ; td[3][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 2){ td[3][1] = td[3][2] ; td[3][2] = 0 ; sy = 2 ; repaint() ; } }else if(sy == 2){ if(pn == 0){ td[3][2] = td[3][1] ; td[3][1] = td[3][0] ; td[3][0] = 0 ; sy = 0 ; repaint() ; }else if(pn == 1){ td[3][2] = td[3][1] ; td[3][1] = 0 ; sy = 1 ; repaint() ; } } } }else if(pr<20){ dd = -1 * dd; }else if((pr>20)&&(pr<60)){ fg = 1; th.resume(); }else if((pr>60)&&(pr<100)){ fg = 2; th.resume(); }else if((pr>100)&&(pr<140)){ fg = 3; th.resume(); } repaint(); } } } ); shuf.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ for(int k = 0;k < 50;k ++){ if(Math.random() < 0.2){ if(sy == 0){ td[sx][0] = td[sx][1] ; td[sx][1] = 0 ; sy = 1; }else if(sy == 1){ td[sx][1] = td[sx][2] ; td[sx][2] = 0 ; sy = 2; } }else if(Math.random() < 0.4){ if(sy == 2){ td[sx][2] = td[sx][1] ; td[sx][1] = 0 ; sy = 1; }else if(sy == 1){ td[sx][1] = td[sx][0] ; td[sx][0] = 0 ; sy = 0 ; } }else{ sw = td[0][sy] ; td[0][sy] = td[1][sy] ; td[1][sy] = td[2][sy] ; td[2][sy] = td[3][sy] ; td[3][sy] = sw; sx = sx - 1; if(sx < 0)sx = 3; } } repaint(); } }); } public void paint(Graphics g){ og.setColor(Color.white); og.fillRect(0,0,320,340); og.setColor(new Color(0,0,255)); og.fillArc(10,10,300,300,75,30); og.setColor(new Color(255,0,0)); og.fillArc(10,10,300,300,345,30); og.setColor(new Color(0,255,0)); og.fillArc(10,10,300,300,165,30); og.setColor(new Color(255,255,0)); og.fillArc(10,10,300,300,255,30); og.setColor(Color.gray); og.drawArc(10,10,300,300,75,30); og.drawArc(10,10,300,300,345,30); og.drawArc(10,10,300,300,165,30); og.drawArc(10,10,300,300,255,30); for(int r = 0;r < 3;r ++){ og.setColor(new Color(255,150+20*r,150+20*r)); og.fillOval(20+40*r,20+40*r,280-80*r,280-80*r); og.setColor(Color.gray); og.drawOval(20+40*r,20+40*r,280-80*r,280-80*r); } og.setColor(Color.white); og.fillOval(140,140,40,40); og.setColor(Color.gray); og.drawOval(140,140,40,40); og.drawLine(139,21,139,298); og.drawLine(180,21,180,298); og.drawLine(21,139,298,139); og.drawLine(21,180,298,180); og.setColor(Color.black); og.drawArc(145,145,30,30,45+dd*45,90); og.drawArc(145,145,30,30,45+dd*225,90); og.drawString("<",157,165+dd*15); og.drawString(">",160,165-1*dd*15); for(int i = 0;i < 3;i ++){ for(int j = 0;j < 4;j ++){ if(td[j][i] != 0){ kx = 140+(int)(Math.round((i+1)*40*Math.cos(rs[i]+j*pi))); ky = 140+(int)(Math.round((i+1)*40*Math.sin(rs[i]+j*pi))); ball(kx,ky,td[j][i]); } } } g.drawImage(os,0,0,this); } public void ball(int x,int y,int c){ for(int i = 0;i < 20;i++){ co = (int)(120+100*Math.sin(1.57*i/20)); switch (c){ case 1 : og.setColor(new Color(co,0,0)) ; break ; case 2 : og.setColor(new Color(co,co,0)) ; break ; case 3 : og.setColor(new Color(0,co,0)) ; break ; case 4 : og.setColor(new Color(0,0,co)) ; break ; } og.fillOval(x+i,y+i,40-2*i,40-2*i); } } public void start(){ if(th == null){ th = new Thread(this); th.start(); } th.suspend(); } public void stop(){ th = null; } public void run(){ while(th != null){ try{ if(fg != 0){ if(dd == -1){ rs[fg - 1] = rs[fg - 1] - pi / 30 ; if(rs[fg - 1] < -1 * pi){ sw = td[0][fg-1] ; td[0][fg-1] = td[1][fg-1] ; td[1][fg-1] = td[2][fg-1] ; td[2][fg-1] = td[3][fg-1] ; td[3][fg-1] = sw ; if(sy == fg - 1)sx -- ; if(sx < 0)sx = 3 ; rs[fg - 1] = 0; fg = 0; th.suspend(); } }else if(dd == 1){ rs[fg - 1] = rs[fg - 1] + pi / 30 ; if(rs[fg - 1] > pi){ sw = td[3][fg-1] ; td[3][fg-1] = td[2][fg-1] ; td[2][fg-1] = td[1][fg-1] ; td[1][fg-1] = td[0][fg-1] ; td[0][fg-1] = sw ; if(sy == fg - 1)sx ++ ; if(sx > 3)sx = 0 ; rs[fg - 1] = 0; fg = 0; th.suspend(); } } } Thread.sleep(30); } catch (InterruptedException e){ } repaint(); } } public void update( Graphics g ){ paint( g ) ; } }