import java.awt.*; import java.awt.event.*;
import javax.swing.*; import javax.swing.event.*;

public class Reversi extends JPanel {
  private static final long serialVersionUID = 8210537589686946439L;
  Color field[] = new Color[64], p1 = Color.RED, p2 = Color.BLUE;
  public static JLabel status = new JLabel("Please click on a field.");
  public static void main(String[] args) {
    JFrame f = new JFrame("Reversi 64");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new Reversi()); f.add(status,"South");
    f.setSize(200, 220); f.setVisible(true);
  }
  public Reversi() {
    field[27] = p1; field[28] = p2; field[35] = p2; field[36] = p1;
    addMouseListener(new MouseInputAdapter() {
      public synchronized void mouseClicked(MouseEvent e) {
        int c = 0, pos = e.getX()*8/getWidth()+e.getY()*8/getHeight()*8;
        if (colorize(pos%8, pos/8, p1, false) != 0) bestVal(5, true, p2);
        while(bestVal(1, false, p1) == -64) {
          bestVal(4, true, p2);
          if (bestVal(1, false, p2) == -64) {
            for(int i=0;i<64;i++) c+=field[i]==p1?1:field[i]==p2?-1:0;
            status.setText("You have " + ((c>0)?"won.":"didn't win."));
            break;
        }  }
        repaint();
      }});
  }
  public synchronized int bestVal(int depth, boolean doIt, Color c) {
    int kiZug = -1, best = -64;
    Color[] oldField = new Color[64];
    System.arraycopy(field, 0, oldField, 0, 64);
    for (int i = 0; i < 64; i++) {
      int val = colorize(i%8,i/8,c,false);
      if (val != 0) {
        val -= depth>1?bestVal(depth - 1, false, c==p1?p2:p1):0;
        if (val > best) { best = val; kiZug = i; }
        System.arraycopy(oldField, 0, field, 0, 64); 
    }  }
    if (doIt && (kiZug!=-1)) colorize(kiZug%8, kiZug/8, p2, false);
    return best;
  }
  public synchronized int colorize(int x, int y, Color color, boolean test) {
    if (field[x+y*8] != null) return 0;
    int i, c=0, vs[][]={{y*8+7,1},{y*8,-1},{x,-8},{x+56,8},{x>y?x-y:y*8-x*8,-9},
    {x<7-y?x+y:8*x+8*y-49,-7},{x<y?x-y+63:8*y-8*x+63,9},{x<7-y?(y+x)*8:49+x+y,7}};
    for(int[] v:vs) for (i=x+y*8+v[1];(i!=v[0]+v[1])&&(field[i]!=null);i+=v[1])
        if (field[i] == color) {
          for (i-=v[1]; i!=x+y*8; i-=v[1]) if ((c++ < 65) && !test)field[i]=color;
          break;
        }
    if ((c != 0) && !test) field[x+y*8] = color;
    return c;
  }
  public void paintComponent(Graphics g) {
    for (int x = 0, h = getHeight(), w = getWidth(); x < 64; x++) {
      g.setColor(((x%8) + x/8) % 2 == 0 ? Color.DARK_GRAY : Color.WHITE);
      g.fillRect(w*(x/8)/8, h*(x%8)/8, w/8, h/8);
      g.setColor(field[x%8 * 8 + x/8]);
      g.fillOval(w*(x/8)/8, h*(x%8)/8, w/8, h/8);
    }
  }
}
