La Web del Programador: Comunidad de Programadores
 
    Pregunta:  65901 - COMO DESORDENAR IMAGENES DE UN PUZZLE DE PIEZAS DESLIZANTES
Autor:  Andrea Flores
Hola, estoy realizando un juego, es un puzzle de piezas deslizantes, hasta el momento he logrado hacer que la imagen se corte en piezas y se divida en un array de botones y ademas ya en la parte funcional estas piezas se mueven sin ningun problema. Mi pregunta es como puedo hacer que las piezas se desordenen al ejecutar el puzzle? como confirmo que las piezas estan en su lugar cuando el player ya las ha ordenado?, mi idea es enviarle un mensaje de dialogo. Algo que aun no entiendo es Que hace o como funciona la variable pos?

Aca les dejo el codigo:

import java.awt.BorderLayout; 	

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.*;

public class Puzzle extends JFrame implements ActionListener{

private JPanel centerPanel;
private JLabel label;
private JButton[] botton;
private Image source; //productor de imágenes que usará pixels como imagen
private Image image; // imagen que utilizará source como fuente
int[][] pos;
int width, height;
boolean indice [];
int indexRandom;

public Puzzle() {
initUI();
}

public final void initUI() {
pos = new int[][]{
{0, 1, 2},
{3, 4, 5},
{6, 7, 8},
{9, 10, 11}}; //Estas son las posiciones de las partes de la imagen.

botton=new JButton[11];
indexRandom=-1;
indice=new boolean [11];

centerPanel = new JPanel(); //(pos X, pos Y, ancho, alto)
centerPanel.setLayout(new GridLayout(4, 4, 0, 0)); //es un director de disposición que presenta los componentes de un contenedor en una rejilla rectangular. El contenedor es dividido en rectángulos iguales, y un componente es colocado en cada rectángulo.

ImageIcon sid = new ImageIcon(Puzzle.class.getResource("promo.jpg")); //Usamos la clase ImageIcon para cargar la imagen.
source = sid.getImage(); //Devuelve la Imagen de este icono.

width = sid.getIconWidth(); //Obtiene la altura del icono.
height = sid.getIconHeight(); //Obtiene la anchura del icono.

add(Box.createRigidArea(new Dimension(0, 5)), BorderLayout.NORTH); //Crea un componente invisible esto es siempre el tamaño especificado.
add(centerPanel, BorderLayout.CENTER);

for(int i=0; i indice[i]=false;

for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
if (j == 2 && i == 3) {
label = new JLabel("");
centerPanel.add(label);
}
else
{
do
{
indexRandom=(int)(Math.random()*11);
if(indice[indexRandom]==false)
{
indice[indexRandom]=true;
break;
}
}while(indice[indexRandom]==true);

botton[indexRandom]= new JButton();
botton[indexRandom].addActionListener(this);
centerPanel.add(botton[indexRandom]);
image = createImage(new FilteredImageSource(source.getSource(),
new CropImageFilter(j * width / 3, i * height / 4,
(width / 3) + 1, height / 4))); //toma una imagen existente y un objeto con filtro y los usa para producir datos de imagen para una nueva versión filtrada de la imagen original.
botton[indexRandom].setIcon(new ImageIcon(image)); //Define el icono que este componente mostrará.
}
}
} //El código crea 11 botones y una etiqueta. Nos recorta la imagen en pedazos y los colocamos sobre los botones.

setSize(577, 415);
setTitle("PULPAR UP");
setResizable(false); //Establece si este marco es resizable por el usuario.
setLocationRelativeTo(null); //Pone la posición de la ventana en relación con el componente especificado.
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setIconImage(new ImageIcon("esquina.png").getImage());
}

public void actionPerformed(ActionEvent e) {


JButton button = (JButton) e.getSource(); //El objeto sobre el cual el evento al principio ocurrió.
Dimension size = button.getSize(); //obtiene el tamaño de este objeto

int labelX = label.getX();
int labelY = label.getY();
int buttonX = button.getX();
int buttonY = button.getY();
int buttonPosX = buttonX / size.width;
int buttonPosY = buttonY / size.height;
int buttonIndex = pos[buttonPosY][buttonPosX];

//Se obtiene la coordenadas x, y del botón que golpeó y una etiqueta vacía.lógica


//Aquí obtenemos el índice del botón en la matriz bidimensional de las posiciones de los botones.
if (labelX == buttonX && (labelY - buttonY) == size.height) {

int labelIndex = buttonIndex + 3;

centerPanel.remove(buttonIndex);
centerPanel.add(label, buttonIndex);
centerPanel.add(button, labelIndex);
centerPanel.validate(); //Valida este contenedor y todos sus subcomponentes.
}

//En este caso, comprobamos si hace clic en el botón, que está justo encima de la etiqueta vacía. Si está por encima de la etiqueta, que comparten la coordenada x. Si el botón está justo encima de la etiqueta, la ecuación (labelY - buttonY) == size.height es cierto.

if (labelX == buttonX && (labelY - buttonY) == -size.height) {

int labelIndex = buttonIndex - 3;
centerPanel.remove(labelIndex);
centerPanel.add(button, labelIndex);
centerPanel.add(label, buttonIndex);
centerPanel.validate();
}

//En este caso, comprobamos si hace click en el boton, que esta justo debajo de la etiqueta vacía.

if (labelY == buttonY && (labelX - buttonX) == size.width) {

int labelIndex = buttonIndex + 1;

centerPanel.remove(buttonIndex);
centerPanel.add(label, buttonIndex);
centerPanel.add(button, labelIndex);
centerPanel.validate();
}

//En este caso, comprobamos si hace click en el boton que esta justo a la derecha de la etiqueta vacía.

if (labelY == buttonY && (labelX - buttonX) == -size.width) {

int labelIndex = buttonIndex - 1;

centerPanel.remove(buttonIndex);
centerPanel.add(label, labelIndex);
centerPanel.add(button, labelIndex);
centerPanel.validate();
}
}

public static void main(String[] args) {
Puzzle puzzle = new Puzzle();
puzzle.setVisible(true);
}
}

Gracias de antemano. Espero puean ayudarme.

  Respuesta:  nelson E.R.
buenas aca te dejo un link q tiene uno hecho simplemente hazle reingenieria y veras como lo hacen.
si en tal caso quieres aun continuar con el tuyo enviame un correo por el perfil y te ayudare
http://juzzle.sourceforge.net/