#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.)
}