Pintar el tablero

Hola estoy corriendo el siguiente código el cual debería imprimir el archivo que esta al final en entorno gráfico no se que estoy haciendo mal que el frame sale en pantalla completamente en blanco por favor ayudame gracias y disculpa la molestia
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class tabler extends Frame {
char arreglo[][];
tabler(){
setSize(500,600);
try{
BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\klotski.txt")));
int filas=Integer.parseInt(in.readLine());
int columnas=Integer.parseInt(in.readLine());
arreglo=new char[filas][columnas];
for(int i=0;i < filas;i++){
for(int j=0;j < columnas;j++){
arreglo[ i ][ j ]=(char)(in.read());
}
}
in.close();
}catch(Exception e){}
}
//Este metodo es el que se llama cada vez que la ventana necesite pintarse
public void paint(Graphics g){
//posX y posY se utilizan para ir cambiando la posición en la que se pintara el rectángulo
//ancho y alto son precisamente el ancho y alto del rectangulo
int posX,posY,ancho=25,alto=25;
Color col=null;
//Recorremos los elementos del arreglo
posY=0;
for(int i=0;i < arreglo.length;i++){
posX=0;
for(int j=0;j < arreglo[ i ].length; j++){
//Escogemos el color a pintar segun el caracter (&,#,etc.)
if(arreglo[ i ][ j ]=='*')col=Color.red;
else if(arreglo[ i ][ j ]=='a')col=Color.yellow;
else if(arreglo[ i ][ j ]=='b')col=Color.BLUE;
else if(arreglo[ i ][ j ]=='c')col=Color.CYAN;
else if(arreglo[ i ][ j ]=='d')col=Color.GREEN;
else if(arreglo[ i ][ j ]=='e')col=Color.LIGHT_GRAY;
else if(arreglo[ i ][ j ]=='f')col=Color.MAGENTA;
else if(arreglo[ i ][ j ]=='g')col=Color.ORANGE;
else if(arreglo[ i ][ j ]=='#')col=Color.gray;
else if(arreglo[ i ][ j ]=='-')col=Color.DARK_GRAY;
else if(arreglo[ i ][ j ]=='&')col=Color.white;
else if(arreglo[ i ][ j ]=='·')col=Color.red;
//Asignamos el color
g.setColor(col);
//Dibujamos el rectangulo
g.fillRect(posX,posY,ancho,alto);
posX+=ancho;
}
posY+=alto;
}
}
public static void main(String arg[]){
tabler t=new tabler();
t.show();
t.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent evt){
System.exit(0);
}
});
//t.setBackground(Color.yellow);
}
}
&&&&&&&&&&
&&&&&&&&&&
&&######&&
&&#a**b#&&
&&#a**b#&&
&&#cdde#&&
&&#cfge#&&
&&#a&&b#&&
&&##--##&&
&&&&&&&&··
&&&&&&&&··
"*" pieza singular
"a-g" otras piezas piezas
"#" paredes
"·" Posición objetivo
"--" Paredes
"&" vacio, cuadrado vacio
3

3 respuestas

Respuesta
1
Te he hecho un par de modificaciones, y ahora sí que funciona. El error más grave, en el método paint(Graphics g) te faltaba añadir al principio del método: super. Paint(g) para que en lugar de reescribir el método paint de Frame, le añadas lo que tú quieres. Ah, el fichero me lo has dado mal, necesita dos líneas más al principio quedando:
--- INICIO klotski.txt ---
11
10
&&&&&&&&&&
&&&&&&&&&&
&&######&&
&&#a**b#&&
&&#a**b#&&
&&#cdde#&&
&&#cfge#&&
&&#a&&b#&&
&&##--##&&
&&&&&&&&··
&&&&&&&&··
"*" pieza singular
"a-g" otras piezas piezas
"#" paredes
"·" Posición objetivo
"--" Paredes
"&" vacio, cuadrado vacio
--- FIN klotski.txt -------
Ahora escribo el archivo Tabler.java
--- INICIO Tabler.java ---
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class Tabler extends Frame {
private static String fileName = "C:\\klotski.txt";
private static int ancho = 25;
private static int alto = 25;
char arreglo[][];
Tabler() throws IOException {
// setSize(500, 600);
// Mejor poner el tamaño real cuando sepamos las filas y columnas (ver
// al final)
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(fileName)));
int filas = Integer.parseInt(in.readLine());
int columnas = Integer.parseInt(in.readLine());
arreglo = new char[filas][columnas];
char c = '\0';
for (int i = 0; i < filas; i++) {
for (int j = 0; j < columnas; j++) {
// Si c es un caracter de retorno de carro, nos lo saltamos ;)
do {
c = (char) (in.read());
} while ('\n' == c || '\r' == c);
arreglo[j] = c;
}
}
in.close();
// Test the array
for (int i = 0; i < arreglo.length; i++) {
System.out.print("{");
for (int j = 0; j < arreglo.length; j++) {
System.out.print("[" + arreglo[j] + "]");
}
System.out.println("}");
}
setResizable(false);
setSize(columnas * alto, filas * ancho);
}
// Este metodo es el que se llama cada vez que la ventana necesite pintarse
public void paint(Graphics g) {
super.paint(g);
// posX y posY se utilizan para ir cambiando la posicion en la que se
// pintara el rectangulo
// ancho y alto son precisamente el ancho y alto del rectangulo
int posX = 0, posY = 0;
Color col = null;
// Recorremos los elementos del arreglo
posY = 0;
for (int i = 0; i < arreglo.length; i++) {
posX = 0;
for (int j = 0; j < arreglo.length; j++) {
// Escogemos el color a pintar segun el caracter (&,#,etc.)
if (arreglo[j] == '*')
col = Color.red;
else if (arreglo[j] == 'a')
col = Color.yellow;
else if (arreglo[j] == 'b')
col = Color.BLUE;
else if (arreglo[j] == 'c')
col = Color.CYAN;
else if (arreglo[j] == 'd')
col = Color.GREEN;
else if (arreglo[j] == 'e')
col = Color.LIGHT_GRAY;
else if (arreglo[j] == 'f')
col = Color.MAGENTA;
else if (arreglo[j] == 'g')
col = Color.ORANGE;
else if (arreglo[j] == '#')
col = Color.gray;
else if (arreglo[j] == '-')
col = Color.DARK_GRAY;
else if (arreglo[j] == '&')
col = Color.white;
else if (arreglo[j] == '·')
col = Color.red;
// Asignamos el color
g.setColor(col);
// Dibujamos el rectangulo
g.fillRect(posX, posY, ancho, alto);
posX += ancho;
}
posY += alto;
}
}
public static void main(String arg[]) throws IOException {
Tabler t = new Tabler();
t.show();
t.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
// t.setBackground(Color.yellow);
}
}
--- FIN Tabler.java -------

Mucho ánimo con el "juego" ;)
Respuesta
1
Analizando tu código, estas mal en lo siguiente:
int filas=Integer.parseInt(in.readLine());
int columnas=Integer.parseInt(in.readLine());
Si es verdad que el método estático parseInt recibe como parámetro una cadena, pero... siempre y cuando esta sea "NUMERICA" si no es así, lanza una exception, en este caso lanzaba una excepción por que el archivo que supongo que es el de abajo tenia estos caracteres "&&&&&&", te recomiendo que siempre uses el catch() no nada más para cachar sino para imprimir la excepción.
Lo corregí simplemente así :
int filas = in.readLine().length();
int columnas = in.readLine().length();
Respuesta
1
Pues así como me lo cuentas, tienes toda la lógica, sólo que no encuentras como representarla... y puede ser más fácil
de lo que crees, me explico.. porque no estableces una variable global (es decir, al principio de tu clase) para que la
puedas manipular desde cualquier método, así cada vez que hagas un movimiento, puedes simplemente incrementar o decrementar
(Según sea el caso) el valor de ésa variable por cada movimiento que hagas, y colocas una etiqueta o campo de texto en
tu frame que indique el valor de ésa variable... cualquier cosa, con confianza.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas