[C con Clase] Juego de la serpiente

Alejandro alepelexo en yahoo.es
Mar Oct 9 18:33:06 CEST 2007


Hola lista:

Estoy intentando hacer una especie de juego de la serpiente para MS-DOS. Mi problema es que hasta ahora temgo creada la parte que reconoce las teclas y mueve la serpiente. Para probarlo creé un minimapa y puse un rombo como serpiente, y con las teclas mueves al rombo. O esa era mi intención porque lo que quiero es que ese rombo se borre cada vez que el usuario teclee una flecha y se reescriba en la nueva casilla. Este es el codigo hasta ahora:

#include <iostream>//Librería para cout, cin...
#include <cstdio>//Librería para el archivo de texto
#include <ctime>//Librería con las funciones del tiempo
#include <cstring>//Librería con tratamientos para cadenas
#include <conio.h>//Conio para mover la serpiente

#define  LEFT     0x4b //izquierda 
#define  RIGHT    0x4d //derecha 
#define  UP       0x48 //arriba 
#define  DOWN     0x50 //abajo 
#define  ENTER    0x0d //enter

#define TAM_LADO 20
#define TAM_ALTO 10//Dimensiones del mapa

using namespace std;

class Animal
{
      public:
             void MueveAnimal(int, int);//Función para mover el animal
             int CoorX(){return x;};
             int CoorY(){return y;};//Devuelven las coordenadas actuales
             Animal(int InX = TAM_ALTO / 2, int InY = TAM_LADO / 2);//Constructor
             
      private:
              int x;
              int y;//Variables con la posicion inicial
}Serpiente;//Clase para crear la serpiente

void Animal::MueveAnimal(int Nx, int Ny)//Función para mover la serpiente
{
     x = Nx;
     y = Ny;//Cambia las coordendas
}

Animal::Animal(int InX, int InY)//Constructor
{
                   x = InX;
                   y = InY;//Inicializa las variables
}

int main()//Función principal
{
    char tecla;//Captura la tecla pulsada
    bool Salir = false;
    int CopX;
    int CopY;//Copia de las coordenadas actuales
    int x = 5;
    int y = 10;//Inicio del jugador
    int mapa[TAM_ALTO][TAM_LADO] = {
                                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};//Mapa del juego
    
    
    mapa[x][y] = 2;//Posición inical del jugador
    
    
    for(int k = 0; k < TAM_ALTO; k++)
    {
            for(int y = 0; y < TAM_LADO; y++)
            {
                    if(mapa[k][y] == 0)cout << (char)32;
                    if(mapa[k][y] == 1)cout << (char)2;
                    if(mapa[k][y] == 2)cout << (char)4;
            }
            cout << endl;
    }//Inicialización del mapa
    
    while(tecla != ENTER)//Game loop central
    {
                CopX = x;
                CopY = y;//Hace copias de las coordenadas
                
                do
                {
                         tecla = getch();
                         
                         switch(tecla)
                         {
                                      case UP:
                                           Serpiente.MueveAnimal((x--), y);
                                           Salir = true;
                                           break;
                                           
                                      case DOWN:
                                           Serpiente.MueveAnimal((x++), y);
                                           Salir = true;
                                           break;
                                           
                                      case LEFT:
                                           Serpiente.MueveAnimal(x, (y--));
                                           Salir = true;
                                           break;
                                      
                                      case RIGHT:
                                           Serpiente.MueveAnimal(x, (y++));
                                           Salir = true;
                                           break;
                                           
                                      default:
                                              break;
                         }
                }while(!Salir);
                         
                         mapa[Serpiente.CoorX()][Serpiente.CoorY()] = 2;//Cambia de posicion la serp.
                         mapa[CopX][CopY] = 0;//Deja libre el anterior hueco
                         
                         system("cls");//Limpia la pantalla
                         
                         for(int k = 0; k < TAM_ALTO; k++)
                         {
                                 for(int y = 0; y < TAM_LADO; y++)
                                 {
                                         if(mapa[k][y] == 0)cout << (char)32;
                                         if(mapa[k][y] == 1)cout << (char)2;
                                         if(mapa[k][y] == 2)cout << (char)4;
                                 }
                                 cout << endl;
                         }//Dibuja el nuevo mapa
    }
                                           
                                           
    
    cin.get();//Mantiene abierto el programa
    return 0;
}

¿Cual es el fallo? No comprendo por qué la pantalla va con retraso de lo que yu hago...:-(  Gracias por vuestra atención y un saludo.


Más información sobre la lista de distribución Cconclase