package ratsuk;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractButton;
import javax.swing.JPanel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.Timer;
/**
*
* @author Melvin
*/
public class Tablero {
private static final int HEIGHT = 8;
private static final int WIDTH = 8;
private JButton[][] mesa;
private Icon image;
private JPanel panel;
private JFrame ventana;
private int contador;
private Random rom;
private Menu men;
private Cursor cur;
private Point hot;
private Toolkit tool;
private Image icon;
public Tablero() {
ventana = new JFrame();
mesa = new JButton[HEIGHT][WIDTH];
panel = new JPanel(new GridLayout(HEIGHT, WIDTH));
image = new ImageIcon(getClass().getResource("redKnight.gif"));
contador = 0;
rom = new Random();
men = new Menu();
tool = Toolkit.getDefaultToolkit();
icon = tool.getImage(getClass().getResource("redKnight.gif"));
hot = new Point();
cur = tool.createCustomCursor(icon, hot, "caballo");
crearventana();
crearmesa();
pintarmesa();
}
private void crearventana() {
setVentana(new JFrame("Juego de Ratsuk"));
getVentana().setVisible(true);
getVentana().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getVentana().setLayout(new BorderLayout());
getVentana().setSize(600, 650);
getVentana().add(panel, BorderLayout.CENTER);
getVentana().add(men.getPanel1(), BorderLayout.SOUTH);
getVentana().add(men.getPanel2(), BorderLayout.NORTH);
getVentana().setVisible(true);
}
private void crearmesa() {
for (int row = 0; row < HEIGHT; row++) {
for (int column = 0; column < WIDTH; column++) {
JButton button = new JButton();
mesa[row][column] = button;
panel.add(button);
}
}
}
public void pintarmesa() {
Color fondo;
for (int r = 0; r < HEIGHT; r++) {
for (int t = 0; t < WIDTH; t++) {
fondo = getBackgroundColor(r, t);
mesa[r][t].setForeground(Color.blue);
mesa[r][t].setBackground(fondo);
}
}
}
private Color getBackgroundColor(int r, int t) {
Color fondo;
if (r % 2 == 0 || r == 0) {
if (t % 2 == 0 || t == 0) {
fondo = Color.BLACK;
} else {
fondo = Color.WHITE;
}
} else {
if (t % 2 == 0 || t == 0) {
fondo = Color.WHITE;
} else {
fondo = Color.BLACK;
}
}
return fondo;
}
public void Knight(final int row, final int column) {
final JButton current = mesa[row][column];
reiniciar();
current.setIcon(image);
current.setBackground(Color.RED);
if (conclucion(row, column)) {
// limpieza();
if (contador == 0 || contador % 2 == 0) {
JOptionPane.showMessageDialog(null, "You Lose");
} else {
if (contador % 2 != 0) {
JOptionPane.showMessageDialog(null, "You Win");
}
}
men.quitarALmAtriz(mesa);
contador = 0;
} else {
// panel.repaint();
acciones(row, column, current);
}
}
public void acciones(final int row, final int column, final JButton current) {
men.quitarALmAtriz(mesa);
current.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
panel.setCursor(cur);
men.quitarALmAtriz(mesa);
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
mesa[i][j].addActionListener(e(row, column, current));
}
}
if (contador % 2 != 0 && contador != 0) {
current.setIcon(null);
}
}
});
if (contador % 2 != 0 && contador != 0) {
verificar(contador, row, column, current);
}
}
public ActionListener e(final int row, final int column,
final JButton current) {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (tienebotton(row + 2, column + 1)) {
if (e.getSource() == mesa[row + 2][column + 1]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row + 2, column + 1);
}
}
if (tienebotton(row + 2, column - 1)) {
if (e.getSource() == mesa[row + 2][column - 1]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row + 2, column - 1);
}
}
if (tienebotton(row - 2, column - 1)) {
if (e.getSource() == mesa[row - 2][column - 1]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row - 2, column - 1);
}
}
if (tienebotton(row - 2, column + 1)) {
if (e.getSource() == mesa[row - 2][column + 1]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row - 2, column + 1);
}
}
if (tienebotton(row + 1, column + 2)) {
if (e.getSource() == mesa[row + 1][column + 2]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row + 1, column + 2);
}
}
if (tienebotton(row - 1, column + 2)) {
if (e.getSource() == mesa[row - 1][column + 2]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row - 1, column + 2);
}
}
if (tienebotton(row + 1, column - 2)) {
if (e.getSource() == mesa[row + 1][column - 2]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row + 1, column - 2);
}
}
if (tienebotton(row - 1, column - 2)) {
if (e.getSource() == mesa[row - 1][column - 2]) {
contador++;
current.setIcon(null);
((AbstractButton) current).setEnabled(false);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row - 1, column - 2);
}
}
}
};
}
public boolean tienebotton(int row, int column) {
return (row >= 0 && row < HEIGHT && column >= 0 && column < WIDTH);
}
public boolean conclucion(int row, int column) {
boolean estado, estado1, estado2, estado3, estado4, estado5, estado6, estado7;
if (tienebotton(row + 2, column + 1)) {
estado = mesa[row + 2][column + 1].isEnabled();
} else {
estado = false;
}
if (tienebotton(row + 2, column - 1)) {
estado1 = mesa[row + 2][column - 1].isEnabled();
} else {
estado1 = false;
}
if (tienebotton(row - 2, column + 1)) {
estado2 = mesa[row - 2][column + 1].isEnabled();
} else {
estado2 = false;
}
if (tienebotton(row - 2, column - 1)) {
estado3 = mesa[row - 2][column - 1].isEnabled();
} else {
estado3 = false;
}
if (tienebotton(row + 1, column + 2)) {
estado4 = mesa[row + 1][column + 2].isEnabled();
} else {
estado4 = false;
}
if (tienebotton(row - 1, column + 2)) {
estado5 = mesa[row - 1][column + 2].isEnabled();
} else {
estado5 = false;
}
if (tienebotton(row + 1, column - 2)) {
estado6 = mesa[row + 1][column - 2].isEnabled();
} else {
estado6 = false;
}
if (tienebotton(row - 1, column - 2)) {
estado7 = mesa[row - 1][column - 2].isEnabled();
} else {
estado7 = false;
}
return (estado == false && estado1 == false && estado2 == false && estado3 == false && estado4 == false && estado5 == false && estado6 == false && estado7 == false);
}
public void AI(int contador, int row, int column, int contador2, int[] matriz, JButton current) throws IllegalArgumentException, InterruptedException {
int al = rom.nextInt(contador2 + 1);
current.doClick();
if (al == matriz[0]) {
optimusprime(row + 2, column + 1, current);
mesa[row + 2][column + 1].doClick();
}
if (al == matriz[1]) {
optimusprime(row + 2, column - 1, current);
mesa[row + 2][column - 1].doClick();
}
if (al == matriz[2]) {
optimusprime(row - 2, column - 1, current);
mesa[row - 2][column - 1].doClick();
}
if (al == matriz[3]) {
optimusprime(row - 2, column + 1, current);
mesa[row - 2][column + 1].doClick();
}
if (al == matriz[4]) {
optimusprime(row + 1, column + 2, current);
mesa[row + 1][column + 2].doClick();
}
if (al == matriz[5]) {
optimusprime(row - 1, column + 2, current);
mesa[row - 1][column + 2].doClick();
}
if (al == matriz[6]) {
optimusprime(row + 1, column - 2, current);
mesa[row + 1][column - 2].doClick();
}
if (al == matriz[7]) {
optimusprime(row - 1, column - 2, current);
mesa[row - 1][column - 2].doClick();
}
for (int i = 0; i < matriz.length; i++) {
matriz[i] = 40;
}
}
public void verificar(int contador, int row, int column, JButton current) {
int[] matriz;
matriz = new int[8];
int contador2;
contador2 = -1;
for (int i = 0; i < matriz.length; i++) {
matriz[i] = 40;
}
if (tienebotton(row + 2, column + 1)) {
if (mesa[row + 2][column + 1].isEnabled() == true) {
contador2++;
matriz[0] = contador2;
}
}
if (tienebotton(row + 2, column - 1)) {
if (mesa[row + 2][column - 1].isEnabled() == true) {
contador2++;
matriz[1] = contador2;
}
}
if (tienebotton(row - 2, column - 1)) {
if (mesa[row - 2][column - 1].isEnabled() == true) {
contador2++;
matriz[2] = contador2;
}
}
if (tienebotton(row - 2, column + 1)) {
if (mesa[row - 2][column + 1].isEnabled() == true) {
contador2++;
matriz[3] = contador2;
}
}
if (tienebotton(row + 1, column + 2)) {
if (mesa[row + 1][column + 2].isEnabled() == true) {
contador2++;
matriz[4] = contador2;
}
}
if (tienebotton(row - 1, column + 2)) {
if (mesa[row - 1][column + 2].isEnabled() == true) {
contador2++;
matriz[5] = contador2;
}
}
if (tienebotton(row + 1, column - 2)) {
if (mesa[row + 1][column - 2].isEnabled() == true) {
contador2++;
matriz[6] = contador2;
}
}
if (tienebotton(row - 1, column - 2)) {
if (mesa[row - 1][column - 2].isEnabled() == true) {
contador2++;
matriz[7] = contador2;
}
}
if (contador2 < 0) {
contador2 = 0;
}
try {
AI(contador, row, column, contador2, matriz, current);
} catch (IllegalArgumentException | InterruptedException ex) {
Logger.getLogger(Tablero.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void limpieza() {
pintarmesa();
for (int r = 0; r < HEIGHT; r++) {
for (int t = 0; t < WIDTH; t++) {
mesa[r][t].setEnabled(true);
mesa[r][t].setIcon(null);
}
}
}
public JFrame getVentana() {
return ventana;
}
/**
* @param ventana the ventana to set
*/
public void reiniciar() {
ActionListener[] bu;
bu = men.getReiniciar().getActionListeners();
for (int k = 0; k < bu.length; k++) {
men.getReiniciar().removeActionListener(bu[k]);
}
men.getReiniciar().addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final int row;
final int column;
row = rom.nextInt(8);
column = rom.nextInt(8);
contador = 0;
limpieza();
men.quitarALmAtriz(mesa);
panel.setCursor(Cursor.getDefaultCursor());
Knight(row, column);
}
});
}
public void optimusprime(int row, int column, JButton current) throws InterruptedException {
Point p;
Point p2;
double x;
double y;
double x2;
double y2;
double conx;
double m;
double b;
double cony;
p = current.getLocationOnScreen();
x = (int) (p.getX() + 22.5);
y = (int) (p.getY() + 22.5);
optimus((int) x, (int) y);
p2 = mesa[row][column].getLocationOnScreen();
x2 = (int) (p2.getX() + 22.5);
y2 = (int) (p2.getY() + 22.5);
m = (y2 - y) / (x2 - x);
b = y - (m * x);
conx = x;
if (x2 > x) {
while (conx <= x2) {
cony = (m * conx) + b;
optimus((int) conx, (int) cony);
conx++;
Thread.sleep(5);
}
} else {
while (conx >= x2) {
cony = (m * conx) + b;
optimus((int) conx, (int) cony);
conx--;
Thread.sleep(5);
}
}
}
public void optimus(int x, int y) {
try {
Robot robot = new Robot();
robot.mouseMove(x, y);
} catch (AWTException e) {
}
}
public void setVentana(JFrame ventana) {
this.ventana = ventana;
}
/**
* @return the men
*/
public Menu getMen() {
return men;
}
/**
* @param men the men to set
*/
public void setMen(Menu men) {
this.men = men;
}
}