Red de conocimiento informático - Material del sitio web - Cómo escribir un juego de laberinto en lenguaje c

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

*/

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

*/

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]; /*

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*/

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(); }