import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class t_over2 extends Applet implements Runnable{
Thread th = null;
Image os;
Graphics og;
int td[][] = new int[3][3];
int bd[][] = new int[3][3];
int f_x[] = {20,60,70,55,35,35,50,50,55,55,50,50,35,35,40,40,20,20,25,25,20};
int f_y[] = {10,10,20,15,15,35,35,30,30,45,45,40,40,65,65,70,70,65,65,15,10};
int dfx[] = new int[21],dfy[] = new int[21],lx[] = new int[21],ly[] = new int[21];
int mx,my,sx,sy,px,py;
int h1x,h1y,h2x,h2y;
int sw,ch,ra,re,co,cl;
double pi = 3.141592;
double st,sm;
Button sh,rt;
Label spa;
public void init(){
setLayout(new BorderLayout());
Panel pan = new Panel();
pan.setLayout(new FlowLayout());
pan.add(sh = new Button(" shuffle "));
pan.add(spa = new Label(" "));
pan.add(rt = new Button(" retry "));
add("South",pan);
os = createImage(280,300);
og = os.getGraphics();
for(int ix = 0;ix < 3;ix ++){
for(int iy = 0;iy < 3;iy ++){
td[iy][ix] = 1;
bd[iy][ix] = 1;
}
}
sh.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
for(int ss = 0;ss < 20;ss ++){
ra = (int)(6 * Math.random());
ch = td[ra/3][ra%3];
switch (td[ra/3+1][ra%3]){
case 1 : td[ra/3][ra%3] = 3;break;
case 2 : td[ra/3][ra%3] = 4;break;
case 3 : td[ra/3][ra%3] = 1;break;
case 4 : td[ra/3][ra%3] = 2;break;
}
switch (ch){
case 1 : td[ra/3+1][ra%3] = 3;break;
case 2 : td[ra/3+1][ra%3] = 4;break;
case 3 : td[ra/3+1][ra%3] = 1;break;
case 4 : td[ra/3+1][ra%3] = 2;break;
}
ch = td[ra%3][ra/3];
switch (td[ra%3][ra/3+1]){
case 1 : td[ra%3][ra/3] = 2;break;
case 2 : td[ra%3][ra/3] = 1;break;
case 3 : td[ra%3][ra/3] = 4;break;
case 4 : td[ra%3][ra/3] = 3;break;
}
switch (ch){
case 1 : td[ra%3][ra/3+1] = 2;break;
case 2 : td[ra%3][ra/3+1] = 1;break;
case 3 : td[ra%3][ra/3+1] = 4;break;
case 4 : td[ra%3][ra/3+1] = 3;break;
}
}
for(int b1 = 0;b1 < 3;b1 ++){
for(int b2 = 0;b2 < 3;b2 ++){
bd[b2][b1] = td[b2][b1];
}
}
co = 0;cl = 0;
repaint();
}
});
rt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
for(int b1 = 0;b1 < 3;b1 ++){
for(int b2 = 0;b2 < 3;b2 ++){
td[b2][b1] = bd[b2][b1];
}
}
co = 0;cl = 0;
repaint();
}
});
addMouseListener(
new MouseAdapter(){
public void mousePressed(MouseEvent e){
if((co < 6)&&(cl == 0)){
if(sw == 0){
px = e.getX() / 40;
py = e.getY() / 40;
if(((sx == 2)||(sx == 4))&&(sy%2 == 1)){
h1x = px/2-1;h1y = (py-1)/2;h2x = px/2;h2y = (py-1)/2;
sw = 1;
}else if(((sy == 2)||(sy == 4))&&(sx%2 == 1)){
h1x = (px-1)/2;h1y = py/2-1;h2x = (px-1)/2;h2y = py/2;
sw = 2;
}
repaint();
}
}
}
}
);
addMouseMotionListener(
new MouseMotionAdapter(){
public void mouseMoved(MouseEvent e){
mx = e.getX();
my = e.getY();
sx = e.getX() / 40;
sy = e.getY() / 40;
repaint();
}
}
);
}
public void paint(Graphics g){
og.setColor(Color.white);
og.fillRect(0,0,280,300);
for(int ix = 0;ix < 3;ix ++){
for(int iy = 0;iy < 3;iy ++){
if((sw == 0)||(((ix != h1x)||(iy != h1y))&&((ix != h2x)||(iy != h2y)))){
og.setColor(Color.black);
og.drawRoundRect(ix*80+20,iy*80+20,80,80,10,10);
inp_f(td[iy][ix],ix*80+22,iy*80+22);
og.setColor(Color.gray);
og.fillPolygon(dfx,dfy,21);
inp_f(td[iy][ix],ix*80+20,iy*80+20);
og.setColor(Color.blue);
og.fillPolygon(dfx,dfy,21);
}
}
}
if(sw == 1){
og.setColor(Color.black);
og.drawRoundRect(px*40+20,py*40-20,(int)(80*Math.cos(st)),80,10,10);
inp_f(td[h2y][h2x],0,0);
for(int cv = 0;cv < 21;cv ++){
lx[cv] = (int)(dfx[cv]*Math.cos(st)) + 80*h2x+20;
ly[cv] = dfy[cv] + 80*h2y+20;
}
og.setColor(Color.blue);
og.fillPolygon(lx,ly,21);
og.setColor(Color.black);
og.drawRoundRect(px*40+20-(int)(80*Math.cos(st)),py*40-20,(int)(80*Math.cos(st)),80,10,10);
inp_f(td[h1y][h1x],0,0);
for(int cv = 0;cv < 21;cv ++){
lx[cv] = 80*h2x+20 + (int)((dfx[cv]-80)*Math.cos(st));
ly[cv] = dfy[cv] + 80*h2y+20;
}
og.setColor(Color.blue);
og.fillPolygon(lx,ly,21);
}else if(sw == 2){
og.setColor(Color.black);
og.drawRoundRect(px*40-20,py*40+20,80,(int)(80*Math.cos(st)),10,10);
inp_f(td[h2y][h2x],0,0);
for(int cv = 0;cv < 21;cv ++){
lx[cv] = dfx[cv] + 80*h2x+20;
ly[cv] = (int)(dfy[cv]*Math.cos(st)) + 80*h2y+20;
}
og.setColor(Color.blue);
og.fillPolygon(lx,ly,21);
og.setColor(Color.black);
og.drawRoundRect(px*40-20,py*40+20-(int)(80*Math.cos(st)),80,(int)(80*Math.cos(st)),10,10);
inp_f(td[h1y][h1x],0,0);
for(int cv = 0;cv < 21;cv ++){
lx[cv] = dfx[cv] + 80*h2x+20;
ly[cv] = 80*h2y+20 + (int)((dfy[cv]-80)*Math.cos(st));
}
og.setColor(Color.blue);
og.fillPolygon(lx,ly,21);
}
og.setFont(new Font("",Font.BOLD,18));
if((co < 6)&&(cl == 0)){
if((sx+sy)%2 == 1){
if(((sx == 2)||(sx == 4))&&(sy%2 == 1)){
og.setColor(Color.red);
og.fillArc(sx*40+22,sy*40,40,40,150,60);
og.fillArc(sx*40-22,sy*40,40,40,-30,60);
og.setColor(Color.black);
og.drawString(""+(co+1),sx*40+16,sy*40+26);
}else if(((sy == 2)||(sy == 4))&&(sx%2 == 1)){
og.setColor(Color.red);
og.fillArc(sx*40,sy*40-22,40,40,240,60);
og.fillArc(sx*40,sy*40+22,40,40,60,60);
og.setColor(Color.black);
og.drawString(""+(co+1),sx*40+16,sy*40+26);
}
}
}
ch = 1;
for(int ix = 0;ix < 3;ix ++){
for(int iy = 0;iy < 3;iy ++){
ch = ch * td[iy][ix];
}
}
if(ch == 1){
cl = 1;
og.setColor(Color.red);
og.drawRoundRect(10,10,260,260,30,30);
og.drawRoundRect(12,12,256,256,28,28);
}
g.drawImage(os,0,0,this);
}
public void inp_f(int fd,int dx,int dy){
switch (fd){
case 1 : for(int i1 = 0;i1 < 21;i1 ++){
dfx[i1] = f_x[i1] + dx;
dfy[i1] = f_y[i1] + dy;
}
break;
case 2 : for(int i1 = 0;i1 < 21;i1 ++){
dfx[i1] = 80 - f_x[i1] + dx;
dfy[i1] = f_y[i1] + dy;
}
break;
case 3 : for(int i1 = 0;i1 < 21;i1 ++){
dfx[i1] = f_x[i1] + dx;
dfy[i1] = 80 - f_y[i1] + dy;
}
break;
case 4 : for(int i1 = 0;i1 < 21;i1 ++){
dfx[i1] = 80 - f_x[i1] + dx;
dfy[i1] = 80 - f_y[i1] + dy;
}
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{
if(sw != 0){
sm = sm + pi/30;
if(sm < pi){
if(sm < pi/2){
st = sm;
}else{
if(re == 0){
if(sw == 1){
ch = td[h1y][h1x];
switch (td[h2y][h2x]){
case 1 : td[h1y][h1x] = 2;break;
case 2 : td[h1y][h1x] = 1;break;
case 3 : td[h1y][h1x] = 4;break;
case 4 : td[h1y][h1x] = 3;break;
}
switch (ch){
case 1 : td[h2y][h2x] = 2;break;
case 2 : td[h2y][h2x] = 1;break;
case 3 : td[h2y][h2x] = 4;break;
case 4 : td[h2y][h2x] = 3;break;
}
}else if(sw == 2){
ch = td[h1y][h1x];
switch (td[h2y][h2x]){
case 1 : td[h1y][h1x] = 3;break;
case 2 : td[h1y][h1x] = 4;break;
case 3 : td[h1y][h1x] = 1;break;
case 4 : td[h1y][h1x] = 2;break;
}
switch (ch){
case 1 : td[h2y][h2x] = 3;break;
case 2 : td[h2y][h2x] = 4;break;
case 3 : td[h2y][h2x] = 1;break;
case 4 : td[h2y][h2x] = 2;break;
}
}
re = 1;
}
st = pi - sm;
}
}else{
sm = 0;
sw = 0;
re = 0;
co ++;
}
}
Thread.sleep(30);
}
catch (InterruptedException e){
}
repaint();
}
}
public void update( Graphics g ){
paint( g ) ;
}
}
