Análisis del código fuente del asiento
Demostración de MazePath de Turbo C 2.0
Todos los derechos reservados. Reservados todos los derechos.
Nombre del archivo: Maze.c
Autor Dong Chengyu.
Versión 1.10
*/
# incluir & ltstdio.h & gt
# incluir & ltstdlib.h & gt p>p>
#incluye & ltmalloc.h & gt
# incluye & ltconio.h & gt
#incluye & ltdos.h & gt
#definir OK 1
#definir error 0
#definir verdadero 1
#definir falso 0
#definir F9 0x43 p>
#define Esc 0x1b
#define Del 0x53
#Definición página de inicio 0x47
#Definición final 0x4f
# Definición espacio 0x20
#Definición hacia arriba 0x48
#Definición hacia abajo 0x50
#Definición izquierda 0x4b
#Definición derecha 0x4d
#definir entrada 0x0d
#definir F2 0x3c
#definir F3 0x3d
#definir STACK_INIT_SIZE 200
#Definir incremento de pila 10
typedef int booleano
typedef int status;
estructura typedef
{
int x;
int y;
}
PosType
estructura typedef
{
int orden;
Asiento trasero;
int di
}
SElemType
typedef estructura
{
int td
int pie
int etiqueta;
}
MazeType
estructura typedef
{
SElemType * base
SElemType * top
int tamaño de pila
}
pila;
int Laberinto[20][30];
LaberintoTypelaberinto[20][30]; >
PosType StartPlace
Posición final del tipo de publicación;
int count
int m, n
Boolean b_start = FALSE, b_end = FALSE
void creat maze(void);
Estado guardar laberinto(char *nombre de archivo);
Estado cargar laberinto(char * nombre de archivo) ;
error nulo (char * mensaje);
estado init Stack(Stack * s);
estado destroy Stack(Stack * s); p>
Estado claro Pila(Pila * s);
Pila booleana Vacío(Pila * s);
int Longitud de pila (Pila * s));
Estado Push(Stack *s, selem tipo e);
SElemType Pop(Stack *s, selem tipo e);
Estado GetTop( Pila *s, selem tipo * e);
Estado Stac
kTraverse(Stack *s, Status(* visit)(selem type * se));
Transferencia booleana (PosType curpos);
impresión de marca nula (PosType asiento); p>
p>
Huella vacía (PosType curpos);
PosType NextPos(PosType asiento, int di);
Estado MazePath (comienza el último tipo, el siguiente tipo termina);
p>
Creación no válida (no válida)
/**/ /* Forma un laberinto. */
{
error nulo (char * mensaje);
Estado guardar laberinto (char * nombre de archivo);
Estado de carga laberinto(char * nombre de archivo);
int i, j;
int x, y
char c; [12], nombre de carga[12];
Indicador booleano = falso, carga = falso;
clr SCR();
printf(" Menú:\ n \ n ");
printf("1. Cargando Mazefile:(*.DD)\ n \n ");
printf("2.
Ingrese al laberinto:\ n \ n ");
printf("Ingrese su elección:");
Hacer
{
c = getch();
Cambiar(c)
{
case ' 1 ':patch(' 1 ');
caso "2": putch("2"); descanso
Caso Esc: dormir (1); salida
Predeterminado: descanso p; >
}
}
Y (c!= ' 1 ' & & ampc!= '2') ;
if ( c == '1 ')
{
printf(" \ n \ nLoadName:");
scanf("%s ", nombre de carga); p>
if (LoadMaze(loadname))
{
Sleep(1) = TRUE
}
else { gotoxy(1, 9); printf("¡Error al cargar!");}
}
if (! load)
{
printf("\nIngrese el tamaño del laberinto:\n");
printf("\nIngrese la longitud:\n");
scanf (" %d ", &m);
printf("\nAncho de entrada:\n");
scanf("%d",&n);
p>
if (m & lt4 | | n & lt4) error ("entrada");
if (m & gt30 | ;
for(I = 0; i<30;i++)
for(j = 0;j<20;j++)
Laberinto[j] [I]= 2;
lugar de inicio x =. 0;
lugar inicial . y = 0;
lugar final x = 0;
lugar inicial . ;
clr SCR();
printf(" \ n "
for(I = 1 ; i & lt= n; i++)
{
for(j = 1; j & lt= m; j++)
{
printf(" # ");
Laberinto[I-1][j-1]= 0;
}
printf("\n");
}
}
gotoxy(65, 5);
printf(" ' # ':Pared " ); (65, 7);
printf(" Inicio:Inicio ");
gotoxy(65, 9);
printf(" Fin:Fin ").
gotoxy(65, 11);
printf("Eliminar muro:Del ");
gotoxy(65, 13); >
printf("Entrar en la pared:Entrar ");
gotoxy(65, 15
printf("Guardar el laberinto :F2 ");
gotoxy(65,17);
printf("Completo:F9 ");
gotoxy(65,19);
printf(" Salir:Esc
");
gotoxy(4, 3);
x = 4; y = 3;
Hacer
{ p>
c = getch();
Cambiar (c)
{
caso arriba:if(y & gt; 3){ y -;gotoxy(x,y);}
Descanso;
caso abajo:if(y <n){ y++;gotoxy(x,y);}
p>Pausa;
Caso restante: if (x & gt4) { x-= 2; gotoxy(x, y);}
Pausa;
caso Derecha:if(x<2*m-2){x+=2;gotoxy(x,y);}
Descanso;
caso Del: si (y-2 == lugar de inicio. y & amp; & ampx/2-1 == lugar de inicio. x)b _ inicio = FALSE
if(y-2 == lugar de inicio. y &&x/2-1 = = lugar final ; gotoxy(x, y
Descanso
case Enter:if(y-2 == lugar inicial . y); & & ampx/2-1 == lugar de inicio (' # '); laberinto[y-2][x/2-1]= 0; gotoxy(x, y);
Pausa;
Página de inicio del caso: if( Maze[y-2][x/2-1]&&!b_start)
{
lugar de inicio. x = x/2-1;
lugar de inicio . y = y-2;
patch(' S '); );
b _ start = TRUE
}
Pausa;
Fin del caso: if(Laberinto[y-2] [x/2-1]& amp& b_end)
{
lugar final x = x/2-1
lugar final . >patch(' E ');
gotoxy(x, y);
b_end = TRUE
}
Romper ;
Caso Esc: gotoxy(2, 22); printf("salir"); dormir(1);
Caso F9: if (b_start & amp& ampb _ end)flag = TRUE;
Caso F2: caso gotoxy (Artículo 2, 22);
printf(" Savename:"); ("%s ",savename);
gotoxy(2,22);
if(Guardar laberinto(Guardar nombre))printf(" ¡Guardar OK! "); p>
else printf("¡Error al guardar!");
Dormir(1);
gotoxy
(2, 22);
printf(" ");
gotoxy(x, y);
Descanso; :romper
}
}
mientras(!flag);
for(I = 0;i<30;i++) p>
for(j = 0;j & lt20;j++)
{
Laberinto[j][i]. TD = Laberinto[j][I];
Laberinto[j][i]. marca = 0;
Laberinto[j][i]. pies = 0;
}
}
Estado LoadMaze(char *file)
/**/ /*El laberinto tiene cargado por completo. */
{
ARCHIVO * fp
char *buffer;
char ch
int i = 0, j, k;
Booleano len = FALSE, wid = FALSE
if ((fp = fopen(file, " r)) = = NULL)
Error de retorno;
buffer =(char *)malloc(600 * sizeof(char));
ch = fgetc(FP);
Y (ch! = EOF)
{
búfer[I] = ch
i++
ch = fgetc(FP ) ;
}
m = 30n = 20
for(I = 0;i<600;i++)
{
j = I/30; k = i % 30
if(buffer[I]= = ' 2 ' &&!len){ m = I;len = TRUE}
if(k = = 0 & &buffer[I]= = ' 2 ' & & &!wid){ n = j wid = TRUE}
Switch(buffer[i])
{
Caso "0": laberinto[j][k]= 0; descanso;
Caso ' 1 ': Laberinto [j] [k] = 1; Romper;
Caso ' 2 ': Laberinto [j] [k] = 2
Caso ' 3 ': laberinto [j] = 1; ;
lugar de inicio . x = k
lugar de inicio
b _ inicio = VERDADERO
Romper;
Caso '4': laberinto[j][k]= 1;
lugar final x = k;
lugar final y = j;
b _ end = TRUE
Romper
Predeterminado: romper
}
}
fclose(FP);
clr SCR();
para(I = 0;i<30;i++ )
para(j = 0 ;j & lt20;j++)
{
Laberinto[j][i]. TD = Laberinto[j][I];
Laberinto[j][i]. pies = 0;
Laberinto[j][i].
marca = 0;
if (Laberinto[j][i] == 0)
{
gotoxy(2*i + 2, j+2 );
patch(' # ');
}
}
gotoxy(2*StartPlace.x + 2, iniciar lugar . y+2);
patch(' S ');
gotoxy(2*EndPlace.x + 2, lugar final . y+2);
patch(' E ');
Regresar OK;
}
Laberinto para guardar estado (char *nombre de archivo)
/**/ /*El laberinto está guardado. */
{
ARCHIVO * fp
char *buffer;
int i, j, k;
fp = fopen(nombre de archivo, "WB");
buffer =(char *)malloc(600 * sizeof(char));
for(I = 0 ;i<600 ;i++)
{
j = I/30;k = i % 30
Interruptor (laberinto[j][k])
{
Caso 0: buffer[I]= ' 0 '; roto
caso 1: buffer[I]= ' 1 ';
Caso 2: buffer[I]= ' 2 '; roto;
Valor predeterminado: Error(" Escritura "); >}
p>
if(k == lugar de inicio. x & amp; & ampj = = lugar de finalización. y)buffer[I]= ' 4 '; >}
fwrite(búfer, 600, 1, FP);
} p>
Libre(búfer);
fclose(FP);
Regresar OK;
}
Error no válido (char *mensaje)
{
clr SCR( );
fprintf(stderr, "Error: %s\n ", mensaje);
Salir(1);
} /**/ / *Error*/
Estado de la pila de inicialización (stack*s)
/* */ /*La pila s se ha creado y se ha inicializado para vaciarla. */
{
s-& gt; base =(tipo selem *)malloc(STACK _ INIT _ TAMAÑO * sizeof(tipo selem)); >if(!s->base) error("overflow");
s->top = s->base;
s-> STACK _ INIT _ TAMAÑO
Regresar OK;
} /**/ /* InitStack */
Estado destruir pila (pila *s)
/**/ /*La pila s ha sido destruida.
*/
{
s-& gt;top = NULL
s->tamaño de pila = 0;
Gratis ( s->base);
s->base = NULL
Regresar OK;
} /**/ /* DestroyStack * / p>
Estado Borrar Pila (Stack)
/**/ /*La pila se ha borrado al máximo. */
{
s->top = s->base;
s->stacksize = STACK_INIT_SIZE
Return OK;
} /**/ /* ClearStack */
Atributo de pila booleano (pila *s)
/ **/ /*Compruebe si la pila s está vacía. */
{
si(s-& gt; top == s-& gt; base) devuelve VERDADERO
de lo contrario, devuelve FALSO
} /**/ /* StackEmpty */
int StackLength(Stack *s)
/**/ /*Obtiene la longitud de la pila, s. / p>
{
if(s->top>s->base)return(int)(s->top-s->base);
De lo contrario, devuelve 0;
} /**/ /* StackLength */
Inserción de estado (pila *s, seleccione tipo e)
/**/ /*El elemento e ha sido insertado en la pila s */
{
if(s-& gt; top-s-& gt; base >= s. ->tamaño de pila)
{
s->base = (tipo selem *)realloc(s->base,
(s- >tamaño de pila+incremento de pila)* tamaño de(tipo selem));
if (!s->base) error("overflow");
p>
s->top = s->base+s->tamaño de pila
s->tamaño de pila+= incremento de pila;
}
* s->; top++ = e;
Regresar OK;
} /**/ /*Push*/
SElemType Pop(pila *s, SElemType e)
/**/ /*El elemento e ha sido eliminado de la pila s*/
{
if(s->top == s->base) error("Pop");
e = *-s->top;
return e;
} /* */ /* Pop */
Estado GetTop(Stack *s, SElemType *e)
/**/ /* El elemento e ha alcanzado la parte superior de la pila s.* /
{
if(s-& gt; top == s-& gt; base) error (" GetTop "); *(s->;top-1);
Regresar OK;
} /**/ /* GetTop */
/**/ / *Atraviesa la pila usando la función "acceso".
*/
/* *//* Estado Recorrido de la pila(Pila * s, Estado (* visita)(SElemType *se))
{
Seleccionar p tipo;
int resultado;
if (s-& gt; top == s-& gt; base) devuelve un error
p = s ->base;
mientras (!(p==s->top))
{
resultado=(*acceso)( p );
p++;
}
Regresar OK;
} */
Pase booleano ( PosType curpos)
/**/ /*Comprueba si se puede pasar la posición actual. */
{
if (laberinto[curpos.x][curpos.y].td == 1. & amp
laberinto[curpos.x ][curpos.y].ft == 0&&maze[curpos.x][curpos.y].
Devuelve VERDADERO
En caso contrario, devuelve FALSO. /**/ /*Pase*/
Impresión de marcas no válidas (asientos traseros)
/**/ /*Marcar posición del asiento. */
{
Laberinto[seat.x][seat.y]. mark =-1;
/**/ /*La marca '-1' significa que no se puede colocar la posición actual. */
} /**/ /* MarkPrint */
Huella vacía (PosType curpos)
/**/ /*El fondo del laberinto El vértice se ha establecido en "verdadero". */
{
Laberinto[curpos.x][curpos.y]. Pies = 1;
} /**/ /*huella*/
NextPos trasero (asiento trasero, int di)
{< / p>
Cambiar (di)
{
caso 1:asiento y++; volver asiento /**/ /*hacia el este*/
Caso 2: asiento x++; retorno asiento; /**/ /*sur*/
Caso 3: retorno asiento /**/ /*oeste*/< /p. >
Caso 4: asiento x-; regresar asiento; /**/ /*Hacia el norte*/
Valor predeterminado: asiento x = 0; /p>
}
} /**/ /* NextPos */
/**/ /*Clave del programa. */
/**/ /* Pre: Matriz de laberinto y punto de inicio del amplificador y punto final del amplificador.
Publicar: Encuentra un recorrido del laberinto y ejecuta el camino del laberinto.
Propósito: clase de pila ADT.
*/
Estado MazePath (inicio después de la entrada, fin después de la entrada)
{
Cupos tipo post
int curstep
Seleccione el tipo;
Apilar *s, apilar;
STACK base =(selem type *)malloc(STACK _ INIT. _ TAMAÑO * tamaño de (tipo selem));
if (!stack.base) error ("desbordamiento");
pila superior = base .
PILA . TAMAÑO DE PILA = PILA _ INIT _ TAMAÑO;
s = & pila
curpos = inicio
curstep = 1; p>
p>
Hacer
{
si (Pasa(curpos))
{
Huella ( curpos);
p>e.ord = curstepe.seat = curpose di = 1;
gotoxy((curpos.y + 1)*2, curpos . x+2. );
patch(' @ ');
Retraso (8000); /**/ /* posponer tiempo. */
Push (s, e);
if(curpos . x == end . x & amp; & ampcurpos.y == end.y) /**/ /*Continuar recursivamente. */
{
Destruye la pila;
Devuelve TRUE
}
curpos = NextPos(curpos , 1); /**/ /* Prueba la siguiente posición. */
paso cur++;
}
Otros
{
if (! parte superior de la pila)
{
e = Pop(s, e);/**/ /*Eliminar e de s */
while(e . di = = 4 &&! StackEmpty(s)) /**/ /*Se han comprobado cuatro direcciones
y s no está vacía. */
{
mark print(e . asiento);
gotoxy((e.seat.y + 1)*2, e . asiento . x+2);
patch(' @ ');
Retraso (8000); /**/ /* Posponer tiempo. */
gotoxy((e.seat.y + 1)*2, e . asiento . x+2
patch('); >e = Pop(s, e);/**/ /*Eliminar e de s */
curstep-;
}
if ( e. di<4) /**/ /*La posición actual aún no ha sido comprobada. */
{
e . di++;
Empujar (s, e); /**/ /*Insertar e en */ p>
curpos = NextPos(e. asiento, e. di); /**/ /* Prueba la siguiente posición.
*/
}
}
}
}
Y (!StackEmpty(s));
Destruye la pila;
Devuelve FALSE
} /**/ /* MazePath */
void main() p >
{
PosType inicio, fin;
creat maze();
inicio x = lugar de inicio y;
inicio .y = lugar inicial x .
final x = lugar final . > if (MazePath(inicio, fin))
{
gotoxy(2, 22);
printf("Ruta encontrada\ n ");
gotoxi(2, 22); p>
}
Otro
{
gotoxi(2, 22);
printf("Ruta no encontrada \ n ");
}
getch();
clr SCR(); p>
}
Lo encontré en línea. ¿Cómo usarlo? Vea usted mismo.