Red de conocimiento informático - Conocimiento sistemático - Por favor, código de lenguaje Snake C y explicación de cada paso

Por favor, código de lenguaje Snake C y explicación de cada paso

/* Programa serpiente mediante champking */

#define N 200

#include lt; lt;stdlib.hgt;

#include lt;dos.hgt;

#define IZQUIERDA 0x4b00

#define DERECHA 0x4d00

#define ABAJO 0x5000

#define ARRIBA 0x4800

#define ESC 0x011b

int i, clave

int puntuación = 0; /*Puntuación*/

int gamespeed = 100000 /*Ajusta la velocidad del juego tú mismo*/

struct Food

{

int x; /*Coordenada en abscisa de la comida*/

int y;/*Coordenada vertical de la comida*/

int yes /*Variable para determinar si debe aparecer la comida* /

}comida; /*Estructura alimentaria*/

struct Snake

{

int x[N];

int y[N];

int node; /*Número de nodos de serpiente*/

int dirección; /*Dirección de movimiento de la serpiente*/

int vida; /* Vida de la serpiente, 0 viva, 1 muerta*/

}serpiente;

void Init(void); /*Controlador de gráficos*/

void Close(void); /*Fin del gráfico*/

void DrawK(void); /*Pantalla de inicio*/

void GameOver(void); game*/

void GamePlay(void); /*El proceso específico de jugar el juego*/

void PrScore(void); >

/*Función principal*/

void main(void)

{

Init() /*Controlador de gráficos*/

DrawK(); /*Pantalla de inicio*/

GamePlay() /*El proceso específico de jugar el juego*/

Close(); de gráficos*/

}

/*Controlador de gráficos*/

void Init(void)

{

int gd = DETECT, gm;

initgraph(amp;gd, amp;gm, "c:\\tc");

cleardevice();

}

/*Pantalla de inicio, la pared con las coordenadas de la esquina superior izquierda (50, 40) y las coordenadas de la esquina inferior derecha (610, 460)*/

vacío DrawK(void)

{

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE , 0, THICK_WIDTH);/* Establecer estilo de línea*/

<

p> for(i = 50; i lt; = 600; i = 10)/*Dibujar una valla*/

{

rectángulo(i, 40, i 10, 49 ) ; /*Arriba*/

rectángulo(i, 451, i 10, 460); /*Abajo*/

}

for(i = 40 ; i lt; = 450; i = 10)

{

rectángulo(50, i, 59, i 10); > rectángulo(601, i, 610, i 10);/*lado derecho*/

}

}

/*proceso específico de jugar el juego */

void GamePlay(void)

{

randomize(); /*generador de números aleatorios*/

comida.yes = 1; /*1 significa que es necesario que aparezcan nuevos alimentos, 0 significa que los alimentos ya existen*/

Snake.life = 0; /*alive*/

Snake.direction = 1 ; /*dirección Ir a la derecha*/

serpiente.x[0] = 100; serpiente.y[0] = 100; /*Cabeza de serpiente*/

serpiente.x[ 1] = 110; serpiente.y[1] = 100;

serpiente.node = 2; /*número de secciones*/

PrScore() /*puntuación de salida*; /

while(1)/*Puedes jugar el juego repetidamente y presionar la tecla ESC para finalizar*/

{

while(!kbhit() )/*Sin presionar el botón, La serpiente mueve su cuerpo sola*/

{

if(food.yes == 1)/*Es necesario que aparezca nueva comida*/

{

comida.x = rand() 400 60

comida.y = rand() 350 60; (comida.x 10 != 0)/*comida Después de una aparición aleatoria, la comida debe estar dentro de toda la cuadrícula, para que la serpiente pueda comerla*/

comida.x;

while(comida.y 10 != 0)

comida.y;

comida.yes = 0 /*Hay comida en la pantalla*/

}

if(food .yes == 0)/*Si hay comida en la pantalla, se mostrará*/

{

setcolor(VERDE);

rectángulo(comida.x, comida.y, comida.x 10, comida.y - 10);

}

for(i = serpiente.node - 1; i gt; 0; i-- )/*Cada eslabón de la serpiente avanza, que es el algoritmo clave de la serpiente codiciosa*/

{

serpiente.x[i] = serpiente.x[i- 1];

serpiente.y[i] = serpiente.y[i-1]; > }

/*1, 2, 3, 4 significa correcto

, izquierda, arriba y abajo en cuatro direcciones, use este criterio para mover la cabeza de serpiente*/

switch(snake.direction)

{

caso 1: serpiente .x[0] = 10; romper

caso 2: serpiente.x[0] -= 10; romper

caso 3: serpiente.y[0] - = 10; romper;

caso 4: serpiente.y[0] = 10;

}

for(i = 3; i lt; serpiente .node; i)/*Empieza desde el cuarto segmento de la serpiente para determinar si te golpeó, porque la cabeza de la serpiente tiene dos segmentos y es imposible dar la vuelta desde el tercer segmento*/

{

if(serpiente.x[i] == serpiente.x[0] amp; amp; serpiente.y[i] == serpiente.y[0])

{

GameOver(); /*Falló la visualización*/

serpiente.life = 1

descanso

}

}

if(snake.x[0]lt; 55||snake.x[0]gt; 595||snake.y[0]lt; 55||

serpiente. y[0]gt; 455)/*Si la serpiente golpeó la pared*/

{

GameOver();/*Este juego es over*/

serpiente.life=1; /*serpiente muere*/

}

if(snake.life == 1)/*Después del Los dos juicios anteriores, si la serpiente muere, saltará Bucle interno, reiniciar*/

romper;

if(snake.x[0] == food.x amp; amp; Snake.y[0] == comida. y)/*Después de comer la comida*/

{

setcolor(0);/*Eliminar la comida de la pantalla. */

rectángulo( comida.x, comida.y, comida.x 10, comida.y - 10);

serpiente.x[snake.node] =- 20; Snake.y[snake.node] =- 20 ;

/*Coloque la nueva sección en una posición invisible primero y tome la posición de la sección anterior en el siguiente ciclo*/

serpiente.node;/*Cuerpo de la serpiente Una sección de largo*/

food.yes = 1; /*Es necesario que aparezca comida nueva en la pantalla*/

puntuación = 10 ;

PrScore() ;/*Generar nueva puntuación*/

}

setcolor(4); /*Dibujar una serpiente*/

for(i = 0; i lt ; serpiente.nodo; i )

rectángulo(serpiente.x[i], serpiente.y[i], serpiente.x[i] 10,

serpiente.y[i ] - 10);

retraso(juego

speed);

setcolor(0); /*Eliminar la última sección de la serpiente con negro*/

rectángulo(snake.x[snake.node-1], serpiente. y[snake.node-1],

snake.x[snake.node-1] 10,snake.y[snake.node - 1] - 10); /*end while(!kbhit)*/

if(snake.life == 1)/*Si la serpiente muere, sal del bucle*/

break;

key = bioskey(0); /*Recibir clave*/

if(key == ESC)/*Presione ESC para salir*/

break;

else

if(key == UPamp;amp; Snake.direction!=4)

/*Determina si moverte en la dirección opuesta*/

serpiente.dirección=3;

else

if(key == DERECHA amp; serpiente.dirección != 2)

serpiente .dirección= 1;

else

if(key == IZQUIERDA amp; serpiente.dirección != 1)

serpiente.dirección = 2;

else

if(key == ABAJO amp; amp; serpiente.dirección != 3)

serpiente.dirección = 4; } /*end while(1)*/

}

/*Juego terminado*/

void GameOver(void)

{

cleardevice();

PrScore();

setcolor(ROJO);

settextstyle(0, 0, 4);

outtextxy(200, 200, "JUEGO TERMINADO");

getch();

}

/*Resultados de salida* /

void PrScore(void)

{

char str[10];

setfillstyle(SOLID_FILL, YELLOW); p >

bar(50, 15, 220, 35);

setcolor(6);

settextstyle(0, 0, 2); > sprintf(str, "score: d", score);

outtextxy(55, 20, str);

}

/*Fin de los gráficos; */

void Close(void)

{

getch();

closegraph(); >}