java.lang.StackOverflowError
Hi everyone! I have a problem with this code. I'm trying make a puzzle game 3x3
with "AI". What can i change?
thank you! :)
Code:
public class Node {
estadosVisitados ev = new estadosVisitados();
int tabuleiro[][];
Node pai;
Node filho[];
int ehMeta[][] = {{1, 2, 3},
{4, 5, 6},
{8, 9, 0}};
int nivel, linha, coluna, grau, mover = 1, tamanho = 3;
public Node(Node pai, int tabuleiro[][], int nivel) {
this.tabuleiro = tabuleiro;
this.pai = pai;
filho = new Node[4];
this.nivel = nivel;
grau = 0;
ev.estados.add(tabuleiro);
resolver();
}
public void setFilho(int tabuleiro[][]) {
filho[grau] = new Node(this, tabuleiro, nivel + 1);
grau++;
}
public void acharPosicaoZero(int tabuleiro[][]) {
boolean encontrado = false;
while (encontrado == false) {
for(int l = 0; l < tabuleiro.length; l++) {
for(int c = 0; c < tabuleiro.length; c++) {
if(tabuleiro[l][c] == 0) {
encontrado = true;
linha = l;
coluna = c;
}
}
}
}
}
public void mover(int l, int c) {
int[][] tabuleiroClonado = new int[tamanho][tamanho];
try{
tabuleiroClonado = clonarTabuleiro(tabuleiro);
tabuleiroClonado[l][c] = tabuleiroClonado[l][c - mover];
tabuleiroClonado[l][c - mover] = 0;
if(ev.estados.contains(tabuleiroClonado)) {
tabuleiroClonado[l][c] = tabuleiroClonado[l][c + mover];
tabuleiroClonado[l][c + mover] = 0;
}
else {
this.setFilho(tabuleiroClonado);
System.out.println(toString(tabuleiroClonado));
}
}
catch(Exception e){}
try{
tabuleiroClonado = clonarTabuleiro(tabuleiro);
tabuleiroClonado[l][c] = tabuleiroClonado[l][c + mover];
tabuleiroClonado[l][c + mover] = 0;
if(ev.estados.contains(tabuleiroClonado)) {
tabuleiroClonado[l][c] = tabuleiroClonado[l][c - mover];
tabuleiroClonado[l][c - mover] = 0;
}
else{
this.setFilho(tabuleiroClonado);
System.out.println(toString(tabuleiroClonado));
}
}
catch(Exception e){}
try{
tabuleiroClonado = clonarTabuleiro(tabuleiro);
tabuleiroClonado[l][c] = tabuleiroClonado[l - mover][c];
tabuleiroClonado[l - mover][c] = 0;
if(ev.estados.contains(tabuleiroClonado)) {
tabuleiroClonado[l][c] = tabuleiroClonado[l + mover][c];
tabuleiroClonado[l + mover][c] = 0;
}
else {
this.setFilho(tabuleiroClonado);
System.out.println(toString(tabuleiroClonado));
}
}
catch(Exception e){}
try{
tabuleiroClonado = clonarTabuleiro(tabuleiro);
tabuleiroClonado[l][c] = tabuleiroClonado[l + mover][c];
tabuleiroClonado[l + mover][c] = 0;
if(ev.estados.contains(tabuleiroClonado)) {
tabuleiroClonado[l][c] = tabuleiroClonado[l - mover][c];
tabuleiroClonado[l - mover][c] = 0;
}
else {
this.setFilho(tabuleiroClonado);
System.out.println(toString(tabuleiroClonado));
}
}
catch(Exception e){}
}
private int[][] clonarTabuleiro(int[][] tabuleiro) {
int[][] novo = new int[tabuleiro.length][tabuleiro[0].length];
for (int i = 0; i < tabuleiro.length; i++) {
for (int j = 0; j < tabuleiro[0].length; j++) {
novo[i][j] = tabuleiro[i][j];
}
}
return novo;
}
public String toString(int[][] tabuleiro) {
String codigo = "";
for (int i = 0; i < tabuleiro.length; i++) {
for (int j = 0; j < tabuleiro[i].length; j++) {
codigo += tabuleiro[i][j];
}
}
return codigo;
}
public void resolver() {
if(ehMeta(this.tabuleiro) == false) {
acharPosicaoZero(this.tabuleiro);
mover(this.linha,this.coluna);
}
else {
System.out.println("Solução!");
}
}
private boolean ehMeta(int [][]tablero){
if( tablero[0][0] == ehMeta[0][0] &&
tablero[1][0] == ehMeta[1][0] &&
tablero[2][0] == ehMeta[2][0] &&
tablero[0][1] == ehMeta[0][1] &&
tablero[0][2] == ehMeta[0][2] &&
tablero[1][1] == ehMeta[1][1] &&
tablero[2][2] == ehMeta[2][2] &&
tablero[1][2] == ehMeta[1][2] &&
tablero[2][1] == ehMeta[2][1]) {
return true;
}
else {
return false;
}
}
}
Code:
import java.util.*;
public class estadosVisitados {
ArrayList estados = new ArrayList();
}
Code:
import java.util.ArrayList;
public class Jogo {
private int tabuleiro[][];
private final int tamanho = 3;
public Jogo() {
tabuleiro = new int[tamanho][tamanho];
}
public static void main(String[] args) {
Jogo jogo = new Jogo();
jogo.inicializarTabuleiro();
Node node = new Node(null,jogo.getTabuleiro(),0);
}
public int[][] getTabuleiro() {
return tabuleiro;
}
public void inicializarTabuleiro() {
ArrayList lista = new ArrayList();
for (int i = 0; i <= 8; i++) {
lista.add(new Integer(i));
}
for (int i = 0; i < tabuleiro.length; i++) {
for (int j = 0; j < tabuleiro[i].length; j++) {
int indice = (int) (Math.random() * (lista.size()));
tabuleiro[i][j] = ((Integer) lista.get(indice)).intValue();
lista.remove(indice);
}
}
}
}