#include #include #include #include //son los valores que arroja la funcion getchar(), para las teclas flecha #define ARRIBA 72 #define IZQUIERDA 75 #define DERECHA 77 #define ABAJO 80 #define ESC 27 //Variables predefinidas para el estado inicial int cuerpo[200][2]; int n = 1, tam = 10, dir = 3; int x = 10, y = 12; int xc = 30, yc = 15; int velocidad = 60; char tecla; void gotoxy(int x, int y) //se encarga de colocar el cursor en la columna y renglon deseado de la ventana { HANDLE hCon; COORD dwPos; dwPos.X = x; //guarda el valor del columna haciendo una referencia a una estructura dwPos.Y = y; //guarda el valor del renglon haciendo una referencia a una estructura hCon = GetStdHandle(STD_OUTPUT_HANDLE); // SetConsoleCursorPosition(hCon,dwPos); // } void OcultaCursor() { //Oculta el cursor al inicio del juego CONSOLE_CURSOR_INFO cci = {100, FALSE}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); } void pintar(){ //crea lo que veremos en la for(int i=2; i < 78; i++){ gotoxy (i, 3); printf ("%c", 205); gotoxy(i, 23); printf ("%c", 205); } for(int v=4; v < 23; v++){ gotoxy (2,v); printf ("%c", 186); gotoxy(77,v); printf ("%c", 186); } gotoxy (2,3); printf ("%c", 201); gotoxy (2,23); printf ("%c", 200); gotoxy (77,3); printf ("%c", 187); gotoxy(77,23); printf ("%c", 188); } void guardar_posicion(){ //Guarda el estado anterior de lo que se muestra en pantalla cuerpo[n][0] = x; cuerpo[n][1] = y; n++; if(n == tam) n = 1; } void dibujar_cuerpo(){ //dibuja el cuerpo del "snake" for(int i = 1; i < tam; i++){ gotoxy(cuerpo[i][0] , cuerpo[i][1]); printf("*"); } } void borrar_cuerpo(){ //borra el cuerpo para proceder al siguiente estado de la pantalla y gotoxy(cuerpo[n][0] , cuerpo[n][1]); printf(" "); } void teclear(){ //guarda la dirrecion en la que deseamos ir if(kbhit()){ tecla = getch(); //funcion que asigna un valor a la tecla que oprimimos switch(tecla){ case ARRIBA : if(dir != 2) dir = 1; break; case ABAJO : if(dir != 1) dir = 2; break; case DERECHA : if(dir != 4) dir = 3; break; case IZQUIERDA : if(dir != 3) dir = 4; break; } } } void comida() // genera alatoriamente la comida a seguir { if(x == xc && y == yc) { xc = (rand() % 73) + 4; yc = (rand() % 19) + 4; tam++; gotoxy(xc, yc); printf("%c", 4); } } bool game_over() //establece las condiciones en las que perdemos { if(y == 3 || y == 23 || x == 2 || x == 77) return false; //cuando chocamos con la limitrofe for(int j = tam - 1; j > 0; j--){ //cuando chocamos contra nosotros mismos (creo) if(cuerpo[j][0] == x && cuerpo[j][1] == y) return false; } return true; } int main() { OcultaCursor(); //oculta el cursosr pintar(); //crea lo que ve el usuario gotoxy(xc, yc); printf("%c", 4); //coloca el estado inicial while(tecla != ESC && game_over()) //generador de los estados con las condiciones que permiten que el juego continue { borrar_cuerpo(); guardar_posicion(); dibujar_cuerpo(); comida(); teclear(); teclear(); if(dir == 1) y--; //cambia la variable que controla la posicion de la cabeza de la serpiente if(dir == 2) y++; if(dir == 3) x++; if(dir == 4) x--; Sleep(velocidad); //marca la tasa de refresco del juego (rapides "del juego") } pintar(); return 0; //indica que el programa a acabado satisfactoriamente (sin errores) (al S.O.) }