Snake el Juego xD (En C)

MrPaytoN

Soy estudiante de ASI (1er curso) y el aburrimiento en clase me ha echo hacer esto xD.

Necesito opiniones, si algo del código se puede mejorar o deberia añadir alguna cosa nueva al juego.
La ultima opción (La que pone 'Mostrar puntuaciones') es lo siguiente que haré pero aún no está implementado , no lo intenteis probar porque no funciona xD.

Os lo podeís bajar de aquí. http://www.megaupload.com/?d=7MHW6XR6 o de aquí http://d01.megashares.com/?d01=ca6bc52

Y podeis ver el código desde aquí. http://pastebin.com/m45bf79ad

Use el IDE Borland 5.02.

Gracias por vuestro tiempo.

Idontknow

Lo acabo de probar y va. No esta mal lo unico que no sabes donde estan las paredes puedes deducirlo pero exacto no.

PD: no tengo npi de programacion xD

LOc0

Está muy bien. Me ha recordado a http://www.megaupload.com/?d=7DZITOYD que para variar me dio pereza acabar. (No usé GOTOXY sino que lo metía todo en un array y lo imprimía, por lo que tiene bastante flickering). Mirando el código se nota que eres noob, pero todos empezamos por el principio (aunque bastantes no pasan de ahí). Good work.

Salu2 ;)

PD: #2 las paredes están en x=0, x=anchura, y=0, y=altura

MrPaytoN

Ummm en el nivel de dificultad fácil no hay paredes , con lo cual se 'atraviesa'. En el nivel de dificultad dificil son las paredes que aparecen.

Imperium

que currao, cuanto has tardado?

MrPaytoN

No sé , echalé unas 6-7 horas de probar código y unas 2-3 de pensar xD

Necesito que me digais que falta ,que sobra , que podria mejorar y si hay una parte del código que esta pobre xD mencionarmela y decirme como la podría cambiar para mejor.

Gracias a todos mis betatesters xDDDDDD.

reaven_666

Esta mu chulo, yo estoy en 1º de ASI tambien, pero yo doy c# y bueno como la clase va en general algo retrasada yo tb me puse a hacer jueguecillos, hice un pong y despues un snake, pero algo mas simple ya que quería dejarlo acabado por que ivan a seguir dando temario y tal... Pero bueno lo que mas me gusta del tuyo es lo de continuar por la parte opuesta del mapa.
Aunque el codigo de c parece algo mas chungo y dificil de entender a primera vista da mejores resultados para hacer jueguecillos que el de c#, por lo menos en consola.
Ahora estoy intentando hacer un pequeño roguelike, pero hacer un struct con lo simple que es en c++ me esta costando averiguar como hacerlo de forma similar en c#

Amazon

Ostia ke wapo xD

Lo unico que veo es que en facil, llevo un rato comiendo cosas y no me crece la serpiente.

A ver si un dia hago yo uno :$ xd

GoRRiLiNHo

q currao jajaj

Recuerdo que este juego me lo pase en mi nokia 5110 jaja ni años

SiMON17

Esta muy bien el juego jeje, lo que engancha estas cosas tan sencillas... xD

guilles

#9 en serio ese juego tiene final?

Ifz44

#11 Si, en 3 de sus 13261 versiones.

NeB1

Una sugerencia: Evita que aparezcan las pastillas (o caritas sonrientes pa comer) encima de la serpiente, porque me he dado cuenta de que intentan aparecer donde se encuentra la serpiente, y desaparecen y además no puntuan.

Narayan-Sama

#1 Muy bueno... Estudiando código a ver que cosas interesantes hay.

PiradoIV

¿No hay video en youtube para los que no tenemos windows? =(

1 mes después
Neolukas

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 :P

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

punkiriko

y a mí me acaban de poner un 2 en la segunda eval de programación 1ºASI.

Me enseñas cómo ostias funciona pasar por parámetro/referencia, estructuras y gestión de ficheros ? xD

No, en serio, increíble. Has hecho algo de programación anteriormente? Sólo con el ciclo de ASI ya lo llevas así ? Vaya crack!

4 meses después
ThisIsNas

Pausar vídeo en youtube

Mantener pulsada la tecla de la flecha izquierda

PROFIT! Snake en youtube xD

Usuarios habituales

  • Neolukas
  • PiradoIV
  • Narayan-Sama
  • NeB1
  • GoRRiLiNHo
  • reaven_666
  • MrPaytoN