* Tabula el código... es imposible leer un código que no está correctamente tabulado.
* Pon nombres con sentido a las variables. 'fil' y 'col' dan a entender que son índices para la fila y la columna... cuando realmente están indicando el total de filas y columnas... nuevamente lo que prima aquí es que el código sea lo más legible posible para evitar problemas.
* No uses variables globales, no sucede en este caso concreto, pero dan problemas. Es mejor pasar la matriz como parámetro.
* Cúrrate un poquito la interfaz de usuario. El sistema para rellenar la matriz es espantoso... si pones un carácter no válido no te avisa, no sabes qué está pasando... poner mensajes de error ante entradas incorrectas te ayuda a ver también que el programa hace lo que debe... si no pones mensajes no sabes si se está tragando información incorrecta.
Respecto a este punto... cómo sabes cuándo has dejado de rellenar la matriz y el programa te está pidiendo los movimientos?? sencillamente, con tu código, es imposible saberlo.
Queda más bonito algo del tipo:
Código
const int FILAS = 20; const int COLS = 20; // ... int main( ) { int num_filas, num_columnas; do { cout << "Numero de filas: "; cin >> num_filas; if ( num_filas < 1 || num_filas > FILAS ) cout << "Valor incorrecto." << endl; } while ( num_filas < 1 || num_filas > FILAS ); do { cout << "Numero de columnas: "; cin >> num_columnas; if ( num_columnas < 1 || num_columnas > COLS ) cout << "Valor incorrecto." << endl; } while ( num_columnas < 1 || num_columnas > COLS ); // ... }
Es más código pero si algo funciona mal puedes ver qué es simplemente "jugando" con tu aplicación.
* Procura reducir el ámbito de las variables al mínimo posible:
Código
int i,j,c,pasos,x,y,l,m,Ac;
Tienes esta línea al inicio de 'Mover_posicion'. No es necesario... si vas a usar un índice en un for puedes declarar la variable dentro del for:
Código
for ( int i=0; i < 20; i++ ) { }
Reutilizar variables dentro de una misma función es algo que hay que realizar con sumo cuidado para evitar meteduras de pata.
* Reutiliza código. Usas en varios puntos, por ejemplo, el código que imprime la matriz en pantalla. Saca ese código a una función y evita duplicarlo... por un lado, si ese código tiene errores, solo tendrás que corregirlos en un sitio, por otro, todas las invocaciones funcionarán igual.
Código
void PintaMatriz( char matriz[][COLS], int filas, int columnas ) { for ( int i = 0; i < filas; i++) { for ( int j = 0; j < columnas ; j++) cout << matriz[i][j] << " "; cout << endl; } }
* Cuidado con las asignaciones. La siguiente instrucción de tu programa no hace nada. ¿Metedura de pata o despiste?
Código
matriz[x][y] = matriz[x][y];
* Controla el rango de valores de las variables:
Código
cout<<"Ingrese filas y columnas"<<endl; cin>>fil>>col;
¿Qué sucede si pongo 1000 y 244? Que el programa fallará al intentar escribir fuera de la matriz de 20x20 que has definido.
* Inicializa las variables:
Código
int c,pasos,x,y,l,m,Ac; // ... Ac=Ac + Puntaje(x,y); // Que valor tiene Ac aqui???
Código
float Puntaje(int x, int y) { float Pts; if (matriz[x][y]=='$') Pts=1.0; else if (matriz[x][y]=='%') Pts=1.5; else if (matriz[x][y]=='&') Pts=2.0; return Pts; // Cuantos puntos vale '|' ?? }
* No tienes ningún chequeo que impida introducir varios 'I' o 'F' así como tampoco compruebas que, obligatoriamente, se haya introducido una 'I' y una 'F' en la matriz.
* No compruebas que con 'pasos' te puedas salir de la matriz.
Tienes bastantes fallos en la aplicación. Te he indicado un poco lo que he ido viendo.
Dale un repaso al código, corrige las cosillas y seguimos revisando.