Saltar un getch() si no se pulsa la tecla

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Saltar un getch() si no se pulsa la tecla

Notapor migueleitorone » Mar Sep 07, 2010 2:28 pm

hola de nuevo. Estoy programando un snake y ya he hecho que un caracter se desplace por la pantalla automaticamente. El problema viene con el tema de hacer que cambie de direccion, ya que si uso cualquier funcion de entrada el programa se para hasta que pulse una tecla y el tema seria que sino pulsas la tecla simplemente se salte la instruccion. Alguna idea?

Código: Seleccionar todo
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <conio.h>

int main()
{
   ///////////////VARIABLES///////////////////////////////////////////////////////////////////////////
   //////////////////////////////////////////////////////////////////////////////////////////////////
   srand(time(NULL));
   char tablero[30][60];
   int i_aleatoria, j_aleatoria;
   int has_perdido = 0;
   char movimiento_automatico; //r = derecha, l = izquierda u= arriba d= abajo

   /////////////DOY VALOR A CADA CASILLA DEL TABLERO//////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////////////////////////////////////
   for(int i=0; i<30; i++)
   {
      for(int j=0; j<60; j++)
      {
         if(i == 0) tablero[i][j] = 'o';
         else if(j == 0) tablero[i][j] ='o';
         else if(j == 59) tablero[i][j] ='o';
         else if(i == 29) tablero[i][j] ='o';

         if(tablero[i][j] == 'o') continue;
         else tablero[i][j] = ' ';

      }
   }

   ///////////POSICION INICIAL DEL CARACTER//////////////////////////////////////////////////////////
   //////////////////////////////////////////////////////////////////////////////////////////////////
   i_aleatoria = (rand() % 28)+1;
   j_aleatoria = (rand() % 58)+1;
   tablero[i_aleatoria][j_aleatoria] = '+';
   
   ///////////MOVIMIENTO AUTOMATICO INICIAL DEL CARACTER/////////////////////////////////////////////////////
   //////////////////////////////////////////////////////////////////////////////////////////////////
   if(j_aleatoria < 30) movimiento_automatico = 'r';
   else movimiento_automatico = 'l';
   
   //////////ACTUALIZAR TABLERO//////////////////////////////////////////////////////////////////////
   /////////////////////////////////////////////////////////////////////////////////////////////////
   do
   {
      system("cls");
      for(int i=0; i<30; i++)
      {
         for(int j=0; j<60; j++)
         {
            printf("%c", tablero[i][j]);
         }
         printf("\n");
      }
      
      /////////MOVIMIENTO AUTOMATICO/////////////////////////////////////////////////////////////////////
      ///////////////////////////////////////////////////////////////////////////////////////////////////
      if(movimiento_automatico == 'r')
      {
         tablero[i_aleatoria][j_aleatoria] = ' ';
         j_aleatoria++;
         if(tablero[i_aleatoria][j_aleatoria] == 'o') has_perdido = 1;
         else tablero[i_aleatoria][j_aleatoria] = '+';
      }
      else if(movimiento_automatico == 'l')
      {
         tablero[i_aleatoria][j_aleatoria] = ' ';
         j_aleatoria--;
         if(tablero[i_aleatoria][j_aleatoria] == 'o') has_perdido = 1;
         else tablero[i_aleatoria][j_aleatoria] = '+';
      }
      else if(movimiento_automatico == 'u')
      {
         tablero[i_aleatoria][j_aleatoria] = ' ';
         i_aleatoria--;
         if(tablero[i_aleatoria][j_aleatoria] == 'o') has_perdido = 1;
         else tablero[i_aleatoria][j_aleatoria] = '+';
      }
      else if(movimiento_automatico == 'd')
      {
         tablero[i_aleatoria][j_aleatoria] = ' ';
         i_aleatoria++;
         if(tablero[i_aleatoria][j_aleatoria] == 'o') has_perdido = 1;
         else tablero[i_aleatoria][j_aleatoria] = '+';
      }
      Sleep(250);
   
   }while(has_perdido == 0);

   printf("Has perdido hermano");
   getch();

   return 0;
}


Por otro lado deduzco que la funcion sleep() no es portable por que esta incluida en windows.h, hay alguna alternativa multiplataforma?
gracias de nuevo por la ayuda :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Saltar un getch() si no se pulsa la tecla

Notapor carlostex » Mié Sep 08, 2010 1:43 pm

La funcion sleep se puede usar en gnu/linux, la de win tiene mayuscula. Puedes usar directivas del preposesador para que se use la funcion dependiendo del SO

Cuando hice un snake use un hilo para leer el teclado, claro que existe la forma de hacerlo sin el hilo, tal vez consultando los eventos directamente al SO, pero no
se como.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Saltar un getch() si no se pulsa la tecla

Notapor migueleitorone » Mié Sep 08, 2010 2:49 pm

A que te refieres con usar un hilo?
No sabia como llamar a mi problema, buscare sobre gestion de eventos en c, aver si encuentro algo interesante.
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado