8 puzzle

Estudiante preguntada 11 meses antes

buenas tardes, alguien me podría ayudar con el problema de 8puzzle en Java con búsqueda en profundidad? teniendo en cuanta que debe tener una interfaz gráfica donde se vea como se mueve el 0 y cada movimiento del mismo csmbie de color 

2 Respuestas
snow Staff contestada 11 meses antes

el puzzle de ejemplo esta casi resuelto, esto para que no se tardara tanto resolviéndolo, si va a estar mas revuelto aumenta la profundidad porque son bastantes pasos para resolverlo,  y si quieres que valla mas rapido o mas lento los movimientos cambia el tiempo en que se duerme el hilo “Thread.sleep()”

import javax.swing.*;
import java.awt.Color;
import java.util.Arrays;

public class Puzzle extends JFrame {
/*
public int arreglo[][] = {
{4,7,3},
{1,5,0},
{6,8,2}
};
/////*/
public int arreglo[][] = {
{1,2,3},
{4,5,0},
{7,8,6}
};

JButton botones [][] = new JButton [3][3];

public Puzzle() {
init();
}
public void init() {
setSize(300,300);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

for(int i = 0 ; i < botones.length; i++) {
for(int j = 0 ; j < botones[i].length; j++) {
botones[i][j] = new JButton(arreglo[i][j] + "");
botones[i][j].setBounds(j * 100,i * 100, 70,70);
botones[i][j].setBackground(Color.WHITE);
if(arreglo[i][j] == 0) {
botones[i][j].setBackground(Color.GREEN);
}
add(botones[i][j]);
}

}
}
public boolean ordenado() {
int ordenado[][] = {
{1,2,3},
{4,5,6},
{7,8,0}
};
for(int i = 0 ; i < arreglo.length; i++) {
for(int j = 0 ; j < arreglo[i].length; j++) {
if(arreglo[i][j] != ordenado[i][j]) {
return false;
}
}

}
return true;
}
public boolean moverCeroALaDerecha() {
try {
for(int i = 0 ; i < arreglo.length; i++) {
for(int j = 0 ; j < arreglo[i].length; j++) {
if(arreglo[i][j] == 0) {
int aux = arreglo[i][j + 1];
arreglo[i][j + 1] = 0;
arreglo[i][j] = aux;
botones[i][j + 1].setText("0");
botones[i][j].setText(aux + "");
botones[i][j + 1].setBackground(Color.GREEN);
botones[i][j].setBackground(Color.WHITE);
return true;
}
}

}
} catch (Exception e) {
return false;
}
return true;
}
public boolean moverCeroALaIzquierda() {
try {
for(int i = 0 ; i < arreglo.length; i++) {
for(int j = 0 ; j < arreglo[i].length; j++) {
if(arreglo[i][j] == 0) {
int aux = arreglo[i][j - 1];
arreglo[i][j - 1] = 0;
arreglo[i][j] = aux;
botones[i][j - 1].setText("0");
botones[i][j].setText(aux + "");
botones[i][j - 1].setBackground(Color.GREEN);
botones[i][j].setBackground(Color.WHITE);
return true;
}
}

}
} catch (Exception e) {
return false;
}
return true;
}

public boolean moverCeroAbajo() {
try {
for(int i = 0 ; i < arreglo.length; i++) {
for(int j = 0 ; j < arreglo[i].length; j++) {
if(arreglo[i][j] == 0) {
int aux = arreglo[i + 1][j];
arreglo[i + 1][j] = 0;
arreglo[i][j] = aux;
botones[i + 1][j].setText("0");
botones[i][j].setText(aux + "");
botones[i + 1][j].setBackground(Color.GREEN);
botones[i][j].setBackground(Color.WHITE);
return true;
}
}

}
} catch (Exception e) {
return false;
}
return true;
}

public boolean moverCeroArriba() {
try {
for(int i = 0 ; i < arreglo.length; i++) {
for(int j = 0 ; j < arreglo[i].length; j++) {
if(arreglo[i][j] == 0) {
int aux = arreglo[i - 1][j];
arreglo[i - 1][j] = 0;
arreglo[i][j] = aux;
botones[i - 1][j].setText("0");
botones[i][j].setText(aux + "");
botones[i - 1][j].setBackground(Color.GREEN);
botones[i][j].setBackground(Color.WHITE);
return true;
}
}

}
} catch (Exception e) {
return false;
}
return true;
}

public void printArray() {
System.out.println(Arrays.deepToString(arreglo));
}
}


public class Profundidad {

public boolean ordenar(int profundidad, Puzzle puzzle) {
if(profundidad == 30) {
return false;
}
profundidad++;
if(puzzle.ordenado()){
return true;
}
//puzzle.printArray();
try {
Thread.sleep(100);
} catch(Exception e) {
}

if(puzzle.moverCeroALaDerecha()) {
if(ordenar(profundidad,puzzle)) {
return true;
}
puzzle.moverCeroALaIzquierda();
}
if(puzzle.moverCeroALaIzquierda()) {
if(ordenar(profundidad,puzzle)) {
return true;
}
puzzle.moverCeroALaDerecha();
}
if(puzzle.moverCeroAbajo()) {
if(ordenar(profundidad,puzzle)) {
return true;
}
puzzle.moverCeroArriba();
}
if(puzzle.moverCeroArriba()) {
if(ordenar(profundidad,puzzle)) {
return true;
}
puzzle.moverCeroAbajo();
}
return false;
}

public static void main(String... as) {
Profundidad p = new Profundidad();
Puzzle puzzle = new Puzzle();
p.ordenar(0,puzzle);
}
}

fitorec contestada 7 meses antes

Veo que las funciones:


public boolean moverCeroALaDerecha()
public boolean moverCeroALaIzquierda()
public boolean moverCeroAbajo()public boolean moverCeroArriba()

En todas ellas lo primero que haces es obtener la posición del cero(mediante Iteracioines) y posteriormente intentas(try) mover la ficha, creo que seria mas sencillo que se agregue dos atributos a la clase, algo como:


int zero_columna = 2;
int zero_fila = 1;
public int arreglo[][] = {
{1,2,3},
{4,5,0},
{7,8,6}
};

De esta forma solo basta con revisar el rango de zero_fila en caso de querer mover el cero arriba/abajo y zero_columna si lo que queremos es moverlo a la izquierda/derecha, finalmente los métodos quedarían mas simplificados algo como:

public boolean moverCeroArriba() {
	if (zero_fila == 0) { // mas arriba no se puede
		return false;
	}
	// movemos los elementos en el arreglo
	int valActual = arreglo[zero_fila][zero_columna];
	arreglo[zero_fila-1][zero_columna] = valActual;
	arreglo[zero_fila][zero_columna] = 0;
	// Actualizamos los botones
	botones[zero_fila-1][zero_columna].setText(valActual + "");
	botones[zero_fila][zero_columna].setText("0");
	// Actualizamos el indice
	zero_fila--;
	return true;
}

Your Answer

8 + 16 =