¿Cómo utilizar el código fuente de Snake en lenguaje C?
El código fuente de Snake en lenguaje C debe ser compilado en un archivo EXE por el compilador C/C correspondiente antes de poder ejecutarse.
Dado que el sistema operativo que utilizamos habitualmente es el sistema Windows, y el compilador C/C más utilizado en este sistema es el compilador VC, la versión comúnmente utilizada en colegios y universidades sigue siendo VC 6.0. A continuación se muestra Take VC 6.0 para ilustrar el proceso de compilación:
1. Abra el código Snake a través del submenú "Abrir" en el menú "Archivo" en VC 6.0
2. 6.0 Compile el código Snake a través del submenú "Compilar xxxx.xx" en el menú "Construir"
3. Ejecute el submenú "Ejecutar xxxx.exe" en el menú "Construir" en el programa VC 6.0 Snake.
Adjunto: código fuente de C/C Snake que se puede ejecutar en el entorno VC 6 (sin derechos de autor, escrito por usted mismo, bienvenido a modificarlo y copiarlo a voluntad) /*
C/ C Snake Game, zjlj, 2015.3.16
*/
#define?DEBUG?0?//¿Cuando el programa está en la etapa de depuración?DEBUG is?1
#includelt;iostreamgt;
#includelt;windows.hgt;
#includelt;time.hgt;
#includelt;conio .hgt ;
usando?namespace?std;
void?readini(FILE?**fphead,?int?*score,?char?*argv[])?// Crear o abra un archivo ini correspondiente al archivo en ejecución y lea el registro más alto
{ char?filename[200], *pfilename; int?flag=-1, i;
strcpy( nombre de archivo, argv[0]);
for(i=0; nombre de archivo[i]!='\0'; i ) { if?('.'==nombre de archivo[i]) bandera= 1; } if(1==bandera) { nombre de archivo[i-1]='i';
nombre de archivo[i-2]='n'; ; } else { nombre de archivo[i]='.'; nombre de archivo[i 1]='i'; nombre de archivo[i 2]='n';
nombre de archivo[i 4]='\0' } for(;nombre de archivo[i]!='\\'amp;amp;igt;=0;i--)pnombre de archivo=amp ;nombre de archivo [i];
if?(?(*fphead=fopen(pfilename,?"rb "))==NULL) {
if?(?(*fphead =fopen (pfilename,?"wb "))==NULL) {
printf("No se puede crear o abrir \"s\" archivo\n", pfilename);
system( "pausa");
salir(0); }
} else { fread(score, sizeof(int), 1, *fphead }
}
void?writeini(FILE?**fphead,?int?*puntuación,?char?*arg
v[])?//Abra un archivo ini correspondiente al archivo en ejecución y escriba el registro más alto
{ char?filename[200], *pfilename; int?flag=-1, i; p>
{ char?nombre de archivo[200], *pnombre de archivo; int?flag=-1, i;
p>strcpy(nombre de archivo, argv[0]);
for(i=0; nombre de archivo[i]!='\0'; i ) { if?('.'== nombre de archivo[i])bandera=1 } if(1==bandera) { nombre de archivo[i] -1]='i';
nombre de archivo[i-2]='n'; nombre de archivo[i -3]='i'; else { nombre de archivo[i]='.'; [i 1]='i'; nombre de archivo[i 2]='n';
nombre de archivo[i 3]='i';
nombre de archivo[i 4]=' \0'; } for(;nombre de archivo[i]!='\\'amp;amp;igt;=0;i- -)pfilename=amp;nombre de archivo[i];
if?( ?(*fphead=fopen(pfilename,?"wb "))==NULL) { printf("¡No se puede escribir\"s \"Archivo, disco protegido contra escritura!\n", pfilename
system("pausa");
salir(0); } else { rewind(*fphead); fwrite(puntuación, tamaño de(int), 1, *fphead); }
}
void?gotoxy(int?x, int?y)/ /Posicionamiento del cursor, la función de posicionamiento del cursor SetConsoleCursorPosition es la posición de la esquina superior izquierda es 0, luego 0 se extiende izquierda y abajo
{
COORD?pos;
pos X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void?color(int?a)//Función de color
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
void?Refresh(int?q[][22], ?int? grado, ?int?gamespeed, ?int?length, int?score)?//?Salida del tablero de serpiente
{ int?i,j; for(i=0;ilt;22;i) { for(j=0;jlt;22;j) {
if(q[i][j] ==0)//Salir el tablero de ajedrez en blanco
{
gotoxy(i,j);
color(11);
coutlt;lt;"■";
}
if(q[i][j]==1||q[i][j]==2)// Salida de paredes de tablero de ajedrez
{?
gotoxy (i,j);
color(11);
coutlt;lt;" □";<
/p>
}
if(q[i][j]==3)//Salida cabeza de serpiente
{?
gotoxy( i , j);
color(14);
coutlt; "★"; [ i][j]==4)//Salida del cuerpo de la serpiente
{?
gotoxy(i, j);
color(12);
coutlt;lt;"◆";
} if(q[i][j]==5)//Salida de la fruta
{? p>
gotoxy(i,j);
color(12);
coutlt;lt;"●";
} } if( i==0)?cout?lt;lt;?"\t************************" si(i==1) )?cout ?lt;lt;?"\tEl nivel es: "?lt;lt;?grade;//Mostrar calificación si(i==3)?cout?lt;lt;?"\tAvanzar el tiempo automáticamente"; if( i==4)?cout?lt;lt;?"\tEl intervalo es: "?lt;lt;?gamespeed?lt;lt;?"ms";//Mostrar tiempo if(i==6) ?cout ?lt;lt;?"\tPuntuación histórica más alta: "?lt;lt;?score?lt;lt;?"point" if(i==7)?cout?lt;lt;?"\t Su puntuación actual es: "?lt;lt;?(longitud (grado-1)*8)*10?lt;lt;?"punto"; if(i==8)?cout?lt;lt;?" \t************************"; if(i==9)?cout?lt;lt;?"\tDescripción del juego: "; if ( i==10)?cout?lt;lt;?"\t(1)Utilice las teclas de dirección del teclado pequeño para controlar"; if(i==11)?cout?lt;lt;?"\tDirección del movimiento de la cabeza de serpiente ; "; if(i==12)?cout?lt;lt;?"\t(2) Cada vez que la serpiente come una fruta, el cuerpo de la serpiente"; if(i==13)?cout?lt;lt ;?"\t Agregar una sección; "; if(i==14)?cout?lt;lt;?"\t(3) Serpiente se muerde o golpea una pared"; ?lt;lt ;?"\tEl juego ha terminado.
"; si(i==18)?cout?lt;lt;?"\t**********************"; si(i==19) )?cout?lt;lt;?"\tTarea de lenguaje C/C:"; if(i==20)?cout?lt;lt;?"\tzjlj, 2015.03.16?"; p>}
int?main(int?argc,?char?*argv[]){
int?tcsQipan[22][22];?//?Codicioso El el tablero de serpiente es una matriz bidimensional (como 22*22, incluidas las paredes)
int?i,j,score,directiontemp; FILE?*fpini;//*fpini?information file readini(amp ;fpini ,?amp;score,?argv);//Leer el registro más alto del archivo ini if?(scorelt;0)//El puntaje más alto es menor que cero y se establece en cero, el archivo inicial será negativo puntuación=0; mientras(1) { para(i=1;ilt;=20;i)
para(j=1;jlt;=20;j)
tcsQipan [i][j]=0 ; //Las coordenadas correspondientes del tablero Snake están marcadas con la marca 0 en la parte en blanco del medio para (i=0; ilt; =21; i )
tcsQipan [0][i]?=?tcsQipan[21 ][i]?=?1;?//Las coordenadas correspondientes del tablero Snake están marcadas en las paredes superior e inferior 1 para(i=1;ilt;=20 ;i)
tcsQipan[i][ 0]?=?tcsQipan[i][21]?=?2;?//Las coordenadas correspondientes del tablero Snake están marcadas con los signos de la izquierda y paredes derechas 2 int?tcsZuobiao[2][500];?//La matriz de coordenadas de la serpiente for(i=0;?ilt;4;?i) {
tcsZuobiao[0][ i]?=?1; //coordenadas x del cuerpo de la serpiente y la cabeza de la serpiente
tcsZuobiao[1][i]?=?i ?1? int?head?=?3, tail?=?0; //Compensaciones de matriz que marcan la cabeza y la cola de serpiente for(i=1;ilt;=3;i)
tcsQipan[1][i ]=4; //Cuerpo de serpiente tcsQipan[1][4]=3; //Cabeza de serpiente int?x1 ,?y1;//?Producir aleatoriamente fruta srand(time(0));//Establecer semilla aleatoria do {
x1=rand()20 1;
y1=rand ()20 1; } while(tcsQipan[x1][y1]!=0); no se reproduce en el espacio en blanco tcsQipan[x1][y1]=5; //Las coordenadas correspondientes del tablero Snake están marcadas El signo de la fruta 5 color(12); \t\t\t\t¿El juego de la serpiente está a punto de comenzar?!"lt;lt;endl;//¿Listo para empezar long?start, starttemp ; int?grade?=?1,?length?=?4;? //Establece el grado inicial y la longitud inicial de la serpiente int?gamespeed?=?500;?//Establece el intervalo de tiempo de avance inicial for(i=3;igt ;=0;i--) {
inicio=reloj();
mientras(reloj()-startlt;=1000);
sistema( "cls")
;
if(igt;0)
cout?lt;lt;?"\n\n\t\t\t\tIngrese la cuenta regresiva: "?lt;lt; i?lt;lt;?endl;?//Visualización de cuenta atrás
else
Refresh(tcsQipan, grado, velocidad de juego, duración, puntuación);?//Visualización inicial del tablero de ajedrez} int ?timeover=1, otherkey=1; //Tiempo de espera de inicialización y parámetro de juicio clave char?direction?=?77;?//?Establezca la situación inicial para moverse hacia la derecha int?x=tcsZuobiao[0][head] , y= tcsZuobiao[1][head]; //Guarda las coordenadas de la cabeza de serpiente en la variable x, y while(1)//Ejecuta un juego {
start?=?clock();
while((timeover=((starttemp=clock())-startlt;=gamespeed))amp;amp;!kbhit() // Termina si se presiona una tecla o el tiempo excede el intervalo de tiempo de avance automático.
if(direction==72||direction==80||direction==75?||direction==77)
directiontemp=direction //Conservar la última vez; Teclas de dirección
//starttemp=gamespeed start-starttemp;//Mantener el tiempo de permanencia
if(timeover)
{
# if?(DEBUG==1)
dirección?=?getch(); //Código de depuración #else
if((dirección?=getch())==- 32 ) dirección?=?getch();
#endif
} #if?(DEBUG==1)//Código de depuración
start=clock ( );
mientras(reloj()-startlt;=2000);
gotoxy(24,4);
cout?lt;lt;? " \tClave código ASCII "lt;lt;(int)direcciónlt;lt;""lt;lt;endl; #endif
if(!(dirección==72||dirección==80|| dirección==75?||dirección==77))
{ otherkey=0; //La clave no es la tecla de dirección, otherkey está establecida en 0
}
else
{ otherkey=1; //?La clave es la tecla de dirección, otherkey se establece en 1
} if(direction==72?amp ;amp;?directiontemp== 80) //Ignorar las teclas de dirección inversa
{
direction=32; otherkey=0; //start?=?clock(); p>
// while(clock()-startlt;=starttemp);
}
else?if(direction==80?amp;amp;?directiontemp= =72)
{
dirección
tion=32; //Establece la clave como una clave no direccional otherkey=0; //La clave es una clave no direccional, otherkey está configurada en 0
//?start?=? clock();
// while(clock()-startlt;=starttemp);//tiempo de espera de compensación
}
else?if(dirección ==75?amp;amp ;?directiontemp==77)
{
direction=32; otherkey=0; //start?=?clock();
// while (clock()-startlt;=starttemp);
}
else?if(direction==77?amp;amp;?directiontemp== 75)
{
dirección=32; otherkey=0; //inicio?=?reloj();
//mientras(reloj()- startlt;=starttemp);
}
switch(direction)//Juzgar teclas de dirección
{ case?72:?x=?tcsZuobiao[0] [cabeza]-1;? y=?tcsZuobiao[1][cabeza];romper;?//?Up case?80:?x=?tcsZuobiao[0][cabeza] 1;?y=?tcsZuobiao[1] [cabeza];romper;? //Caso abajo?75:?x=?tcsZuobiao[0][cabeza];?y=?tcsZuobiao[1][cabeza]-1;romper;?//?Caso izquierdo? 77:?x= ?tcsZuobiao[0][cabeza];?y=?tcsZuobiao[1][cabeza] 1; romper;?//?right default:?break;
}
if(x==0?||?x==21?||y==0?||?y==21)?//?La cabeza de la serpiente golpea la pared y el juego termina p>
{ ? gotoxy(22, 12); cout?lt;lt;?"\t¡El juego ha terminado!"?lt;lt;?endl; if(scoregt;=(length (grado-1)* 8)*10)/ /Juzga si el récord se ha batido {gotoxy(10,7); color(12); cout?lt;lt;?"¿No se pudo superar el nivel? ¡Vamos!"?lt;lt; ?endl; fclose(fpini); //Cerrar archivo ini} else {gotoxy(10,7); color(12); cout?lt;lt;?"Felicitaciones por batir el récord"?lt;?endl; puntuación=(longitud (grado-1)*8)* 10; writeini(amp;fpini,?amp;score,?argv); //El registro más alto escrito en el archivo ini} gotoxy(23, 12); p>
cout?lt;lt;?" Presiona Presiona Enter para reiniciar, presiona ESC para salir del juego "?lt;lt;?endl;//Se muestra el mensaje break;//Salir del juego
}
if(tcsQipan [x][y]!=0amp;amp;!(x==x1amp;amp;
y==y1)amp;amp;tcsQipan[x][y]!=3)?//La cabeza de la serpiente toca el cuerpo de la serpiente, finalizando el juego
{gotoxy(22,12); ?lt ;lt;?"\t¡El juego ha terminado!"?lt;lt;?endl; if(scoregt;=(length (grade-1)*8)*10)//Determina si el récord se ha batido { gotoxy (10, 7 ); color(12); cout?lt;lt; "¿No pudo pasar el nivel? ¡Vamos!"?lt;?endl; fclose(fpini); { gotoxy(10, 7); color(12); cout?lt;lt;?"Felicitaciones por batir el récord"?lt;lt;?endl; puntuación=(length (grado-1)*8)*10; writeini(amp;fpini,?amp; score,?argv); //El registro más alto escrito en el archivo ini} gotoxy(23, 12); cout?lt;lt;?"Presione Enter para reiniciar, presione ESC para salir el juego"?lt;lt;?endl ; //Se muestra un aviso de pausa; //Salir del juego
}
/*
El algoritmo central de el juego comienza
*/
if(x==x1?amp;amp;?y==y1)?//?Come la fruta y suma 1 a la longitud
{ length?; if (lengthgt;=8)//Recalcular la longitud si la longitud es mayor o igual a 8, y agregar 1 al nivel {length?-=?8;//Recalcular the length grade?;//Agrega 1 al nivel if(gamespeedgt;50)//Controla el máximo La velocidad rápida es 50
gamespeed?=?550?-?grade?*?50;? //Cambiar el intervalo de tiempo de avance automático} tcsQipan[x][y]=?3; //Gludgy Las coordenadas correspondientes del tablero de ajedrez de la serpiente ahora se cambian a la marca de la cabeza de la serpiente 3 tcsQipan[tcsZuobiao[0][head]] [tcsZuobiao[1][head]]?=?4; // Las coordenadas correspondientes del tablero de ajedrez de la serpiente codiciosa se cambian a la marca de la cabeza de la serpiente. Marca del cuerpo 4 head?=?(head 1)400; desde cruzar el límite tcsZuobiao[0][head]?=?x; // La coordenada x de la cabeza de serpiente tcsZuobiao[1][head]?=?y // La coordenada y de la cabeza de serpiente do // Aleatoriamente produce fruta { x1=rand()20 1; y1=rand()20 1; } while(tcsQipan[x1][y1]!=0); // Si no se reinicia en el espacio en blanco, la fruta se produce tcsQipan. [x1][y1]=5; //Las coordenadas correspondientes del tablero Snake están marcadas con el símbolo de la fruta 5 gotoxy(22, 12); cout?lt;lt;?"\t¡El juego está en progreso!"?lt; ;lt;?endl; Refresh(tcsQipan, grado, velocidad del juego, duración, puntuación);
}
else?//?No comas la fruta
{ ? if(otherkey) { tcsQipan?[tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0; tail=(tail 1)400; //Evita que la matriz cruce el límite tcsQipan ?[tcsZuobiao[0][ cabeza]][tcsZuo
biao[1][head]]=4; head=(head 1)400; //Evita que la matriz cruce el límite tcsZuobiao[0][head]=x; //La coordenada x de la cabeza de serpiente tcsZuobiao[1] ][head]=y; // La coordenada y de la cabeza de serpiente tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3; ;?"\tJuego en progreso!" ?lt;lt;?endl; Actualizar(tcsQipan, grado, velocidad del juego, duración, puntuación } else { gotoxy(22, 12); ¡el juego está en pausa!"?lt;lt ;?endl; }
}
/*
Fin del algoritmo central cuando el juego se está ejecutando p>
*/
}
while(1)
{ while(!kbhit()); if((dirección?=getch( ))==13)//Presiona la tecla Enter Inicia el siguiente descanso if(direction?==27)//Presiona ESC para salir del juego exit(0);
}
system("cls");//Borrar reinicio de pantalla} return?0;
}