1 #include <windows.h>
2 #include <iostream>
3 #include <stdlib.h>
4 #include <conio.h>
5
6 //son los valores que arroja la funcion getchar(), para las teclas flecha
7 #define ARRIBA 72
8 #define IZQUIERDA 75
9 #define DERECHA 77
10 #define ABAJO 80
11 #define ESC 27
12
13
14
15 //Variables predefinidas para el estado inicial
16 int cuerpo[200][2];
17 int n = 1, tam = 10, dir = 3;
18 int x = 10, y = 12;
19 int xc = 30, yc = 15;
20 int velocidad = 60;
21 char tecla;
22
23 void gotoxy(int x, int y) //se encarga de colocar el cursor en la columna y renglon deseado de la ventana
24 {
25 HANDLE hCon;
26 COORD dwPos;
27
28 dwPos.X = x; //guarda el valor del columna haciendo una referencia a una estructura
29 dwPos.Y = y; //guarda el valor del renglon haciendo una referencia a una estructura
30 hCon = GetStdHandle(STD_OUTPUT_HANDLE); //
31 SetConsoleCursorPosition(hCon,dwPos); //
32 }
33 void OcultaCursor() { //Oculta el cursor al inicio del juego
34 CONSOLE_CURSOR_INFO cci = {100, FALSE};
35
36 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
37 }
38 void pintar(){ //crea lo que veremos en la
39 for(int i=2; i < 78; i++){
40 gotoxy (i, 3); printf ("%c", 205);
41 gotoxy(i, 23); printf ("%c", 205);
42 }
43 for(int v=4; v < 23; v++){
44 gotoxy (2,v); printf ("%c", 186);
45 gotoxy(77,v); printf ("%c", 186);
46 }
47 gotoxy (2,3); printf ("%c", 201);
48 gotoxy (2,23); printf ("%c", 200);
49 gotoxy (77,3); printf ("%c", 187);
50 gotoxy(77,23); printf ("%c", 188);
51 }
52 void guardar_posicion(){ //Guarda el estado anterior de lo que se muestra en pantalla
53 cuerpo[n][0] = x;
54 cuerpo[n][1] = y;
55 n++;
56 if(n == tam) n = 1;
57 }
58 void dibujar_cuerpo(){ //dibuja el cuerpo del "snake"
59 for(int i = 1; i < tam; i++){
60 gotoxy(cuerpo[i][0] , cuerpo[i][1]); printf("*");
61 }
62 }
63 void borrar_cuerpo(){ //borra el cuerpo para proceder al siguiente estado de la pantalla y
64 gotoxy(cuerpo[n][0] , cuerpo[n][1]); printf(" ");
65 }
66 void teclear(){ //guarda la dirrecion en la que deseamos ir
67 if(kbhit()){
68 tecla = getch(); //funcion que asigna un valor a la tecla que oprimimos
69 switch(tecla){
70 case ARRIBA : if(dir != 2) dir = 1; break;
71 case ABAJO : if(dir != 1) dir = 2; break;
72 case DERECHA : if(dir != 4) dir = 3; break;
73 case IZQUIERDA : if(dir != 3) dir = 4; break;
74 }
75 }
76 }
77 void comida() // genera alatoriamente la comida a seguir
78 {
79 if(x == xc && y == yc)
80 {
81 xc = (rand() % 73) + 4;
82 yc = (rand() % 19) + 4;
83
84 tam++;
85 gotoxy(xc, yc); printf("%c", 4);
86 }
87 }
88 bool game_over() //establece las condiciones en las que perdemos
89 {
90 if(y == 3 || y == 23 || x == 2 || x == 77) return false; //cuando chocamos con la limitrofe
91 for(int j = tam - 1; j > 0; j--){ //cuando chocamos contra nosotros mismos (creo)
92 if(cuerpo[j][0] == x && cuerpo[j][1] == y)
93 return false;
94 }
95 return true;
96 }
97 int main()
98 {
99 OcultaCursor(); //oculta el cursosr
100
101 pintar(); //crea lo que ve el usuario
102 gotoxy(xc, yc); printf("%c", 4); //coloca el estado inicial
103
104 while(tecla != ESC && game_over()) //generador de los estados con las condiciones que permiten que el juego continue
105 {
106 borrar_cuerpo();
107 guardar_posicion();
108 dibujar_cuerpo();
109 comida();
110 teclear();
111 teclear();
112
113 if(dir == 1) y--; //cambia la variable que controla la posicion de la cabeza de la serpiente
114 if(dir == 2) y++;
115 if(dir == 3) x++;
116 if(dir == 4) x--;
117
118 Sleep(velocidad); //marca la tasa de refresco del juego (rapides "del juego")
119 }
120 pintar();
121 return 0; //indica que el programa a acabado satisfactoriamente (sin errores) (al S.O.)
122 }
123
Enlace
El enlace para compartir es: