Laberinto en C
hola:
estoy medio complicado estoy recien empesando a aprende C no se si me pueden ayudar , te cuento en la Univercidad me dieron un problema a resolver y no se por donde empezar, me estan enseñando matrices, arreglos, y una cuantas funciones lo mas basico; le agradeceria mucho si me pudieran dar unas pistas de como hacerlo o como empezar, la ejecucion de este es solo en D.O.S ..... (o si lo saben hacer mejor...jejjeje) bueno les dejo el ejercicio, aa ocupo Turbo C++ 3.0.
a todos gracias de antemano
([email protected])
TECNICAS DE PROGRANIACION:
CASO: (El laberinto) El juego consiste en mostrar una imagen que es un laberinto (una matriz de 20x20), donde aparece la posición de inicio en el laberinto, marcado con algún objeto (o dibujo). El usuario debe mover el objeto hasta encontrar la salida del laberinto. Se debe tener en cuenta, que el usuario solo puede mover el objeto donde es debido, es decir, si encuentra una pared, no podrá mover el objeto a la siguiente celda, en tal caso esta obligado a retroceder hasta encontrar un nuevo camino.
Realice un programa en Lenguaje C que de solución al CASO planteado. Considere todas las validaciones necesarias.
Jose Higuera..
Chile.
estoy medio complicado estoy recien empesando a aprende C no se si me pueden ayudar , te cuento en la Univercidad me dieron un problema a resolver y no se por donde empezar, me estan enseñando matrices, arreglos, y una cuantas funciones lo mas basico; le agradeceria mucho si me pudieran dar unas pistas de como hacerlo o como empezar, la ejecucion de este es solo en D.O.S ..... (o si lo saben hacer mejor...jejjeje) bueno les dejo el ejercicio, aa ocupo Turbo C++ 3.0.
a todos gracias de antemano
([email protected])
TECNICAS DE PROGRANIACION:
CASO: (El laberinto) El juego consiste en mostrar una imagen que es un laberinto (una matriz de 20x20), donde aparece la posición de inicio en el laberinto, marcado con algún objeto (o dibujo). El usuario debe mover el objeto hasta encontrar la salida del laberinto. Se debe tener en cuenta, que el usuario solo puede mover el objeto donde es debido, es decir, si encuentra una pared, no podrá mover el objeto a la siguiente celda, en tal caso esta obligado a retroceder hasta encontrar un nuevo camino.
Realice un programa en Lenguaje C que de solución al CASO planteado. Considere todas las validaciones necesarias.
Jose Higuera..
Chile.
Antes de empezar a programar, por favor aprende ortografía, así no nos hará daño leer semejante porquería de mensaje.
PD: Yo también voy a la "Univercidad", lástima que aquí todo el mundo le llama "Universidad"
PD: Yo también voy a la "Univercidad", lástima que aquí todo el mundo le llama "Universidad"
hola saludos desde puebla , no se si me puedas ayudar con este programa. te lo agradecere
gracias
gracias
#include <conio.h>
#include <stdio.h>
#define fil 9 // cantidad de filas
#define col 12 // cantidad de columnas
#define lx 35 // coodenada x
#define ly 7 // coordenada y
int main(void)
{
textbackground(15);
clrscr();
gotoxy(30,3);
textcolor(4);
cprintf("EL LABERINTO TENEBROSO");
int lab[fil+1][col];
int laberinto(int l[][col]);
int mover(int l[][col]);
laberinto(lab);
mover(lab);
getch();
return (0);
}
int laberinto(int l[][col])
{
int i,j;
textcolor(4);
for (i=1;i<=fil;i++)
for (j=1;j<=col;j++)
{
l[i][j]=0;
if((i==1&&j!=2)||(i==fil&&j!=col-1)||(j==1||j==col)) l[i][j]=4;
if (i==3&&j!=col-2) l[i][j]=4;
if (i==5&&j!=2) l[i][j]=4;
if (i==7&&j!=col-2) l[i][j]=4;
if (i==8&&j>3&&j<9) l[i][j]=4;
l[2][4]=4;//ojo
if (l[i][j]==4)
{
gotoxy(lx+j,ly+i);
cprintf("Û");
l[i][j]=4;
}
}
return (0);
}
int mover(int l[][col])
{
int i=1,j=2,x=i,y=j,c;
do
{
textcolor(27); //cursor
textbackground(25);
gotoxy(lx+j,ly+i);//direccion
cprintf("");//ojeto
c = getch(); x=j;y=i;
if ((c=='w'||c=='W')&&(i-1!=0&&l[i-1][j]!=4)) i--; //subir
else if ((c=='s'||c=='S')&&(i+1!=fil+1&&l[i+1][j]!=4)) i++; //bajar
else if ((c=='a'||c=='A')&&(j-1!=1&&l[i][j-1]!=4)) j--; //izquierda
else if ((c=='d'||c=='D')&&(j+1!=col&&l[i][j+1]!=4)) j++;//derecha
textcolor(2);
gotoxy(lx+x,ly+y);//cola
cprintf("Û");
}
while (i!=fil||j!=col-1);
textcolor(9);
gotoxy(35,20);
cprintf("FELIICIDADES");
return (0);
}
bueno el laberinto es super sencillo porque llevo 3 meses estudiando c++ y por leceo lo hice
para moverse :
arriba :w
abajo :s
izquierda :a
derecha :d
#include <stdio.h>
#define fil 9 // cantidad de filas
#define col 12 // cantidad de columnas
#define lx 35 // coodenada x
#define ly 7 // coordenada y
int main(void)
{
textbackground(15);
clrscr();
gotoxy(30,3);
textcolor(4);
cprintf("EL LABERINTO TENEBROSO");
int lab[fil+1][col];
int laberinto(int l[][col]);
int mover(int l[][col]);
laberinto(lab);
mover(lab);
getch();
return (0);
}
int laberinto(int l[][col])
{
int i,j;
textcolor(4);
for (i=1;i<=fil;i++)
for (j=1;j<=col;j++)
{
l[i][j]=0;
if((i==1&&j!=2)||(i==fil&&j!=col-1)||(j==1||j==col)) l[i][j]=4;
if (i==3&&j!=col-2) l[i][j]=4;
if (i==5&&j!=2) l[i][j]=4;
if (i==7&&j!=col-2) l[i][j]=4;
if (i==8&&j>3&&j<9) l[i][j]=4;
l[2][4]=4;//ojo
if (l[i][j]==4)
{
gotoxy(lx+j,ly+i);
cprintf("Û");
l[i][j]=4;
}
}
return (0);
}
int mover(int l[][col])
{
int i=1,j=2,x=i,y=j,c;
do
{
textcolor(27); //cursor
textbackground(25);
gotoxy(lx+j,ly+i);//direccion
cprintf("");//ojeto
c = getch(); x=j;y=i;
if ((c=='w'||c=='W')&&(i-1!=0&&l[i-1][j]!=4)) i--; //subir
else if ((c=='s'||c=='S')&&(i+1!=fil+1&&l[i+1][j]!=4)) i++; //bajar
else if ((c=='a'||c=='A')&&(j-1!=1&&l[i][j-1]!=4)) j--; //izquierda
else if ((c=='d'||c=='D')&&(j+1!=col&&l[i][j+1]!=4)) j++;//derecha
textcolor(2);
gotoxy(lx+x,ly+y);//cola
cprintf("Û");
}
while (i!=fil||j!=col-1);
textcolor(9);
gotoxy(35,20);
cprintf("FELIICIDADES");
return (0);
}
bueno el laberinto es super sencillo porque llevo 3 meses estudiando c++ y por leceo lo hice
para moverse :
arriba :w
abajo :s
izquierda :a
derecha :d
Hola...
A mi me dejaron un programa igual y pude hacer esto:
/*
Autor: Juan Villa
Fecha: 17.Oct.03
Este programa Genera y Resulve Laberintos.
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int **Generar(int **Lab, int Anc, int Alt);
void Imprimir(int **Lab, int Anc, int Alt);
void Rellenar(int **Lab, int Anc, int Alt);
void Solucion(int **Lab, int Anc, int Alt);
void CopiarLab(int **LabOrigen,int **LabDestino, int Anc, int Alt, int N);
int main(void) {
int **TMP, **TMP2, **TMP3;
int **Laberinto;
int Ancho,Alto;
int I;
Ancho=Alto=0;
clrscr();
printf("Escriba el tamaño del laberinton");
printf("Alto=");
scanf("%d", &Alto);
printf("Ancho=");
scanf("%d", &Ancho);
Laberinto=Generar(TMP, Ancho, Alto);
TMP2=Generar(TMP3, Ancho, Alto);
clrscr();
puts("Trate de solucionar este laberinto: ");
Imprimir(Laberinto, Ancho, Alto);
puts("Presione una tecla para ver la solucion: ");
getch();
CopiarLab(Laberinto, TMP2, Ancho, Alto, 0);
CopiarLab(Laberinto, TMP2, Ancho, Alto, 1);
for(I=0;I<Alto;I++)
Solucion(Laberinto, Ancho, Alto);
CopiarLab(Laberinto, TMP2, Ancho, Alto, 3);
//clrscr();
puts("Solucion al laberinto: ");
Imprimir(TMP2, Ancho, Alto);
puts("");
getch();
return 0;
}
int **Generar(int **Lab, int Anc, int Alt){
int I, J;
int **p;
int X=0,Y=0,*PX,*PY;
int Ent=0, Sig=0;
Lab=malloc(Alt * sizeof(int *));
if(Lab==NULL) {
printf("nError al asignar la memoria en Labn");
exit(1);
}
for(I=0;I<Alt;I++) {
*(Lab+I)=(int *) malloc(Anc * sizeof(int));
if(*(Lab+I)==NULL) {
printf("nError al asignar la memoria en *(Lab+%d)n",I);
exit(1);
}
}
p=Lab;
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
Lab[I][J]=1;
}
}
//Imprimir(Lab,Anc,Alt);
srand( (unsigned)time( NULL ) );
Ent=rand();
Ent=Ent%Anc;
Lab[0][Ent]=0;
X=Ent;
Y=0;
while (Y<(Alt-1)) {
Sig=rand()%4;
switch(Sig){
case 0:
if(Lab[Y+1][X+1]==0) break;
if(Lab[Y+1][X-1]==0) break;
if(Lab[Y+1][X]==1) {
Y++;
}
break;
case 1:
//if(Y==0) break;
//if(Lab[Y-1][X+1]==0) break;
//if(Lab[Y-1][X-1]==0) break;
//if(Lab[Y-1][X]==1) {
// Y--;
//}
break;
case 2:
if(X==(Anc-1)) break;
if(Y>0 && Lab[Y-1][X+1]==0) break;
if(Lab[Y][X+1]==1) {
X++;
}
break;
case 3:
if(X==0) break;
if(Y>0 && Lab[Y-1][X-1]==0) break;
if(Lab[Y][X-1]==1) {
X--;
}
break;
}
Lab[Y][X]=0;
}
//Imprimir(Lab,Anc,Alt);
printf("nnn");
Rellenar(Lab,Anc,Alt);
return p;
}
void Imprimir(int **Lab, int Anc, int Alt) {
int I,J;
char cimp;
//printf("nLaberinto:n");
//printf("n");
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
if(Lab[I][J]==0)
cimp=176;
else if(Lab[I][J]==1)
cimp=178;
else if(Lab[I][J]==3)
cimp=177;
printf("%c",cimp);
//printf("%d",Lab[I][J]);
}
printf("n");
}
}
void Rellenar(int **Lab, int Anc, int Alt) {
int I=0,J=0,K=0,L=0;
int NRellenos=0;
srand( (unsigned)time( NULL ) );
NRellenos=rand()%(Anc*Alt-2*(Anc+Alt-2));
while(K<NRellenos){
I=rand()%(Alt-2);
J=rand()%(Anc-2);
I++;
J++;
if(Lab[I-1][J-1]==0) L++;
if(Lab[I-1][J]==0) L++;
if(Lab[I-1][J+1]==0) L++;
if(Lab[I][J-1]==0) L++;
if(Lab[I][J+1]==0) L++;
if(Lab[I+1][J-1]==0) L++;
if(Lab[I+1][J]==0) L++;
if(Lab[I+1][J+1]==0) L++;
if(L<4) Lab[I][J]=0;
L=0;
//getch();
K++;
}
}
void Solucion(int **Lab, int Anc, int Alt) {
int I,J,K;
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
K=0;
if(Lab[I][J]!=1) {
if(I==0||I==(Alt-1)||J==0||J==(Anc-1)) {
Lab[I][J]=3;
}else {
if(Lab[I-1][J]==1) K++;
if(Lab[I+1][J]==1) K++;
if(Lab[I][J-1]==1) K++;
if(Lab[I][J+1]==1) K++;
if(K<=2) {
Lab[I][J]=3;
}else {
Lab[I][J]=1;
}
}
}
}
}
}
void CopiarLab(int **LabOrigen,int **LabDestino, int Anc, int Alt, int N)
{
int I,J;
for(I=0;I<Alt;I++)
for(J=0;J<Anc;J++)
if(LabOrigen[I][J]==N)
LabDestino[I][J]=LabOrigen[I][J];
}
A mi me dejaron un programa igual y pude hacer esto:
/*
Autor: Juan Villa
Fecha: 17.Oct.03
Este programa Genera y Resulve Laberintos.
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int **Generar(int **Lab, int Anc, int Alt);
void Imprimir(int **Lab, int Anc, int Alt);
void Rellenar(int **Lab, int Anc, int Alt);
void Solucion(int **Lab, int Anc, int Alt);
void CopiarLab(int **LabOrigen,int **LabDestino, int Anc, int Alt, int N);
int main(void) {
int **TMP, **TMP2, **TMP3;
int **Laberinto;
int Ancho,Alto;
int I;
Ancho=Alto=0;
clrscr();
printf("Escriba el tamaño del laberinton");
printf("Alto=");
scanf("%d", &Alto);
printf("Ancho=");
scanf("%d", &Ancho);
Laberinto=Generar(TMP, Ancho, Alto);
TMP2=Generar(TMP3, Ancho, Alto);
clrscr();
puts("Trate de solucionar este laberinto: ");
Imprimir(Laberinto, Ancho, Alto);
puts("Presione una tecla para ver la solucion: ");
getch();
CopiarLab(Laberinto, TMP2, Ancho, Alto, 0);
CopiarLab(Laberinto, TMP2, Ancho, Alto, 1);
for(I=0;I<Alto;I++)
Solucion(Laberinto, Ancho, Alto);
CopiarLab(Laberinto, TMP2, Ancho, Alto, 3);
//clrscr();
puts("Solucion al laberinto: ");
Imprimir(TMP2, Ancho, Alto);
puts("");
getch();
return 0;
}
int **Generar(int **Lab, int Anc, int Alt){
int I, J;
int **p;
int X=0,Y=0,*PX,*PY;
int Ent=0, Sig=0;
Lab=malloc(Alt * sizeof(int *));
if(Lab==NULL) {
printf("nError al asignar la memoria en Labn");
exit(1);
}
for(I=0;I<Alt;I++) {
*(Lab+I)=(int *) malloc(Anc * sizeof(int));
if(*(Lab+I)==NULL) {
printf("nError al asignar la memoria en *(Lab+%d)n",I);
exit(1);
}
}
p=Lab;
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
Lab[I][J]=1;
}
}
//Imprimir(Lab,Anc,Alt);
srand( (unsigned)time( NULL ) );
Ent=rand();
Ent=Ent%Anc;
Lab[0][Ent]=0;
X=Ent;
Y=0;
while (Y<(Alt-1)) {
Sig=rand()%4;
switch(Sig){
case 0:
if(Lab[Y+1][X+1]==0) break;
if(Lab[Y+1][X-1]==0) break;
if(Lab[Y+1][X]==1) {
Y++;
}
break;
case 1:
//if(Y==0) break;
//if(Lab[Y-1][X+1]==0) break;
//if(Lab[Y-1][X-1]==0) break;
//if(Lab[Y-1][X]==1) {
// Y--;
//}
break;
case 2:
if(X==(Anc-1)) break;
if(Y>0 && Lab[Y-1][X+1]==0) break;
if(Lab[Y][X+1]==1) {
X++;
}
break;
case 3:
if(X==0) break;
if(Y>0 && Lab[Y-1][X-1]==0) break;
if(Lab[Y][X-1]==1) {
X--;
}
break;
}
Lab[Y][X]=0;
}
//Imprimir(Lab,Anc,Alt);
printf("nnn");
Rellenar(Lab,Anc,Alt);
return p;
}
void Imprimir(int **Lab, int Anc, int Alt) {
int I,J;
char cimp;
//printf("nLaberinto:n");
//printf("n");
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
if(Lab[I][J]==0)
cimp=176;
else if(Lab[I][J]==1)
cimp=178;
else if(Lab[I][J]==3)
cimp=177;
printf("%c",cimp);
//printf("%d",Lab[I][J]);
}
printf("n");
}
}
void Rellenar(int **Lab, int Anc, int Alt) {
int I=0,J=0,K=0,L=0;
int NRellenos=0;
srand( (unsigned)time( NULL ) );
NRellenos=rand()%(Anc*Alt-2*(Anc+Alt-2));
while(K<NRellenos){
I=rand()%(Alt-2);
J=rand()%(Anc-2);
I++;
J++;
if(Lab[I-1][J-1]==0) L++;
if(Lab[I-1][J]==0) L++;
if(Lab[I-1][J+1]==0) L++;
if(Lab[I][J-1]==0) L++;
if(Lab[I][J+1]==0) L++;
if(Lab[I+1][J-1]==0) L++;
if(Lab[I+1][J]==0) L++;
if(Lab[I+1][J+1]==0) L++;
if(L<4) Lab[I][J]=0;
L=0;
//getch();
K++;
}
}
void Solucion(int **Lab, int Anc, int Alt) {
int I,J,K;
for(I=0;I<Alt;I++) {
for(J=0;J<Anc;J++) {
K=0;
if(Lab[I][J]!=1) {
if(I==0||I==(Alt-1)||J==0||J==(Anc-1)) {
Lab[I][J]=3;
}else {
if(Lab[I-1][J]==1) K++;
if(Lab[I+1][J]==1) K++;
if(Lab[I][J-1]==1) K++;
if(Lab[I][J+1]==1) K++;
if(K<=2) {
Lab[I][J]=3;
}else {
Lab[I][J]=1;
}
}
}
}
}
}
void CopiarLab(int **LabOrigen,int **LabDestino, int Anc, int Alt, int N)
{
int I,J;
for(I=0;I<Alt;I++)
for(J=0;J<Anc;J++)
if(LabOrigen[I][J]==N)
LabDestino[I][J]=LabOrigen[I][J];
}
