¿Cómo escribir un pequeño juego en lenguaje C?
Código C "Serpiente":
#include
#include
#include
#include
#include
#define W 78 //Juego El ancho del cuadro, eje x
#define H 26? //La altura del cuadro del juego, eje y
int dir=3 //Variable de dirección, la inicial; valor 3 significa " "Izquierda"
int Flag=0; ?//Bandera de comer alimentos (1 sí, 0 no)
int score=0;? //Puntuación del jugador
struct food{ int x;? //La coordenada x de la comida
int y;? //La coordenada y de la comida
? fod; ?//La estructura fod tiene 2 miembros
struct Snake{ int len;? //Longitud
int speed;? //Velocidad
int x[100];
int y[100];
}snk;? //La estructura snk tiene 4 miembros
void gtxy( int x, int y) ?//Controlar la función de movimiento del cursor
{ COORD coord; coord. p>void gtxy( int x,int y); //A continuación se declaran varias funciones escritas por usted mismo
void csh( );? //Interfaz de inicialización
void keymove( ); //Operación clave para mover la serpiente
void putFod( ); /Poner comida en
int? Over( ?//El juego ha terminado (1 es 0 No)
void setColor(unsigned short p, unsigned short q); /Establecer el color de visualización
int main( )?? //Función principal
{ csh( );
while(1)
{ Dormir(snk.speed);
? keymove( );
? putFod( );
si(Over( ))
{system(“cls”);
? gtxy(W/2+ 1,H/2); printf("¡Se acabó el juego! T__T");
? gtxy(W/2+1,H/2+2); printf("Puntuación total del jugador: %d puntos",puntuación);
? getch( );
? romper;
} }
? devolver 0;
}
void csh( )? //Interfaz de inicialización
{ int i;
LE_CURSOR_INFO cursor_info={1,0};? //Las dos líneas siguientes son configuraciones para ocultar el cursor SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info for(i=0;i<=W;i=i+2)? // La abscisa debe ser un número par, porque el carácter a imprimir ocupa 2 posiciones { setColor(2, 0);? //Establece el color de impresión en verde con fondo negro
gtxy(i, 0); ?printf("■"); ?//Imprimir el borde superior
gtxy(i,H); printf("■"); =1;i< H;i++) { gtxy(0,i); printf("■"); ?//Imprimir el borde izquierdo
gtxy(W,i); ?//Imprimir borde derecho} while(1)
{ srand((unsigned)time(NULL)); //Inicializar el generador de números aleatorios srand( )
fod.x=rand( )%(W-4)+2;? //La función aleatoria rand() genera un número de 0 a 1 menor que "(W-4)" más 2
fod .y=rand ()%(H-2)+1;? //La función aleatoria rand() genera un número de 0 a 1 menor que "(H-2)" más 1
if ( fod. x%2==0) break;? //fod.x es la abscisa del alimento, si es múltiplo de 2 (un número par) } setColor(12, 0);? color a rojo claro con fondo negro gtxy (fod.x,fod.y); printf("●");//Imprime la comida de prueba inicial en las coordenadas de la comida snk.len=3;//Longitud del cuerpo de la serpiente snk; .speed=350;? // Actualiza la longitud de la serpiente Tiempo, es decir, la velocidad de movimiento snk.x[0]=W/2+1;? // La abscisa de la cabeza de la serpiente debe ser un número par (porque W /2=39) snk.y[0]=H/2; //La cabeza de serpiente Coordenada vertical setColor(9, 0);? //Establece el color de impresión en azul claro con fondo negro gtxy(snk.x[0] ], snk.y[0]); ?printf("■"); ?// Imprimir cabeza de serpiente for(i=1;i ? [i]=snk.x[i-1]+2; ?snk.y[i] =snk.y[i-1]; gtxy(snk.x[i],snk. y[i]); ?printf("■"); ?//Imprimir cuerpo de serpiente p> } setColor(7, 0);? //Restaurar el texto blanco predeterminado y el fondo negro; p> } void keymove( )? //La operación clave mueve la serpiente { int key; if( kbhit( ) ) //La siguiente operación solo será se realiza si hay entrada de tecla { key=getch( ); ? if (key==224)? //Un valor de 224 significa que se ha presionado la tecla de dirección. A continuación, necesitamos obtener el valor de la clave nuevamente { key=getch( ); ? if(key ==72&&dir!=2)dir=1; //. 72 significa que se presiona la tecla de dirección hacia arriba ? if(key==80&&dir!=1)dir=2; //80 significa que se presiona la tecla de dirección hacia arriba Siguiente ? si(clave==75&a mp;&dir!=4)dir=3;? //75 significa a la izquierda ? if(key==77&&dir!=3)dir=4; //77 significa a la derecha } if (key==32) { while(1) if((key=getch( ))==32) break }? // 32 es la barra espaciadora, que se usa aquí para pausar } if (Flag==0)? //Si no has comido, realiza las siguientes operaciones para limpiar la cola de la serpiente { gtxy(snk .x[snk.len-1],snk.y[snk.len-1]); ?printf("? "); int i; 1; i > 0; i- -) ?//Cada sección de la cola de la serpiente almacena el valor de coordenadas de la sección anterior (excepto la cabeza de la serpiente) { snk.x[i]=snk.x[i -1]; ?snk.y[i]=snk.y[i -1]; } switch (dir)? //Determinar en qué dirección debe moverse la cabeza de la serpiente y obtener el último valor de coordenadas {caso 1: snk.y [0]--; break; ?//dir=1 debe moverse hacia arriba caso 2: snk.y[0]++; //dir=2 debe moverse hacia abajo p> caso 3: snk.x[0]-=2; break;? //dir=3 debe moverse hacia la izquierda caso 4: snk.x[0]+= 2; break;? //dir=4 debe moverse hacia la derecha} setColor(9, 0 ); gtxy(snk.x[0], snk.y[0]); /Imprimir cabeza de serpiente if (snk.x[0] == fod.x && snk.y[0 ] == fod.y)? //Si se ingiere comida, realice las siguientes operaciones { printf("\007"); snk.len++; puntuación += 100; snk.speed -= 5; Bandera = } //007 es la bandera else = 0; se come if(snk.speed<150) snk.speed= snk.speed+5;? //Código de trampa para evitar que la velocidad aumente infinitamente } void putFod( )? //Poner comida en { if (Flag == 1)? //If Realiza las siguientes operaciones después de comer comida para generar otra comida { while (1) { int i,n= 1; srand((unsigned)time(NULL)); //Inicializa el generador de números aleatorios srand() ?fod.x = rand( ) % (W - 4) + 2;? //Generar un valor de coordenada x dentro del marco del juego ?fod.y = rand( ) % (H - 2) + 1;? /Generar un valor de coordenada y dentro del marco del juego ?for (i = 0 ; i < snk.len; i++) ?//La comida generada aleatoriamente no puede estar en el cuerpo de la serpiente { if (fod.x == snk.x[i] &&fod.y == snk. y[i]) { n= 0; break;} } if (n && fod.x % 2 == 0) break; ?//n no es 0 y la abscisa es un número par, entonces la comida El valor de la coordenada se obtuvo con éxito } setColor(12, 0); gtxy(fod.x, fod.y); ●" ); ? //Imprimir comida con el cursor en las coordenadas obtenidas } return; } int Over( )? //Determinar si el juego ha terminado Function { int ?i; setColor(7, 0); gtxy(2,H+1); printf("Tecla de pausa: espacio."); alguna otra información gtxy( 2,H+2); printf("Puntuación del juego: %d",puntuación if (snk.x[0] == 0 || snk.x[0] == W) return 1 ;? //Cabeza de serpiente Toca los límites izquierdo y derecho if (snk.y[0] == 0 || snk.y[0] == H) return 1; //La cabeza de serpiente toca los límites superior e inferior for (i = 1; i < snk.len; i++) { if (snk.x[0] == snk.x[i] && snk.y[0] == snk.y[i]) devuelve 1; }? //La cabeza de la serpiente se toca a sí misma return 0; //Devuelve 0 cuando no toca el límite ni a sí misma } void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0) {? HANDLE? handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute( handle, ForeColor + BackGroundColor * 0x10); } //Función utilizada para configurar color