import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class m_jigsaw extends Applet implements Runnable{
Thread th = null;
Image os;
Graphics og;
int ch=2,sw,mp,rx,ry,dx,dy,sd,af,hf=1;
int bx=450,by=150;
double bt;
int px1,py1,px2,py2,s1,s2,fg = 0;
int td[] = new int[64];
int sp,sp1,sp2;
int lx[] = {350,550,550,350,350};
int ly[] = {50,50,250,250,50};
Choice spe = new Choice();
Choice sep = new Choice();
Choice pat = new Choice();
Button sh,vf;
Label la;
public void init(){
os = createImage(600,300);
og = os.getGraphics();
setBackground(Color.white);
spe.addItem(" slow ");
spe.addItem(" normal ");
spe.addItem(" fast ");
spe.addItemListener(new MyListener1());
sep.addItem(" 3x3 ");
sep.addItem(" 4x4 ");
sep.addItem(" 5x5 ");
sep.addItem(" 6x6 ");
sep.addItemListener(new MyListener2());
pat.addItem(" ball ");
pat.addItem(" polygon ");
pat.addItem(" ripple ");
pat.addItemListener(new MyListener3());
setLayout(new BorderLayout());
Panel pan = new Panel();
pan.setLayout(new FlowLayout());
pan.add(sh = new Button(" shuffle "));
pan.add(la = new Label(" "));
pan.add(sep);
pan.add(la = new Label(" "));
pan.add(pat);
pan.add(la = new Label(" "));
pan.add(spe);
pan.add(la = new Label(" "));
pan.add(vf = new Button("open/close"));
add("South",pan);
for(int ni = 0;ni < 64;ni ++){
td[ni] = ni;
}
sw = 3;
sp = 150;
addMouseListener(
new MouseAdapter(){
public void mousePressed(MouseEvent e){
if((e.getX() > 30)&&(e.getX() < 270)&&(e.getY() > 30)&&(e.getY() < 270)){
if(fg == 0){
px1 = (e.getX()-30)/(240/sw);
py1 = (e.getY()-30)/(240/sw);
for(int ss = 0;ss < sw*sw;ss ++){
if(td[ss] == px1+py1*sw)s1 = ss;
}
fg = 1;
}else{
px2 = (e.getX()-30)/(240/sw);
py2 = (e.getY()-30)/(240/sw);
for(int ss = 0;ss < sw*sw;ss ++){
if(td[ss] == px2+py2*sw)s2 = ss;
}
sd = td[s1] ; td[s1] = td[s2] ; td[s2] = sd ;
fg = 0;
}
}
repaint();
}
}
);
sh.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
for(int s1 = 0;s1 < sw*sw;s1 ++){
sp1 = (int)(sw*sw*Math.random());
sp2 = (int)(sw*sw*Math.random());
sd = td[sp1] ; td[sp1] = td[sp2] ; td[sp2] = sd ;
}
repaint();
}
});
vf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
hf = -1 * hf;
repaint();
}
});
}
class MyListener1 implements ItemListener{
public void itemStateChanged(ItemEvent e){
Choice spe = (Choice)e.getSource();
switch(spe.getSelectedIndex()){
case 0 : sp = 400 ; break;
case 1 : sp = 200 ; break;
case 2 : sp = 100 ; break;
}
repaint();
}
}
class MyListener2 implements ItemListener{
public void itemStateChanged(ItemEvent e){
Choice sep = (Choice)e.getSource();
switch(sep.getSelectedIndex()){
case 0 : sw = 3 ; break;
case 1 : sw = 4 ; break;
case 2 : sw = 5 ; break;
case 3 : sw = 6 ; break;
}
for(int ni = 0;ni < 64;ni ++){
td[ni] = ni;
}
fg = 0;
repaint();
}
}
class MyListener3 implements ItemListener{
public void itemStateChanged(ItemEvent e){
Choice spe = (Choice)e.getSource();
switch(spe.getSelectedIndex()){
case 0 : ch = 2 ; break;
case 1 : ch = 1 ; break;
case 2 : ch = 0 ; break;
}
repaint();
}
}
public void paint(Graphics g){
og.setColor(Color.black);
og.fillRect(0,0,600,300);
d_pattern(ch);
og.setColor(Color.white);
og.fillRect(0,0,330,300);
og.fillRect(300,0,300,30);
og.fillRect(300,270,300,30);
og.fillRect(570,0,30,300);
for(int k1 = 0;k1 < sw*sw;k1 ++){
og.copyArea(330+(k1%sw)*(240/sw),30+(k1/sw)*(240/sw),240/sw,240/sw,((td[k1]%sw)-(k1%sw))*(240/sw)-300,((td[k1]/sw)-(k1/sw))*(240/sw));
}
af = 1;
for(int a1 = 0;a1 < sw*sw;a1 ++){
if(td[a1] != a1)af = 0;
}
if(af == 0){
for(int k1 = 0;k1 < sw*sw;k1 ++){
og.setColor(Color.gray);og.drawRect(30+(k1%sw)*(240/sw),30+(k1/sw)*(240/sw),240/sw,240/sw);
}
}
if(fg == 1){
og.setColor(Color.blue);
og.drawRect(px1*240/sw+30,py1*240/sw+30,240/sw,240/sw);
og.drawRect(px1*240/sw+31,py1*240/sw+31,240/sw-2,240/sw-2);
}
if(hf == 1){
og.setColor(Color.lightGray);
og.fillRect(330,30,240,240);
}
g.drawImage(os,0,0,this);
}
public void d_pattern(int nn){
switch(nn){
case 0 : og.setColor(new Color(255,100,100)) ; og.drawOval(350+rx-mp,50+ry-mp,mp*2,mp*2);
og.setColor(new Color(255,50,50)) ; og.drawOval(350+rx-(mp+5),50+ry-(mp+5),(mp+5)*2,(mp+5)*2);
og.setColor(new Color(255,0,0)) ; og.drawOval(350+rx-(mp+12),50+ry-(mp+12),(mp+12)*2,(mp+12)*2);
break;
case 1 : og.setColor(Color.green);
og.fillPolygon(lx,ly,5);
break;
case 2 : for(int c1 = 0;c1 < 10;c1 ++){
og.setColor(new Color(0,150-c1*10,255-c1*10));
og.drawOval(bx-c1,by-c1,c1*2,c1*2);
}
break;
}
}
public void start(){
if(th == null){
th = new Thread(this);
th.start();
}
}
public void stop(){
th = null;
}
public void run(){
while(th != null){
try{
mp = mp + 5;
if(mp > 100){
mp = 0;
rx = (int)(200 * Math.random());
ry = (int)(200 * Math.random()) ;
}
for(int i1 = 0;i1 < 4;i1 ++){
lx[i1] = (int)(120*Math.cos(3*bt+i1))+450;
ly[i1] = (int)(120*Math.cos(4*bt+i1-0.8))+150;
}
lx[4] = lx[0] ; ly[4] = ly[0] ;
bt = bt + 0.02;
bx = (int)(110*Math.cos(6*bt))+450;
by = (int)(110*Math.cos(5*bt-0.8))+150;
Thread.sleep(sp);
}
catch (InterruptedException e){
}
repaint();
}
}
public void update( Graphics g ){
paint( g ) ;
}
}
