Cómo escribir un juego de laberinto en lenguaje c
#include
#include
#include
# include
#include
#define N 20/*
El tamaño del laberinto se puede cambiar p>
*/
int oldmap[N][N];/*
Matriz para recursividad
,
Utilice variables globales para ahorrar tiempo
*/
int yes=0;/*yes
es una señal para determinar si se ha encontrado la carretera
, 1
Encontrado,
No encontrado
*/
int way[100][2],wayn =0;/* way
La matriz se usa para mostrar la ruta
, wayn
se usa para contar el número de cuadrículas recorridas
*/
void Init(void);/*
Inicialización gráfica
*/
void Close(void); /*
Gráficos desactivados
*/
void DrawPeople(int *x,int *y,int n); /*
Dibujar un mapa de objetos de exploración artificial
*/
void PeopleFind(int (*x)[N]);/*
Exploración artificial
*/
void
WayCopy(int
(*x)[N],int
(*y) [N]);/*
Para recursividad en
8
direcciones, copie el antiguo diagrama de laberinto
a la nueva matriz
*/
int FindWay(int (*x)[N],int i,int j);/*
Función de exploración automática
*/
void MapRand(int (*x)[N]);/*
Función de laberinto de generación aleatoria
*/ p>
void PrMap(int (*x)[N]);/*
Función de mapa de laberinto de salida
*/
void Resultado( void);/*
Procesamiento de resultados de salida
*/
void Find(void);/*
Procesamiento exitoso
p>*/
void NotFind(void);/*
Manejo de fallas
*/
void main( void)/*
Función principal
*/
{
int map[N][N]; /* p>
Matriz de laberinto
*/
char
clrscr(); /p>
printf("\n Seleccione mano(1) else auto\n");/*
Seleccione método de exploración
*/
scanf("%c",&ch);
Init(); /*
Inicialización
*/
MapRand (mapa);/*
Generar laberinto
*/
p>
PrMap(map);/*
Mostrar mapa del laberinto
*/
if(ch=='1')
PeopleFind(mapa);/*
Exploración manual
*/
else
FindWay(mapa,1, 1);/*
El sistema comienza a explorar automáticamente desde el subíndice
1,1
*/
Resultado();/*
Resultado de salida
*/
Cerrar()
}
void Init(void)/*
Inicialización gráfica
*/
{
int gd=DETECT,gm ;
initgraph(&gd,&gm,"c:\\tc"); }
void DrawPeople(int *x,int *y,int n)/*Dibujar control manual Figura */ {/*Si comentas las siguientes dos oraciones, se mostrará la ruta recorrida manualmente,*/
setfillstyle(SOLID_FILL,WHITE); /*Establece el estilo de relleno sólido blanco*/ bar( 100 +(*y)*15-6,5(*x)*15-6,10(*y)*15+6,5(*x)*15+6); /
switch(n)/*Juzga los cambios en x, y, cambios en 8 direcciones*/ {
caso 1: (*x)--;break; * /
caso 2: (*x)--;(*y)++;break /*arriba derecha*/ caso 3: (*y)++;break /*derecha*/ p>
caso 4: (*x)++;(*y)++;break; /*abajo a la derecha*/ caso 5: (*x)++;break /*bottom*/
caso 6: (*x)++;(*y)--;break; /*inferior izquierda*/ caso 7: (*y)--;break; p>
caso 8: (*x)--;(*y)--;break; /*upper left*/ }
setfillstyle(SOLID_FILL,RED);/*Mostrar objetos de exploración en nueva ubicación*/
bar(10(*y)*15-6,5(*x)*15-6,10(*y)*15+6,5(*x )*15+6 ); }
void PeopleFind(int (*map)[N])/*Búsqueda manual*/ {
int x,y;
char c=0;/*Variable para recibir pulsaciones de teclas*/ "); line(500,200,450,200); outtextxy(430,197,"a"); line(500,200,500,150); outtextxy(497,130,"w"); line(500,200,500,250 );
línea(500,200,450,150); salidatextxy(445,130,"q"); línea(500,200,550,150); salidatextxy(550,130,"e"); línea(500,200,450,250); 50);
outtextxy(550,270,"c");/*Lo anterior es una introducción al control del dibujo en 8 direcciones*/
setcolor(YELLOW); p> outtextxy(420,290," Presione 'Enter' para finalizar");/*Presione Enter para finalizar*/ setfillstyle(SOLID_FILL,RED
bar(10y*15-6,5); x*15-6,10 y*15+6,5x*15+6);/*Visualización de la posición de entrada*/ while(c!=13)/*Si no se presiona la tecla Enter*/ {
c =getch();/*Iniciar la exploración en todas las direcciones después de recibir los personajes*/ if(c=='w'&&map[x-1][y]!=1) DrawPeople(&x,&y,1 );/*Arriba */ else if(c=='e'&&map[x-1][y+1]!=1) DrawPeople(&x,&y,2);/*arriba a la derecha*/ else if(c =='d'&&map [x][y+1]!=1) DrawPeople(&x,&y,3);/*derecha*/ else if(c=='c'&&map[x+1][y+ 1]!=1) DrawPeople(&x,&y,4);/*Abajo derecha*/ else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5 );/*Abajo* / else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6); /*abajo a la izquierda*/ else if(c); =='a'&&map[ x][y-1]!=1) DrawPeople(&x,&y,7 /*izquierda*/ else if(c=='q'&&map[x-1][y-); 1]!=1) DrawPeople (&x,&y,8); /*Arriba izquierda*/ }
setfillstyle(SOLID_FILL,WHITE); /*Elimina los objetos de exploración rojos y restaura el mapa del laberinto original* / bar(10y*15-6 ,5x*15-6,10y*15+6,5x*15+6); if(x==N-2&&y==N-2)/* Si el control manual es exitoso*/ yes=1 ; /*Si el indicador de éxito es 1*/ }
void WayCopy(int (*oldmap)[N],int (*map)[N]) /*Copiar la matriz del laberinto*/ {
int i,j
for(i=
0;i int FindWay(int (* map)[N],int i,int j)/*Búsqueda de ruta recursiva*/ { if(i==N-2&&j==N-2)/*Ir a la salida*/ { yes=1;/*La bandera es 1, lo que indica éxito*/ return } map[i][j]=1;/*El lugar por el que caminaste se convierte en 1 * / WayCopy(oldmap,map); /*Copiar el mapa del laberinto*/ if(oldmap[i+1][j+1]==0&&!yes)/*Determina si la parte inferior derecha la esquina es transitable*/ / { FindWay(oldmap,i+1,j+1); if(yes)/*Si llega a la salida, asigne el valor a la matriz de caminos que muestra la ruta. Es por esta razón que la ruta específica se guarda desde el final */ { way[wayn][0]=i; way[wayn++][1]=j; (oldmap,map); if(oldmap[i+1][j]==0&&!yes)/*Determine si se puede caminar por la parte inferior. Si la bandera de sí ya es 1, allí. no es necesario buscar más*/ { FindWay(oldmap,i+1,j); if(yes) { way[wayn][0]=i; =j; } } WayCopy (oldmap,map); if(oldmap[i][j+1]==0&&!yes)/*Determinar si el se puede caminar por el lado derecho*/ { FindWay( oldmap,i,j+1); if(yes) { way[wayn][0]=i; ; return; } } WayCopy(oldmap,map ); if(oldmap[i-1][j]==0&&!yes)/*Determinar si la parte superior puede ir*/ { FindWay(oldmap,i-1,j); if(sí) { camino[wayn][0]=i; camino[wayn++][1]=j; } WayCopy(oldmap,map); if(oldmap[i-1][j+1]==0&&!yes)/*Determine si la esquina superior derecha puede ser caminado*/ { FindWay(oldmap,i-1,j +1); if(yes) { camino[wayn][0]=i; camino[wayn++][1]=j; return } } WayCopy(oldmap,map); if(oldmap[i+1][j-1]==0&&!yes)/*Juzga si es inferior Se puede caminar por la esquina izquierda*/ { FindWay(oldmap,i+1,j-1); if(sí) { camino[wayn][0]=i; camino[wayn++][1]=j; WayCopy(oldmap,map); if(oldmap[i][j-1]==0&&!yes)/*Determinar si el lado izquierdo puede ir*/ { FindWay(oldmap,i,j-1); if(yes) { camino[wayn][0]=i; camino[wayn++][1]=j; > WayCopy(oldmap,map); if(oldmap[i-1][j-1]==0&&!yes)/*Determinar si se puede caminar por la esquina superior izquierda*/ { FindWay(oldmap,i-1,j-1); if(sí) { camino[wayn][0]=i; camino[wayn++][1]=j; return; } void MapRand(int (*map)[N])/*El mapa de laberinto aleatorio inicial*/ { int i,j ; cleardevice();/*borrar pantalla*/ randomize(); /*generador de números aleatorios*/ for(i=0;i for(j=0;j void PrMap(int (*map)[N])/*Mapa de laberinto de salida*/ { int i,j for(i=0;i } } void Buscar(void )/*encontrar la ruta* / { int i; setfillstyle(SOLID_FILL,RED);/*La ruta específica de la salida roja*/ wayn--; p> for(i =wayn; i>=0;i--) { bar(10vía[i][1]*15-6,5vía[i][0]*15-6,10 vía[i ][1]*15+6,5way[i][0]*15+6); sleep(1);/*Controlar el tiempo de visualización*/ } bar(10(N -2)*15-6,5(N-2)*15-6,10 (N-2)*15+6,5(N-2)*15+6); red */ setcolor(GREEN); settextstyle(0,0,2);/*Establecer tamaño de fuente*/ outtextxy(130,400,"Encuentra una manera!" > void NotFind(void)/*No se encontró ninguna ruta*/ { setcolor(GREEN settextstyle(0,0,2);/*Establecer tamaño de fuente*/ outtextxy); ( 130,400,"¡No encuentro la manera!"); } void Result(void)/*Procesamiento de resultados*/ { if(yes)/*If found*/ Find ( ); else/*No se encontró ninguna manera*/ NotFind(); getch(); } void Close(void)/*Cierre gráfico*/ { cerrar gráfico(); }