
El mapa con toda la información está escrito en una tabla llamada t dentro de una estructura.
Código:
Y voy pintando el mapa sobre la tabla a.t[100][100] según las condiciones de los obstáculos y puntos finales e iniciales.
struct recinto{
char t[100][100];
int energia;
};
recinto a;
Mi gran duda es: ¿Alguna idea para trazar el camino evitando obstáculos de una forma sencilla y óptima?
Tengo conocimientos básicos sobre c++, es decir, manejo, tablas, tuplas, condiciones, acciones, funciones y poca cosa más...
Aquí dejo el código por si ayuda a entender algo: (Cualquier duda me la preguntáis)
Código:
#include <stdlib.h>
#include <iostream>
#include <windows.h>
#include <math.h>
using namespace std;
struct recinte{
char t[100][100];
int energia;
};
recinte a;
void gotoxy(int x,int y);
void crear_mapa(recinte& a, int dimx, int dimy, int wallx, int wallx2, int wally, int wally2){
int i, j;
for(i=0;i<dimy+1;i++){
for(j=0;j<dimx+1;j++){
if(j==0||j==dimx||i==0||i==dimy)
a.t[j][i]=char(178);
else if(i>=wally && i<=wally2 && j>=wallx && j<=wallx2)
a.t[j][i]=char(177);
else if (a.t[j][i]!=char(177))
a.t[j][i]='.';
}
}
}
void points(recinte& a, int dimx, int dimy, int inix, int iniy, int finx, int finy){
int i, j;
for(i=0;i<dimy+1;i++){
for(j=0;j<dimx+1;j++){
if(i==iniy && j==inix)
a.t[j][i]=char(219);
else if(i==finy && j==finx)
a.t[j][i]=char(219);
}
}
}
void dibujar_mapa(recinte a, int dimx, int dimy){
int i, j;
for(i=0;i<dimy+1;i++){
for(j=0;j<dimx+1;j++){
cout<<a.t[j][i];
}
cout<<endl;
}
}
void trazar_camino(recinte& a, int dimx, int dimy, int inix, int iniy, int finx, int finy){
//Aquí debería trazar el camino sobre la matriz donde he escrito los obstáculos y puntos.
}
int main(void)
{
int inix, iniy, finx, finy;
int dimx=40, dimy=40;
char recinte[dimx][dimy];
int wallx, wallx2, wally, wally2;
char escojer;
system("color F0");
cout<<"PATHFINDER<<endl;
cout<<"--------------------------"<<endl;
cout<<"DIMENSIONES DEL RECINTO"<<endl;
cout<<"________________________"<<endl;
cout<<"DIMENSION X: "; cin>>dimx;
cout<<"DIMENSION Y: "; cin>>dimy;
while(dimx>70 && dimy>70){
cout<<"LA DIMENSION MAXIMA DEL RECINTO ES DE 70x70!"<<endl;
cout<<"VUELVE A INTRODUCIR EL VALOR: "<<endl;
cout<<"DIMENSION X: "; cin>>dimx;
cout<<"DIMENSION Y: "; cin>>dimy;
}
cout<<endl;
cout<<"DEFINICION DE LOS OBSTACULOS: (3 OBSTACULOS MAXIMO)"<<endl;
cout<<"(SE DEFINEN POR LOS VERTICES QUE FORMAN LA DIAGONAL DEL RECTANGULO)"<<endl;
cout<<"___________________________________________________________________"<<endl;
cout<<endl;
cout<<"DEFINICION DEL PRIMER OBSTACULO RECTANGULAR"<<endl;
cout<<"_____________________________________________"<<endl;
cout<<"OBSTACLE 1 VERTEX 1 (SUPERIOR-IZQUIERDA):"<<endl;
cout<<"coordenada x:"; cin>>wallx; cout<<endl;
cout<<"coordenada y:"; cin>>wally; cout<<endl;
cout<<"OBSTACLE 1 VERTEX 2 (INFERIOR-DERECHA):"<<endl;
cout<<"coordenada x:"; cin>>wallx2; cout<<endl;
cout<<"coordenada y:"; cin>>wally2; cout<<endl;
cout<<endl;
while(wallx>wallx2 || wally>wally2){
cout<<"EL PRIMER VERTEX HA DE SER MES PETIT QUE EL SEGON!"<<endl;
cout<<"OBSTACLE 1 VERTEX 1 (SUPERIOR-IZQUIERDA):"<<endl;
cout<<"coordenada x:"; cin>>wallx; cout<<endl;
cout<<"coordenada y:"; cin>>wally; cout<<endl;
cout<<"OBSTACLE 1 VERTEX 2 (INFERIOR-DERECHA):"<<endl;
cout<<"coordenada x:"; cin>>wallx2; cout<<endl;
cout<<"coordenada y:"; cin>>wally2; cout<<endl;
}
while(wallx<=0 || wallx2>=dimx || wally<=0 || wally2>=dimy){
cout<<"EL OBSTACULO NO ESTA DENTRO DE LOS LIMITES DEL RECINTO!"<<endl;
cout<<"INTRODUCE UN OBSTACULO ENTRE "<<dimx<<" I "<<dimy<<endl;
cout<<"OBSTACLE 1 VERTEX 1 (SUPERIOR-IZQUIERDA):"<<endl;
cout<<"coordenada x:"; cin>>wallx; cout<<endl;
cout<<"coordenada y:"; cin>>wally; cout<<endl;
cout<<"OBSTACLE 1 VERTEX 2 (INFERIOR-DERECHA):"<<endl;
cout<<"coordenada x:"; cin>>wallx2; cout<<endl;
cout<<"coordenada y:"; cin>>wally2; cout<<endl;
}
crear_mapa(a, dimx, dimy, wallx, wallx2, wally, wally2);
system("cls");
dibujar_mapa(a, dimx, dimy);
system("pause");
cout<<"QUIERES INTRODUCIR UN OBSTACULO MAS? (y:si, n:no)"; cin>>escojer;
while(escojer!='y' && escojer!='n'){
cout<<"SI O NO? (y:si, n:no)"; cin>>escojer;
}
if (escojer=='y'){
cout<<endl;
cout<<"DEFINICION DEL SEGUNDO OBSTACULO RECTANGULAR"<<endl;
cout<<"_____________________________________________"<<endl;
cout<<"OBSTACLE 2 VERTEX 1 (SUPERIOR-IZQUIERDA):"<<endl;
cout<<"coordenada x:"; cin>>wallx; cout<<endl;
cout<<"coordenada y:"; cin>>wally; cout<<endl;
cout<<"OBSTACLE 2 VERTEX 2 (INFERIOR-DERECHA):"<<endl;
cout<<"coordenada x:"; cin>>wallx2; cout<<endl;
cout<<"coordenada y:"; cin>>wally2; cout<<endl;
cout<<endl;
crear_mapa(a, dimx, dimy, wallx, wallx2, wally, wally2);
system("cls");
dibujar_mapa(a, dimx, dimy);
system("pause");
}
if (escojer=='y'){
cout<<"QUIERES INTRODUCIR EL TERCER OBSTACULO? ((y:si, n:no)"; cin>>escojer;
while(escojer!='y' && escojer!='n'){
cout<<"SI O NO? (y:si, n:no)"; cin>>escojer;
}
}
if (escojer=='y'){
cout<<endl;
cout<<"DEFINICION DEL TERCER OBSTACULO RECTANGULAR"<<endl;
cout<<"_____________________________________________"<<endl;
cout<<"OBSTACLE 3 VERTEX 1 (SUPERIOR-IZQUIERDA):"<<endl;
cout<<"coordenada x:"; cin>>wallx; cout<<endl;
cout<<"coordenada y:"; cin>>wally; cout<<endl;
cout<<"OBSTACLE 3 VERTEX 2 (INFERIOR-DERECHA):"<<endl;
cout<<"coordenada x:"; cin>>wallx2; cout<<endl;
cout<<"coordenada y:"; cin>>wally2; cout<<endl;
cout<<endl;
}
crear_mapa(a, dimx, dimy, wallx, wallx2, wally, wally2);
system("cls");
dibujar_mapa(a, dimx, dimy);
system("pause");
cout<<endl;
cout<<"DEFINICION DEL PUNTO DE PARTIDA Y PUNTO FINAL"<<endl;
cout<<"_____________________________________________"<<endl;
cout<<"PUNTO DE PARTIDA (SALIDA DEL ROBOT):"<<endl;
cout<<"coordenada x:"; cin>>inix; cout<<endl;
cout<<"coordenada y:"; cin>>iniy; cout<<endl;
cout<<"PUNTO FINAL(DESTINO DEL ROBOT):"<<endl;
cout<<"coordenada x:"; cin>>finx; cout<<endl;
cout<<"coordenada y:"; cin>>finy; cout<<endl;
system("cls");
points(a, dimx, dimy, inix, iniy, finx, finy);
trazar_camino(a, dimx, dimy, inix, iniy, finx, finy);
points(a, dimx, dimy, inix, iniy, finx, finy);
dibujar_mapa(a, dimx, dimy);
system("PAUSE");
return EXIT_SUCCESS;
}
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
Pues nada, eso es todo, gracias de antemano, y espero poder resolver este problema que lleva días quebrandome la cabeza jaja.
Salu2!



