Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema Snake

Estas en el tema de Problema Snake en el foro de C/C++ en Foros del Web. Buenas, hoy he empezado a crear un pequeño proyecto en c, se trata del clasico juego Snake. Lo estoy haciendo en la consola con caracteres ...
  #1 (permalink)  
Antiguo 19/02/2012, 13:07
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 4 meses
Puntos: 46
Problema Snake

Buenas, hoy he empezado a crear un pequeño proyecto en c, se trata del clasico juego Snake. Lo estoy haciendo en la consola con caracteres y tengo un problema.

Cada vez que se mueve el "snake" tengo que volver a imprimir toda la cuadricula en la cual esta y queda bastante feo, hay alguna manera de imprimir simplemente aquellos lugares donde esta el snake y no tener que borrar la pantalla entera y volverla a imprimir?

Saludos
  #2 (permalink)  
Antiguo 20/02/2012, 15:41
Avatar de c61l65b  
Fecha de Ingreso: enero-2012
Ubicación: Monterrey, Nuevo Leon, Mexico, Mexico
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Problema Snake

¿que estas usando?, busca sobre la librería ncurses.
  #3 (permalink)  
Antiguo 05/07/2014, 04:44
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Aprovecho este tema para hacer mi pregunta, tambien sobre el snake.

Estoy intentando imprimir en pantalla la comida usando en el cuerpo del programa una instancia a la funcion (de la clase comida) que genera las coordenadas donde se imprimira la comida, pero no aparece en pantalla. El movimiento de la serpiente y si esta toca las paredes funciona perfecto. Haver si veis algo que yo no veo en la funcion "muestra_comida" de la clase "Comida":

Código C++:
Ver original
  1. // snake.cpp: define el punto de entrada de la aplicación de consola.
  2. #include "stdafx.h"
  3.  
  4. /*Desarrollo del juego
  5. Funciones                Clases
  6.  - pintarParedes         GUI
  7.  - tocar_Paredes         GUI
  8.  - puntuacion            GUI
  9.  - aumentarVelocidad     GUI
  10.  - borrar_serpiente      Serpiente
  11.  - guardar_posicion      Serpiente
  12.  - pintar_serpiente      Serpiente
  13.  - manejo                Serpiente
  14.  - muestra_comida        Comida
  15. */
  16.  
  17. //Incluyendo librerias
  18. #include <cstdlib>
  19. #include <iostream>  //Imprime en pantalla
  20. #include <windows.h> //Definir funcion gotoxy
  21. #include <conio.h>
  22. #include <stdlib.h>  //Para el uso del randon
  23.  
  24. //Incluyendo clases
  25. #include "GUI.h"
  26. #include "Serpiente.h"
  27. #include "Comida.h"
  28.  
  29. //Codigo ASCII para salir del juego
  30. #define ESC 27
  31. ;
  32.  
  33. using namespace std;
  34.  
  35. int main(int argc, char *argv[])
  36. {
  37.     //Declaracion de variables para acceder a sus correspondientes clases
  38.     Gui interfaz;
  39.     Serpiente snake;
  40.     Comida food;
  41.    
  42.     //Variables
  43.     snake.tecla = 'p';    //es una asignacion? es una llamada a una fuincion ?
  44.  
  45.     //snake.serpiente[0][0] = 0;
  46.  
  47.     //Previo al dos
  48.     //asignar valores iniciales a todo !!!!!!!!!
  49.     snake.x = 37;
  50.     snake.y = 13;
  51.  
  52.     //Mostrar interfaz
  53.     interfaz.pintarParedes();    
  54.     snake.pintar_serpiente();
  55.  
  56.     //2. Ejecutar juego
  57.     while((snake.tecla != ESC) && (!(interfaz.tocar_Paredes(snake.x, snake.y)))){
  58.           snake.borrar_serpiente();
  59.  
  60.           //INPUT
  61.           //Duplico la llamada a la funcion "anejo" para usar dos teclas a la vez
  62.           snake.manejo();
  63.           snake.manejo();
  64.  
  65.           //UPDATE
  66.           if (snake.movimiento == 1) snake.y--;
  67.           if (snake.movimiento == 2) snake.y++;
  68.           if (snake.movimiento == 3) snake.x++;
  69.           if (snake.movimiento == 4) snake.x--;
  70.          
  71.           //REDRAW
  72.           //snake.guardar_posicion();
  73.           snake.pintar_serpiente();
  74.        
  75.           //interfaz.puntuacion();
  76.           //interfaz.aumentarVelocidad();
  77.           food.muestra_comida();
  78.        
  79.           Sleep (800);
  80.                
  81.           }//Fin del while
  82.    
  83.     system("PAUSE > null"); //Indicando "Pause > null", quitamos el mensaje de presionar para continuar
  84.     return EXIT_SUCCESS;
  85. }

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Comida{
  6.       public:
  7.              //Constructor
  8.              Comida();
  9.  
  10.              //Atributos
  11.              int comida_X;
  12.              int comida_Y;
  13.              
  14.              //Operaciones
  15.              void muestra_comida();
  16.              
  17.       private:
  18.       };

Código C++:
Ver original
  1. #include "StdAfx.h"
  2. #include "Comida.h"
  3. #include <windows.h>
  4.  
  5. Comida::Comida(){//Constructor
  6.      x = 0;
  7.      y = 0;
  8.      comida_X = 0;
  9.      comida_Y = 0;
  10.      
  11.      }
  12.      
  13. void gotoxy_Comida(int x, int y){
  14.      HANDLE hCon;
  15.      COORD dwPos;
  16.      
  17.      dwPos.X = x;
  18.      dwPos.Y = y;
  19.      hCon = GetStdHandle (STD_OUTPUT_HANDLE);
  20.      SetConsoleCursorPosition(hCon, dwPos);
  21.      }
  22.  
  23. void Comida::muestra_comida(){
  24.      comida_X = 30;
  25.      comida_Y = 15;
  26.      
  27.      //if ((x == comida_X) && (y == comida_Y)){
  28.            comida_X = (rand()%73) + 4;
  29.            comida_Y = (rand()%19) + 4;
  30.            
  31.            gotoxy_Comida(comida_X, comida_Y);
  32.            cout << "\xB8";
  33.            
  34.            //}//Fin del if
  35.      }//Fin de funcion muestra_comida()
  #4 (permalink)  
Antiguo 05/07/2014, 11:34
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Cita:
Iniciado por L3m0n Ver Mensaje
.................................................. ...
Cada vez que se mueve el "snake" tengo que volver a imprimir toda la cuadricula en la cual esta y queda bastante feo, hay alguna manera de imprimir simplemente aquellos lugares donde esta el snake y no tener que borrar la pantalla entera y volverla a imprimir?
Si estas en Windows puedes usar la API con las funciones gotoxy y color.

Te paso un código de muestra donde incluso cambio el tamaño de la consola:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #define FIL 7
  6. #define COL 8
  7.  
  8. void color (int n);
  9. int gotoxy(int x, int y);
  10.  
  11. int main (){
  12.  
  13.   int i=0,j=0,fil=1,col=1;
  14.   system("MODE 60,35");
  15.   char a[7][8];
  16.   system ("pause");
  17.   system ("cls");
  18.   for (i=0;i<15;i++){
  19.     gotoxy (10+2*i,10);
  20.     printf ("*" );
  21.   }
  22.   Sleep (2000);
  23.   for (i=0;i<15;i++){
  24.     Sleep (250);
  25.     gotoxy (10+2*i,10);
  26.     printf ("X" );
  27.   }
  28.  
  29.  
  30.  
  31.   puts("\n\n");
  32.   system ("pause");
  33.   system ("cls");
  34.   for (i=0;i<27;i++)
  35.     printf ( "* ");
  36.   putchar ('\n');
  37.   for (i=0;i<27;i++){
  38.     Sleep(150);
  39.     gotoxy (2*i,0);
  40.     printf ( "X ");
  41.   }
  42.   for (i=0;i<27;i++){
  43.     Sleep(100);
  44.     gotoxy (2*i,4);
  45.     printf ( "X");
  46.   }
  47.   for (i=0;i<6;i++){
  48.     for (j=0;j<6;j++){
  49.       gotoxy (2*j+6,i+6);
  50.       printf ( "* ");
  51.     }
  52.   }
  53.   for (i=0;i<6;i++){
  54.     for (j=0;j<6;j++){
  55.       Sleep(250);
  56.       gotoxy (2*j+6,i+6);
  57.       printf ( "X");
  58.     }
  59.   }
  60.   putchar ('\n');
  61.   system ("pause");
  62.   system ("cls");
  63.   for (i=0;i<7;i++){
  64.     a[i][7]='\0';
  65.     for (j=0;j<7;j++){
  66.       if(j>=i-1 && j<i+1 && j>0 && j<6 && i<6)
  67.         a[i][j]='X';
  68.       else if(i==0 || j==0 || i==6 || j==6 )
  69.         a[i][j]='*';
  70.       else
  71.         a[i][j]='0';
  72.     }
  73.   }
  74.   putchar ('\n');
  75.   for (i=0;i<7;i++){
  76.     a[i][7]='\0';
  77.     for (j=0;j<7;j++){
  78.       if((i==j || j==i-1) && i>0 && j<6 && j>0 && i<6)
  79.         a[i][j]='X';
  80.       else if(i==0 || j==0 || i==6 || j==6 )
  81.         a[i][j]='*';
  82.       else
  83.         a[i][j]='0';
  84.     }
  85.   }
  86.   gotoxy (0,10);
  87.   for (i=0;i<7;i++){
  88.     for (j=0;j<7;j++){
  89.       printf ("%c ",a[i][j]);
  90.     }
  91.     putchar ('\n');
  92.   }
  93.   system ("pause");
  94.  
  95.   for (i=0;i<7;i++)
  96.     printf ("%s\n",a[i]);
  97.   system ("pause");
  98.   gotoxy (0,0);
  99.  
  100.   for (i=0;i<7;i++){
  101.     for (j=0;j<7;j++){
  102.       printf ("%c ",a[i][j]);
  103.     }
  104.     putchar ('\n');
  105.   }
  106.   fil=1,col=1;
  107.   while  (1){
  108.     Sleep(1000);
  109.     if (fil==FIL-2 && col==COL-3){
  110.       gotoxy (2*col,fil);
  111.       printf("%c ",'F');
  112.       break;
  113.     }
  114.     else if (a[fil+1][col]=='X' && fil<FIL){
  115.       color(215);
  116.       gotoxy (2*col,fil);
  117.       printf("%c ",'F');fil++;
  118.     }
  119.     else if (a[fil][col+1]=='X' && col<COL){
  120.       color(215);
  121.       gotoxy (2*(col),fil);
  122.       printf("%c ",'F');col++;
  123.     }
  124.     else if (a[fil-1][col]=='X' && fil>0){
  125.       color(215);
  126.       gotoxy (2*(col),fil);
  127.       printf("%c ",'F');fil--;
  128.     }
  129.     else if (a[fil][col-1]=='X' && col>0){
  130.       color(215);
  131.       gotoxy (2*col,fil);
  132.       printf(" %c ",'F');col--;
  133.     }
  134.   }
  135.   gotoxy (0,30);
  136.   printf ( "*** Final! ***\n\n");
  137.   color(7);
  138.   system("pause");
  139.   return 0;
  140. }
  141.  
  142. void color (int n)
  143. {
  144.         SetConsoleTextAttribute(GetStdHandle (STD_OUTPUT_HANDLE), n );
  145. }
  146.  
  147.  
  148. int gotoxy(int x, int y)
  149. {
  150.    COORD coord;
  151.    HANDLE h_stdout;
  152.  
  153.    coord.X = x;
  154.    coord.Y = y;
  155.  
  156.    if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
  157.       return 0;
  158.  
  159.    if (SetConsoleCursorPosition(h_stdout, coord) == 0)
  160.       return 0;
  161.  
  162.    return 1;
  163. }

Otra opción es usar la librería conio2.h, hace lo mismo de manera más simple y "creo" que también va en Linux.

Las dos opciones es para no entrar en librerías de mayor "peso", aunque sean más "poderosas".

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 06/07/2014, 04:19
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

muchas gracias leosansan.

Ya creo saber por que desde hace 2 dias no veo ningun cambio en ventana, y es que cada vez que ejecuto una nueva depuracion (F5) es como si me mostrara una ya registrada y no una actualizada los ultimos cambios. Digo esto por que comento todo el codigo que hay en el main, inicio depuracion, y !sorpresa! funciona igual que antes, la serpiente se mueve cuando no deberia si no hay indicaciones al tener comentado el main

Como puedo hacer una nueva depuracion, se que es F5 o en el menu depurar, pero deberia hacer una nueva.

PD: He borrado el archivo compilado y ahora no me deja depurar, dice que no se encuentra el archivo, ¿pues como lo genero nuevamente?
  #6 (permalink)  
Antiguo 06/07/2014, 04:52
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Cita:
Iniciado por Dempo87 Ver Mensaje
muchas gracias leosansan.
.................................................
Como puedo hacer una nueva depuracion, se que es F5 o en el menu depurar, pero deberia hacer una nueva.

PD: He borrado el archivo compilado y ahora no me deja depurar, dice que no se encuentra el archivo, ¿pues como lo genero nuevamente?
No estoy seguro de haberte entendido de forma precisa. Intuyo que lo que debes hacer antes de depurar es compilar el nuevo código.

¡¡¡Saluditos!!!

  #7 (permalink)  
Antiguo 06/07/2014, 05:57
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Cita:
Iniciado por leosansan Ver Mensaje
No estoy seguro de haberte entendido de forma precisa. Intuyo que lo que debes hacer antes de depurar es compilar el nuevo código.

¡¡¡Saluditos!!!

si, perdona que no haya expresado correctamente. Cuando compilas, ves en pantalla los ultimos cambios en el codigo desde la ultima vez que compilastes, pues bien, a mi no me refleja nada, de echo, coloco errores a posta para que me lo deteste y no me deje compilar pero nada, sigue compilando. El codigo dentro del main lo he comentado por que asi esta claro que no deberia compilar el proyecto al faltar parte del codigo, pero sigue mostrandome en pantalla el juego como si todo estuviera bien.

...no se si asi lo aclaro algo mejor, jeje

Por ese motivo, no puedo comprobar los cambios.
  #8 (permalink)  
Antiguo 06/07/2014, 06:10
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Cita:
Iniciado por Dempo87 Ver Mensaje

...no se si asi lo aclaro algo mejor, jeje

Por ese motivo, no puedo comprobar los cambios.
Rarito es.

¿Has probado con Build = F9?.

,,,
. .
|
\-/
  #9 (permalink)  
Antiguo 06/07/2014, 09:43
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Si, usaba el punto de interrupcion en casi todas las lineas pero nada

Ahora como borre el archivo compilable pues ya ni veo la ventana:

  #10 (permalink)  
Antiguo 06/07/2014, 10:19
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

  #11 (permalink)  
Antiguo 06/07/2014, 10:52
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Rarito, rarito pero a grandes males grandes remedios.

No uso el VC con lo que no se me ocurre otra forma que crear un nuevo proyecto y hacer en él un copy and paste del antiguo., nuevo proyecto ==> nueva compilación, nuevos ejecutables.

Siento no poder ayudarte más.

,,,
. .
|
(-)
  #12 (permalink)  
Antiguo 06/07/2014, 10:57
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Cita:
Iniciado por leosansan Ver Mensaje
Rarito, rarito pero a grandes males grandes remedios.

No uso el VC con lo que no se me ocurre otra forma que crear un nuevo proyecto y hacer en él un copy and paste del antiguo., nuevo proyecto ==> nueva compilación, nuevos ejecutables.

Siento no poder ayudarte más.

,,,
. .
|
(-)
nada compañero, se agradece que estuvieras hay y respondiendo rapidamente.

Lo ultimo que dices, si, lo he echo y bien, he podido crear el archivo compilable que te comentaba, y se depura toda la actualizacion del codigo, perfecto, pero asta que he realizado un pequeño cambio para comprobar y surge el mismo problema, el archivo se mantiene pero es como si no se actualizara al depurar, me sigue saliendo la ventana con los resultados de la anterior depuracion, pero no con los ultimos cambios, de echo, interrumpo lineas, comento parte del codigo e incluso todo el main, pero nada.

No se, mañana me acercare a donde estoy estudiando y haver que me dicen.

Un saludo y muchas gracias compañero.
  #13 (permalink)  
Antiguo 06/07/2014, 11:12
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Cita:
Iniciado por Dempo87 Ver Mensaje
nada compañero, se agradece que estuvieras hay y respondiendo rapidamente.
..........................
surge el mismo problema, el archivo se mantiene pero es como si no se actualizara al depurar, me sigue saliendo la ventana con los resultados de la anterior depuracion, pero no con los ultimos cambios, de echo, interrumpo lineas, comento parte del codigo e incluso todo el main, pero nada.
.
Después de los cambios creo que en VC hay que darle a Generar ==> Generar Solución para actualizar el código y después de eso depurar.
  #14 (permalink)  
Antiguo 07/07/2014, 08:12
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Cita:
Iniciado por leosansan Ver Mensaje
Después de los cambios creo que en VC hay que darle a Generar ==> Generar Solución para actualizar el código y después de eso depurar.
por lo visto es un problema con el administrador de mi ordenador. Aunque yo accedo con mi usuario, Visual Studio al compilar usa un administrador interno o algo asi me han dicho, por ello no me dejaba compilar, por que a pesar de no salir un mensaje de aviso, es como si necesitara confirmacion.

Sigo con el problema, asi que lo trabajare en clases que hay parece ir bien.

Un saludo y muchas gracias leosansan
  #15 (permalink)  
Antiguo 07/07/2014, 09:08
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Problema Snake

Cita:
Iniciado por Dempo87 Ver Mensaje
por lo visto es un problema con el administrador de mi ordenador. Aunque yo accedo con mi usuario, Visual Studio al compilar usa un administrador interno o algo asi me han dicho, por ello no me dejaba compilar, por que a pesar de no salir un mensaje de aviso, es como si necesitara confirmacion.

Sigo con el problema, asi que lo trabajare en clases que hay parece ir bien.

Un saludo y muchas gracias leosansan
Antes que nada, "de nada", por lo de las gracias.

La verdad es que no se me ha planteado ese problema .... y sí, instale el VC para intentar ver donde radicaba el problema, pero no me los dio.

Muy posiblemente porque tengo la costumbre en Windows de crear la cuenta de "Administrador", que no viene por defecto, así tengo plenos "poderes" para hacer lo que me plazca. Es decir, no creo una cuenta de usuario, que por defecto "creo" que no es la del Administrador.

Si te interesa googlea "crear cuenta de Administrador" y verás que es muy sencillo de crear.

Siento no haberte sido de mucha utilidad, pero se ha intentado.:

Un fuerte saludo Dempo87.

¡¡¡Saluditos!!!

  #16 (permalink)  
Antiguo 07/07/2014, 11:38
 
Fecha de Ingreso: octubre-2013
Ubicación: Murcia
Mensajes: 54
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Problema Snake

Cita:
Iniciado por leosansan Ver Mensaje
Antes que nada, "de nada", por lo de las gracias.

La verdad es que no se me ha planteado ese problema .... y sí, instale el VC para intentar ver donde radicaba el problema, pero no me los dio.

Muy posiblemente porque tengo la costumbre en Windows de crear la cuenta de "Administrador", que no viene por defecto, así tengo plenos "poderes" para hacer lo que me plazca. Es decir, no creo una cuenta de usuario, que por defecto "creo" que no es la del Administrador.

Si te interesa googlea "crear cuenta de Administrador" y verás que es muy sencillo de crear.

Siento no haberte sido de mucha utilidad, pero se ha intentado.:

Un fuerte saludo Dempo87.

¡¡¡Saluditos!!!

si eso voy a hacer, y don't worry, se agradece el que respondieras a cada mensaje y de forma rapida
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:42.