Problema identificar teclas preisonadas (Solucionado)

Iniciado por andres_jk, 27 Octubre 2010, 01:25 AM

0 Miembros y 4 Visitantes están viendo este tema.

andres_jk

Hola, estoy aprendiendo a programar en C y queria hacer un jueguito pero tengo un problema con el movimiento que derrepente se hecha  a perder, le meti fflush por todas partes y ni asi se arreglo, xdd, asi que no he seguido avanzando. Por favor si alguien lo puede revisar y hecharme una manito :).

(Como hago un spoiler?? :D?)


Este es el codigo.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>


struct nave{
      char sprite;
      int x, y;
      };

int main(){
   int i, j, b=3;
   char a[20][20];
   char c;

start:
struct nave nave1;
      nave1.sprite=1;
      nave1.x=9;
      nave1.y=9;

struct nave nave2;
      nave2.sprite=2;
      nave2.x=3;
      nave2.y=3;

while(b!=0){
   for(i=0; i<20;i++){
            for(j=0; j<20; j++){
                     if(i==nave1.y && j==nave1.x && i==nave2.y && j==nave2.x){
                          b--;
                          system("cls");
                          goto start;
                          }
                     else if(i==nave1.y && j==nave1.x){
                                   a[i][j]=nave1.sprite;
                                   }
                     else if(i==nave2.y && j==nave2.x){
                                   a[i][j]=nave2.sprite;
                                   }
                     
                     else{
                          a[i][j]=' ';
                          }
                         
                           printf("%c ", a[i][j]);
                           }
                           printf("\n");
                           }
                           printf("\nVidas: %i\n", b);
                         
                         
                          system("pause");           //probe con getch() pero agrava el bug
                         
                          if(GetKeyState(38))        //37-40 son las flechitas
                          if(nave1.y>0)
                          nave1.y=nave1.y-1;
                         
                          if(GetKeyState(40))
                          if(nave1.y<19)
                          nave1.y=nave1.y+1;
                         
                          if(GetKeyState(37))
                          if(nave1.x>0)
                          nave1.x=nave1.x-1;
                         
                          if(GetKeyState(39))
                          if(nave1.x<19)
                          nave1.x=nave1.x+1;
                                               
                         
                     system("cls");                    
}
printf("\t\t\tGAME OVER!\n\n");
   
system("pause");
return 0;
}

do-while

¡Buenas!

¡¡¡¡Olvida el goto!!!!, haz el programa utilizando programacion estructurada (estructuras de control) y luego lo vuelves a colgar.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

andres_jk

Cita de: do-while en 27 Octubre 2010, 02:56 AM
¡Buenas!

¡¡¡¡Olvida el goto!!!!, haz el programa utilizando programacion estructurada (estructuras de control) y luego lo vuelves a colgar.

¡Saludos!

Gracias, pero sin el goto pasa lo mismo, yo creo que tiene que ver con el teclado, sabes alguna otra forma de identificar si apreto una tecla o no?.

Saludos!

do-while

¡Buenas!

Lo primero, quita el goto. Eso no es programacion estructurada y te va crear mas problemas que soluciones.

Para lo de las teclas, aprende a pensar y a investigar. En conio.h (que no te recomiendo utilizarla ya que solo viene con compiladores borland) tienes dos funciones con las que puedes investigar, que es lo que yo hice en su dia. La primera kbhit, y la segunda getch. Una de ellas te sirve para saber si se ha pulsado alguna tecla y la otra para capturar teclas directamente. Luego puedes mirar el ascii de la tecla presionada y asi posteriormente, cuando te haga falta saber que tecla has presionado, puedes comparar el ascii de la tecla presionada con los ascii de las teclas que conozcas... busca informacion sobre las funciones de conio.h y trastea con ellas.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Akai

Cita de: do-while en 27 Octubre 2010, 16:48 PMbusca informacion sobre las funciones de conio.h y trastea con ellas.

O mejor no uses conio.h dado que está muy obsoleta. Casi que mejor investiga sobre funciones/bibliotecas que hagan eso sin usar conio

andres_jk

#5
Bueno, ya lo arregle, este e smi nuevo codigo, xdd.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>


struct cuerpo
{
   char sprite;
   int x, y;
};

struct plano
{
   char sprite;
   int x, y;
};

struct proy
{
   char sprite;
   int x, y;
   int rango;
};


int main()
{
   int m, n, i, j, k, l, e=30, b=3;
   char c;
   struct cuerpo nave, player;
   struct proy bala;
   struct plano a[20][20];


   nave.sprite=1;
   player.sprite=2;
   bala.sprite='`';
   bala.rango=5;

   void start()
   {
       for(i=0; i<20; i++)
       {
           for(j=0; j<20; j++)
           {
               a[i][j].sprite=' ';
               a[i][j].x=i;
               a[i][j].y=j;
           }
       }
   }

   void pspawn()
   {
       player.x=19;
       player.y=10;
   }
   void bspawn()
   {
       bala.x=player.x-1;
       bala.y=player.y;
   }

   void ppos()
   {
       a[player.x][player.y].sprite=player.sprite;
   }
   void bpos()
   {
       a[bala.x][bala.y].sprite=bala.sprite;
   }
   void epos()
   {
       for(l=0; l<20; l++)
       {
           a[0][l].sprite=nave.sprite;
       }
   }

   void chkp()
   {
       if(player.x==0)
       {
           m=player.y;
           pspawn();
           b--;
           a[0][m].sprite='X';
       }
   }
   void chke()
   {
       if(bala.x==0)
       {
           m=bala.y;
           bspawn();
           a[0][m].sprite='X';
       }
   }

   void disp()
   {
       system("cls");
       for(i=0; i<20; i++)
       {
           for(j=0; j<20; j++)
           {
               if(i==player.x && j==player.y)
               {
                   ppos();
               }
               else if (i==bala.x && j==bala.y)
               {
                   bpos();
               }
               else if (a[i][j].sprite!=nave.sprite && a[i][j].sprite!='X')
               {
                   a[i][j].sprite=' ';
               }
               printf("%c ", a[i][j].sprite);
           }
           printf("\n");
       }
       printf("\nVidas: %i Ammo: %i\n", b, e);
   }

   void mov()
   {
       c='1';
       k=0;
       c=getch();

       switch(c)
       {
       case 'w':
           if(player.x>0)
               player.x=(player.x)-1;
           break;

       case 'd':
           if(player.y<19)
               player.y=(player.y)+1;
           break;

       case 's':
           if(player.x<19)
               player.x=(player.x)+1;
           break;

       case 'a':
           if(player.y>0)
               player.y=(player.y)-1;
           break;
       case ' ':
           bala.x=player.x-1;
           bala.y=player.y;
           a[bala.x][bala.y].sprite='*';
           while(k<bala.rango)
           {
               bala.x=bala.x-1;
               chke();
               disp();
               k++;
           }
           e--;
           break;

       default:
           break;
       }
   }

   start();
   epos();
   pspawn();
   disp();

   while(b!=0 && e!=0)
   {
       disp();
       mov();
       chkp();
       bspawn();
   }

   if(b==0 || e==0)
    {
       system("cls");
       printf("\t\t\tGAME OVER!\n\n");
    }

   system("pause");
   return 0;
}