Hola que hay, fijandome en parte al que ha hecho #1 he hecho mi propio Snake, es algo distinto pero en general viene a ser lo mismo, tampoco hay mucho margen XD.
Para la serpiente la he implementado con una cola, no se si será lo más eficaz pero tenia ganas ya de darle uso que para algo tiene que servir aprender a usarlas
La comida si que la he ido metiendo en un vector, y cuando pasa cierto tiempo la quito y pongo otra (o cuando se ha comido por la serpiente).
Bueno a lo que voy y que creo que alguien le puede interesar son las funciones que pertenecen a conio.h y que me empeñé en no querer usar, buscando y buscando por internet y toqueteando un poco encontre la alternativa a estas funciones usando la API de windows, para UNIX aún no he podido encontrar todas (y las que hay están sin comprobar).
Para quien no lo sepa poniendo #ifdef _WIN32 comprueba si es windows para compilarlo, si es que no pasa al #else, acaba al llegar al #endif .
gotoxy
// Colocar posicion (x,y)
void gotoxy(short x, short y) {
#ifdef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others.
HANDLE hConsoleOutput;
COORD Cursor_Pos = {x, y};
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput, Cursor_Pos);
#else
char essq[100]; /* String variable to hold the escape sequence */
char xstr[100]; /* Strings to hold the x and y coordinates */
char ystr[100]; /* Escape sequences must be built with characters */
/*
** Convert the screen coordinates to strings
*/
sprintf(xstr, "%d", x);
sprintf(ystr, "%d", y);
/*
** Build the escape sequence (vertical move)
*/
essq[0] = '\0';
strcat(essq, "\033[");
strcat(essq, ystr);
/*
** Described in man terminfo as vpa=\E[%p1%dd
** Vertical position absolute
*/
strcat(essq, "d");
/*
** Horizontal move
** Horizontal position absolute
*/
strcat(essq, "\033[");
strcat(essq, xstr);
/* Described in man terminfo as hpa=\E[%p1%dG */
strcat(essq, "G");
/*
** Execute the escape sequence
** This will move the cursor to x, y
*/
printf("%s", essq);
#endif
}
Clrscr
// Borrar pantalla
void borrar_pantalla(void) {
#ifdef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others.
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {0, 0};
DWORD count;
GetConsoleScreenBufferInfo(hStdOut, &csbi);
FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
SetConsoleCursorPosition(hStdOut, coord);
#else
clear();
#endif
}
Color (para escribir texto en color)
#define RED = "\e[31m"
#define GREEN = "\e[32m"
#define YELLOW = "\e[33m"
#define BLUE = "\e[34m"
#define MAGEN = "\e[35m"
#define CY = "\e[36m"
#define WHITE = "\e[37m"
// Estructuras
enum colores{AZUL=0,VERDE=1,ROJO=2,GRIS=3,BLANCO=4,AMARILLO_SUAVE=5,AMARILLO=6,CYAN_SUAVE=7,CYAN=8,MAGENTA_SUAVE=9,MAGENTA=10,AZUL_SUAVE=11,VERDE_SUAVE=12,ROJO_SUAVE=13};
//...
// Color del texto
int Color(int col)
{
#ifdef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others.
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
#endif
switch(col)
{
#ifdef _WIN32
case AZUL_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);
break;
#endif
case AZUL:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
#else
printf(BLUE);
#endif
break;
#ifdef _WIN32
case VERDE_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
break;
#endif
case VERDE:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
#else
printf(GREEN);
#endif
break;
#ifdef _WIN32
case ROJO_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
break;
#endif
case ROJO:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
#else
printf(RED);
#endif
break;
#ifdef _WIN32
case GRIS:
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
break;
#endif
case BLANCO:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
#else
printf(RED);
#endif
break;
#ifdef _WIN32
case AMARILLO_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED);
break;
#endif
case AMARILLO:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
#else
printf(YELLOW);
#endif
break;
#ifdef _WIN32
case CYAN_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE);
break;
#endif
case CYAN:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
#else
printf(CY);
#endif
break;
#ifdef _WIN32
case MAGENTA_SUAVE:
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE);
break;
#endif
case MAGENTA:
#ifdef _WIN32
SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
#else
printf(MAGEN);
#endif
default:
return 1;
}
return 0;
}
kbhit
BOOL hayTecla(void)
{
HANDLE teclado; // Manipulador del buffer del teclado.
DWORD leidos; // Cantidad de registros de teclado leidos.
DWORD i; // Variable contador del ciclo for.
int contador = 0; // Contador de eventos.
INPUT_RECORD buffer[128]; // Vector de registros de entrada de teclado
// Caputrar el standard input handle.
teclado = GetStdHandle(STD_INPUT_HANDLE);
// Ciclo de espera por el evento de tecla presionada
PeekConsoleInput(teclado, // manipulador del buffer
buffer, // buffer a leer
128, // tamanio del buffer
&leidos // cantidad de registros leidos
);
// verificar los eventos en busca de eventos de teclado.
for (i = 0; i < leidos; i++)
{
if(buffer[i].EventType==KEY_EVENT && buffer[i].Event.KeyEvent.bKeyDown )
{
return TRUE;
}
}
return FALSE;
}
getch (para leer la tecla pulsada)
WORD leerTecla(void) {
HANDLE teclado; // Manipulador del buffer del teclado.
DWORD leidos; // Cantidad de registros de teclado leidos.
DWORD i; // Variable contador del ciclo for.
int contador = 0; // Contador de eventos.
WORD tecla=0; // Variable para la tecla leida.
INPUT_RECORD buffer[128]; // Vector de registros de entrada de teclado
// Caputrar el standard input handle.
teclado = GetStdHandle(STD_INPUT_HANDLE);
// Ciclo de espera por el evento de tecla presionada
while (contador++ <= 100)
{ // Esperar por un evento.
ReadConsoleInput(teclado, // manipulador del buffer
buffer, // buffer a leer
128, // tamanio del buffer
&leidos // cantidad de registros leidos
);
// verificar los eventos en busca de eventos de teclado.
for (i = 0; i < leidos; i++)
{
if(buffer[i].EventType==KEY_EVENT && buffer[i].Event.KeyEvent.bKeyDown )
{
tecla = buffer[i].Event.KeyEvent.wVirtualKeyCode;
if(tecla==TECLA_enie) tecla=165; // Adapta la tecla ñ.
return tecla;
}
}
}
}
Archivo muy interesante para el trato del teclado y que he usado, http://pastebin.com/QRrdsyHc
Ahora estaba intentando pasarlo a Unix pero no se si lo terminaré XD Dejo un video demostrativo del juego aunque bueno como ya he dicho es parecido al de #1
Creo que no puedo insertar videos asi que os dejo el link
http://www.youtube.com/watch?v=pW5o4hFsy8U