• Viernes 1 de Noviembre de 2024, 08:20

Autor Tema:  Necesito Consejo Programando Un Tetris  (Leído 1026 veces)

Cloud_Skywalker

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Necesito Consejo Programando Un Tetris
« en: Lunes 17 de Diciembre de 2007, 14:31 »
0
Hola, soy nuevo y me gustaría saber si aquí podríais ayudarme.

En caso afirmativo os dejo aquí el código actual de mi programa y os digo principalmente que es lo que he detectado que no funciona.

Objetivos del programa:

El programa pide unos datos al inicio y los devuelve al final del juego y eso lo hace correctamente.

El juego tiene 8 piezas diferentes (una de ellas declarada con un tipo diferente por simplificación y evasión de problemas posteriores) todas ellas con forma y color diferente.

El juego coloca una pieza en el tablero siempre que no quedan piezas en el tablero o la anterior no se puede mover.

La coloca en la parte más alta en una posición horizontal al azar.

las pizas bajan automáticamente y mientras bajan utilizando las flechas horizontales es posible moverlas a los lados. Además con la flecha hacia arriba o la barra espaciadora puede rotar un cuarto de vuelta hacia la drecha.

las piezas pueden rotar o desplazarse lateralmene sólo una vez por cada posición que baja y puede hacer primero una cosa o la otra, pero siempre bajar es lo último que hace.

Sólo se moverá o rotará si después de ello no sobresaldrá de los límites del tablero ni se superpondrá a ninguna otra pieza ya existente.

Después de cada pieza que se queda quieta el programa comprueba si hay filas llenas y de ser así las elimina y todas los trozos de pieza que quedan porencima bajan todo lo que pueden.

Cuando una pieza nueva se coloca y queda superpuesta a otra se termina la partida.

Cuando se aprieta la tecla Esc también se termina la partida

Si la partida termina se pregunta si se desea volver a jugar, pero a partir de aquí todo va bien.

Problemas:

Que yo haya detectado de momento falla en la rotación de las piezas:

Donde no las rota sino que las deja igual i mientras bajan pueden ocurrir cosas extrañas como detenerse a medio camino, o comerse bloques que ya estaban puestos.

Después cuando una pieza nueva del mismo tipo que la que se intentó rotar entra en el tablero entra rotada y lo mismo ocurre con las sigueintes.

También tiene otro problema a la hora de eliminar filas llenas pero creo que ese no es tan difícil de descubrir y reparar, supongo que es un error de acceso a memoria.

y ahora dejo el código:

Tetris.c:

/********************************************************************************************************************************/
/*                                 Tetris   2.0                                                                         */
/********************************************************************************************************************************/

/********************************************************************************************************************************/
//         Capçalera del programa i tipus de dades
/********************************************************************************************************************************/

#include   "Rutines_v1.h"
#include   <conio.h>
#include   <stdlib.h>

#define   colors   8
#define   KEY_SPC   32

typedef   struct
{
   int   fila;
   int   columna;
   int   color;
} Tquadret;

typedef   struct   Tjugador
{
   char   nom[10];
   int      data1;
   int      data2;
   int      data3;
   int      punts;
   struct   Tjugador   *seguent;
} jugador;

typedef struct   Trosset
{
   int      pos[NCol];
   int      fila;
   int      permis;
   struct   Trosset   *seguent;
} TTros;

/********************************************************************************************************************************/
//         Funcions i procediments per esborrar peces i files plenes del taulell de joc
/********************************************************************************************************************************/

void   EsborraPeca(Tquadret peca[3][3][colors+1], Tquadret quadret, int c, int taulell[NFil][NCol])   /*Procediment que esborra una peça del taulell*/
{
   int   i, j;

   if   (c==1)
      taulell[quadret.fila][quadret.columna]=0;
   else
      for(i=0; i<3; i++)
         for(j=0; j<3; j++)
            if   (peca[j][c].color!=0)
               taulell[peca[j][c].fila][peca[j][c].columna]=0;
}

int   EsborraLinia(int taulell[NFil][NCol], int f[NFil])   /*Funció que esborra totes les files plenes del taulell, fa baixar les altres el màxim possible i retorna el nombre de files esborrades*/
{
   int   i, j, k, s=0;

   for   (i=0; i<NFil; i++)
      if   (f[NFil-1-i]!=0)
      {
         s++;

         for   (j=0; j<NCol; j++)
            taulell[NFil-1-i][j]=0;
      }

   for   (i=0; i<NFil; i++)
      if   ((f[NFil-1-i]!=0)&&(NFil-2-i!=0))
         for   (j=0; j<NFil-2-i; j++)
            for   (k=0; k<NCol; k++)
            {
               taulell[NFil-1-i][k]=taulell[NFil-2-i][k];
               taulell[NFil-2-i][k]=0;
            }
   return   s;
}

/********************************************************************************************************************************/
//         Procediments per comprobar la possibilitat de moure una peça o d'esborrar alguna fila
/********************************************************************************************************************************/

int   Permis(Tquadret peca[3][3][colors+1], Tquadret quadret, int c, int x, int y, int h, int taulell[NFil][NCol])   /*Comproba si es possible moure una peça a alguna posició concreta i retorna 0 si no és possible o 1 si ho és*/
{
   int   i, j, k, l, p;

   if   ((((x>NFil-2)||(y<1)||(y>NCol-2))&&(c!=1))||(((x>NFil-1)||(y<0)||(y>NCol-1))&&(c==1)))
      p=0;
   else   
   {
      if   (h==0)
         EsborraPeca(peca, quadret, c, taulell);
      p=1;
      if   (c==1)
      {
         if   (taulell
  • [y]!=0)

            p=0;
      }
      else   
      {
         i=0;
         k=x-1;
         do
         {
            j=0;
            l=y-1;
            do
            {
               if   ((peca[j][c].color!=0)&&(taulell[k][l]!=0))
                  p=0;
               j++;
               l++;
            }while   ((j<3)&&(p!=0));
            i++;
            k++;
         }while   ((i<3)&&(p!=0));
      }
   }
   return   p;
}

int   PermisRotar(Tquadret peca[3][3][colors+1], Tquadret quadret, int c, int taulell[NFil][NCol])   /*Funció que comproba si es possible rotar una peça i retorna 0 si no és possible o 1 si ho és*/
{
   int   i, j, p;

   EsborraPeca(peca, quadret, c, taulell);

   i=0;
   do
   {
      j=0;
      do
      {
         if   ((peca[j][c].color!=0)&&(taulell[j][3-i]!=0))
            p=0;
         else   p=1;
         j++;
      }while   ((j<3)&&(p!=0));
      i++;
   }while   ((i<3)&&(p!=0));

   return   p;
}

int   ComprovarLinia(int taulell[NFil][NCol], int f[NFil])   /*Funció que comprova si existeix al menys una fila plena, si existeix retorna 1 i si no retorna 0. També conserva la informació de quines files estan plenes*/
{
   int   i, j, l, r;

   for (i=0; i<NFil; i++)
      f=0;
   r=0;
   i=0;
   do
   {
      j=0;
      do
      {
         if   (taulell[j]!=0)
            l=1;
         else   l=0;
         j++;
      }while   ((j<NCol)&&(l==1));
      if   (l==1)
      {
         f=1;
         r=1;
      }
      i++;
   }while   (i<NFil);

   return   r;
}

/********************************************************************************************************************************/
//         Procediments per moure una peça
/********************************************************************************************************************************/

void   PecaEsquerra(Tquadret peca[3][3][colors+1], Tquadret *quadret, int c)   /*Procediment que mou una peça una posició a esquerra*/
{
   int   i, j;

   if   (c==1)
      quadret->columna=quadret->columna-1;
   else
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
            peca[j][c].columna=peca[j][c].columna-1;
}

void   PecaDreta(Tquadret peca[3][3][colors+1], Tquadret *quadret, int c)   /*Procediment que mou una peça una posició a la dreta*/
{
   int i, j;

   if   (c==1)
      quadret->columna=quadret->columna+1;
   else
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
            peca[j][c].columna=peca[j][c].columna+1;
}

void   PecaAbaix(Tquadret peca[3][3][colors+1], Tquadret *quadret, int c)   /*Procediment que mou una peça una posició abaix*/
{
   int   i, j;

   if   (c==1)
      quadret->fila=quadret->fila+1;
   else
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
            peca[j][c].fila=peca[j][c].fila+1;
}

void   RotaPeca(Tquadret peca[3][3][colors+1], int c)   /*Procediment que rota una peça -90º*/
{
   int i, j;
   Tquadret m[3][3];

   for   (i=0; i<3; i++)
      for   (j=0; j<3; j++)
      {
         m[j].color=peca[j][c].color;
         m[j].columna=peca[j][c].columna;
         m[j].fila=peca[j][c].fila;
      }

   for   (i=0; i<3; i++)
      for   (j=0; j<3; j++)
      {
         peca[j][c].color=m[2-j].color;
         peca[j][c].columna=m[2-j].columna;
         peca[j][c].fila=m[2-j].fila;
      }
}

/********************************************************************************************************************************/
//         Procediments per trobar segments flotants i reubicar-los
/********************************************************************************************************************************/

void   LocalitzaTrossos(TTros *Tros, int taulell[NFil][NCol])   /*Procediment que fa una llista de tots els segments que potser estan flotant*/
{
   int   i, j;
   TTros   *primer;

   for   (i=0; i<NCol; i++)
      Tros->pos=0;

   for   (i=1; i<NFil; i++)
   {
      for   (j=0; j<NCol; j++)
      {
         if   (taulell[NFil-1-i][j]!=0)
         {
            if   (Tros==NULL)
            {
               Tros=(TTros*)malloc(sizeof(TTros));
               primer=Tros;
            }
            else
            {
               Tros->seguent=(TTros*)malloc(sizeof(TTros));
               Tros=Tros->seguent;
            }
            Tros->seguent=NULL;
            Tros->fila=NFil-1-i;
         }
         do
         {
            Tros->pos[j]=taulell[NFil-1-i][j];

            if   (j<NCol-1)
               j++;
         }while   ((taulell[NFil-1-i][j]!=0)&&(j!=NCol-1));
      }
   }
   Tros=primer;
}

void   BaixaTrossos(TTros *Tros, int taulell[NFil][NCol])   /*Procediment que baixa tots els segments flotants el màxim possible*/
{
   int   i, z;
   TTros   *primer;

   primer=Tros;

   do
   {
      z=0;

      do
      {
         Tros->permis=1;

         for   (i=0; i<NCol; i++)
            if   ((taulell[Tros->fila+1]!=0)&&(Tros->pos!=0))
               Tros->permis=0;

         if   (Tros->permis!=0)
            for   (i=0; i<NCol; i++)
               if   (Tros->pos!=0)
               {
                  taulell[Tros->fila]=0;
                  taulell[Tros->fila+1]=Tros->pos;
                  z=1;
               }

         Tros=Tros->seguent;
         free(primer);
         primer=Tros;

      }while   (Tros!=NULL);
   }while   (z!=0);
}


/********************************************************************************************************************************/
//         Altres procediments
/********************************************************************************************************************************/

void   PintaPeca(Tquadret peca[3][3][colors+1], Tquadret quadret, int c, int taulell[NFil][NCol])   /*Procediment que pinta una peça al taulell*/
{
   int i, j;

   if   (c==1)
      taulell[quadret.fila][quadret.columna]=1;
   else
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
            if   (peca[j][c].color!=0)
               taulell[peca[j][c].fila][peca[j][c].columna]=peca[j][c].color;
}

void   ColocaPeca(Tquadret peca[3][3][colors+1], Tquadret *quadret, int k, int c)   /*Procediment que dona a la peça les coordenades d'on cau*/
{
   int i, j;

   if   (c==1)
   {
      quadret->fila=0;
      quadret->columna=k;
   }
   else
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
         {
            peca[j][c].fila=i;
            peca[j][c].columna=j+k-1;
         }
}

void   InicialitzaPeces(Tquadret peca[3][3][colors+1], Tquadret *quadret)   /*Procediment que dona forma i color a cada peça*/
{
   int i, j, c;

   for   (c=2; c<colors+1; c++)
      for   (i=0; i<3; i++)
         for   (j=0; j<3; j++)
            peca[j][c].color=c;

   quadret->color=1;

   for   (i=0; i<2; i++)
      for   (j=1; j<3; j++)
         peca[j][3].color=0;

   for   (i=0; i<2; i++)
      for   (j=0; j<3; j=j+2)
         peca[j][4].color=0;

   for   (i=0; i<2; i++)
      peca[2][5].color=0;

   for   (i=1; i<3; i++)
      peca[0][6].color=0;

   peca[2][0][7].color=0;
   peca[0][2][7].color=0;
   peca[1][2][7].color=0;

   peca[0][0][8].color=0;
   peca[1][0][8].color=0;
   peca[2][2][8].color=0;
}

/********************************************************************************************************************************/
//         Programa principal
/********************************************************************************************************************************/

void   main()
   {

//-----Declaració de les variables------------------------------------------------------------------------------------------------

   int   x, y, i, j, k, m, n, p, c, s, f[NFil], taulell[NFil][NCol];

   char   despl, resposta;

   int   buit, quieta, p_mov, p_rot;   /*Lògics*/

   jugador   *partida, *primer;

   Tquadret   peca[3][3][colors+1], quadret, *q;

   TTros   *Tros;

//--------------------------------------------------------------------------------------------------------------------------------
//-----Joc------------------------------------------------------------------------------------------------------------------------

   partida=(jugador*)malloc(sizeof(jugador));
   primer=partida;

   p=1;
   q=&quadret;

   InicialitzaPeces(peca, q);
   
   srand( (unsigned)time( NULL ) );

//-----Partida--------------------------------------------------------------------------------------------------------------------

   do
   {
      system("cls");
      printf("Introdueix el teu nom i la data d'avui (dia, mes i any)");

      fflush(stdin);
      gets(partida->nom);
      scanf("%d", &partida->data1);
      scanf("%d", &partida->data2);
      scanf("%d", &partida->data3);

      partida->punts=0;

      for   (i=0; i<NFil; i++)   //   Inicialització del taulell
         for   (j=0; j<NCol; j++)
            taulell[j]=0;

      system("cls");
      MostraTaulell();

      buit=1;

//-----Introducció de noves peces-------------------------------------------------------------------------------------------------

      do
      {
         if   (buit!=0)   //   Es col·loca una nova peça al taulell
         {
            c=NumAleatori(7)+1;
            k=NumAleatori(NCol-3)+1;

            ColocaPeca(peca, q, k, c);
            buit=0;
         }

         PintaPeca(peca, quadret, c, taulell);
         quieta=0;

//-----Caiguda d'una peça---------------------------------------------------------------------------------------------------------

         do
         {
            MostraPeces(taulell, c, partida->nom, partida->punts, 0);

            despl=0;   //   Determinació de si s'ha apretat alguna tecla
            Sleep(100);

            if   (_kbhit())
               while   (_kbhit())
                  despl=getch();

            switch   (despl)      //   Moviment de la peça segons la tecla apretada
            {
               case   KEY_SPC:
               case   KEY_UP:      if   (c!=1)
                              {
                                 p_rot=PermisRotar(peca, quadret, c, taulell);

                                 if   (p_rot!=0)
                                    RotaPeca(peca, c);

                                 PintaPeca(peca, quadret, c, taulell);
                                 MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                              }
                              m=1;
                              break;

               case   KEY_LEFT:   if   (c==1)
                              {
                                 x=quadret.fila;
                                 y=quadret.columna-1;
                              }
                              else
                              {
                                 x=peca[1][0][c].fila;
                                 y=peca[1][0][c].columna;
                              }
                              
                              p_mov=Permis(peca, quadret, c, x, y, 0, taulell);
                                 
                              if   (p_mov!=0)
                                 PecaEsquerra(peca, q, c);

                              PintaPeca(peca, quadret, c, taulell);
                              MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                              n=1;
                              break;

               case   KEY_RIGHT:   if   (c==1)
                              {
                                 x=quadret.fila;
                                 y=quadret.columna+1;
                              }
                              else
                              {
                                 x=peca[1][2][c].fila;
                                 y=peca[1][2][c].columna;
                              }
                           
                              p_mov=Permis(peca, quadret, c, x, y, 0, taulell);

                              if   (p_mov!=0)
                                 PecaDreta(peca, q, c);

                              PintaPeca(peca, quadret, c, taulell);
                              MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                              n=1;
                              break;
            }

            MostraPeces(taulell, c, partida->nom, partida->punts, 0);

            despl=0;   //   Determinació de si s'ha apretat alguna tecla
            Sleep(100);

            if   (_kbhit())
               while   (_kbhit())
                  despl=getch();

            switch   (despl)      //   Moviment de la peça segons la tecla apretada
            {
               case   KEY_SPC:
               case   KEY_UP:      if   (m!=1)
                              {
                                 if   (c!=1)
                                 {
                                    p_rot=PermisRotar(peca, quadret, c, taulell);
   
                                    if   (p_rot!=0)
                                       RotaPeca(peca, c);

                                    PintaPeca(peca, quadret, c, taulell);
                                    MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                                 }
                              }
                              break;

               case   KEY_LEFT:   if   (n!=1)
                              {
                                 if   (c==1)
                                 {
                                    x=quadret.fila;
                                    y=quadret.columna-1;
                                 }
                                 else
                                 {
                                    x=peca[1][0][c].fila;
                                    y=peca[1][0][c].columna;
                                 }
                              
                                 p_mov=Permis(peca, quadret, c, x, y, 0, taulell);
                                    
                                 if   (p_mov!=0)
                                    PecaEsquerra(peca, q, c);
   
                                 PintaPeca(peca, quadret, c, taulell);
                                 MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                              }
                              break;

               case   KEY_RIGHT:   if   (n!=1)
                              {
                                 if   (c==1)
                                 {
                                    x=quadret.fila;
                                    y=quadret.columna+1;
                                 }
                                 else
                                 {
                                    x=peca[1][2][c].fila;
                                    y=peca[1][2][c].columna;
                                 }
                           
                                 p_mov=Permis(peca, quadret, c, x, y, 0, taulell);

                                 if   (p_mov!=0)
                                    PecaDreta(peca, q, c);

                                 PintaPeca(peca, quadret, c, taulell);
                                 MostraPeces(taulell, c, partida->nom, partida->punts, 0);
                              }
                              break;
            }
            m=0;
            n=0;

            if   (c==1)
            {
               x=quadret.fila+1;
               y=quadret.columna;
            }
            else
            {
               x=peca[2][1][c].fila;
               y=peca[2][1][c].columna;
            }
            p_mov=Permis(peca, quadret, c, x, y, 0, taulell);   //   Moviment cap abaix de la peça

            if   ((p_mov!=0)&&(despl!=KEY_ESC))
               PecaAbaix(peca, q, c);
            else   if   (despl!=KEY_ESC)
               quieta=1;

            PintaPeca(peca, quadret, c, taulell);

         }while   ((despl!=KEY_ESC)&&(quieta==0));

//--------------------------------------------------------------------------------------------------------------------------------

         partida->punts=partida->punts+PuntsPerPeca;

//-----Esborrat de files plenes---------------------------------------------------------------------------------------------------

         while   (ComprovarLinia(taulell, f))
         {
            s=EsborraLinia(taulell, f);
            partida->punts=partida->punts+PuntsPerFila*s;

            LocalitzaTrossos(Tros, taulell);
            BaixaTrossos(Tros, taulell);
         }

//--------------------------------------------------------------------------------------------------------------------------------

         if   (despl!=KEY_ESC)
         {
            c=NumAleatori(7)+1;
            k=NumAleatori(NCol-3)+1;

            ColocaPeca(peca, q, k, c);
            p_mov=Permis(peca, quadret, c, 1, k, 1, taulell);
         }
      }while   ((despl!=KEY_ESC)&&(p_mov!=0));

      PintaPeca(peca, quadret, c, taulell);
      MostraPeces(taulell, c, partida->nom, partida->punts, 0);
      Sleep(1500);
      system("cls");

      printf("\nJa has perdut\n");
      Sleep(1000);
      system("cls");
      printf("\nVols tornar a jugar? Escriu s/S ó n/N\n");

      do
      {
         resposta=getch();

         if   ((resposta=='s')||(resposta=='S'))
         {
            p++;
            partida->seguent=(jugador*)malloc(sizeof(jugador));
            partida=partida->seguent;
         }
      }while   ((resposta!='s')&&(resposta!='S')&&(resposta!='n')&&(resposta!='N'));

//--------------------------------------------------------------------------------------------------------------------------------

   }while   ((resposta!='n')&&(resposta!='N'));

//--------------------------------------------------------------------------------------------------------------------------------

//-----Retorn de les dades de les partides----------------------------------------------------------------------------------------

   partida=primer;
   system("cls");

   for   (i=1; i<p; i++)
   {
      printf("\n%s, %d/%d/%d\n", partida->nom, partida->data1, partida->data2, partida->data3);

      partida=partida->seguent;
      free(primer);
      primer=partida;
   }
   printf("\n%s, %d/%d/%d\n", partida->nom, partida->data1, partida->data2, partida->data3);
   free(partida);
}

//--------------------------------------------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------------------------------------------

Rutines_v1.c:

#include "Rutines_v1.h"


//===================================================================================
// NOM: NumAleatori
//===================================================================================
// DESCRIPCIÓ:  Funció per generar un número aleatori entre 0 i max
//===================================================================================
int NumAleatori(int max)
{
   int num;

   num=((int)ceil(((double)rand()/RAND_MAX)*(max+1)))%(max+1);

   return num;
}


//===================================================================================
// NOM: Gotoxy
//===================================================================================
// DESCRIPCIÓ: Permet posar el cursor en una posicio donada
//===================================================================================
void gotoxy(int c,int f,HANDLE screen)
{
 COORD position = { c, f };
 SetConsoleCursorPosition(screen,position);
}


//===================================================================================
// NOM: TextColor
//===================================================================================
// DESCRIPCIÓ: Funcio per canviar els colors de texte i fons de la consola DOS
//===================================================================================
void TextColor(int fontcolor,int backgroundcolor,HANDLE screen)
{
   unsigned short color_attribute;
   color_attribute = backgroundcolor;
   color_attribute = _rotl(color_attribute,4) | fontcolor;
   SetConsoleTextAttribute(screen,color_attribute);
}


//===================================================================================
// NOM: MostraTaulell
//===================================================================================
// DATA: 08 / 10 / 2007
//===================================================================================
// DESCRIPCIÓ: Funcio que permet mostrar el tauler de joc.
//===================================================================================
void MostraTaulell(void)
{

   // ------------------------------------------------------------------------------
   // FORMAT TAULELL:
   //
   // El vector FT (Format Taulell) conté a cada posició el codi d'un determinat
   // caràcter ASCII. Si modifiquem els valors  d'aquest vector, l'aparença del
   // taulell, també variarà.
   //   
   // index 0 -> Contorn lateral.
   // index 1 -> Cantonada inferior esquerre.
   // index 2 -> Cantonada inferior dreta.
   // index 3 -> Contorn inferior.
   int FT[4]={186,200,205,188};   
   
   // ------------------------------------------------------------------------------
   // Altres variables:
   int f,c;
   HANDLE  screen= GetStdHandle(STD_OUTPUT_HANDLE);

   // ------------------------------------------------------------------------------   
   for(f=0;f<NFil;f++)
   {
      TextColor(LIGHTGREY,BLACK,screen);

      gotoxy(DespC,DespF+f,screen);
      printf("%c",FT[0]);

      gotoxy(DespC+NCol+1,DespF+f,screen);      
      printf("%c",FT[0]);
   }

   gotoxy(DespC,DespF+f,screen);
   printf("%c",FT[1]);

   for(c=0;c<NCol;c++)
      printf("%c",FT[2]);
   
   printf("%c",FT[3]);

   // ------------------------------------------------------------------------------   
   gotoxy(DespC,DespF+NFil+2,screen);
   for(c=0;c<NCol+2;c++)
      printf("%c",FT[2]);

   gotoxy(DespC,DespF+NFil+4,screen);
   for(c=0;c<NCol+2;c++)
      printf("%c",FT[2]);

}


//===================================================================================
// NOM: MostraMSG
//===================================================================================
// DATA: 09 / 10 / 2007
//===================================================================================
// DESCRIPCIÓ: Funcio que permet mostrar un dels missatges predefinits sobre el
// tauler de joc.
//===================================================================================
void MostraMSG(char *msg,HANDLE screen)
{
   int i,L,C,CC,CF;

   L=strlen(msg); // Longitud de la cadena.
   C=ceil(L/2);  // Punt mig de la cadena.

   CF=floor(NFil/2);
   CC=floor(NCol/2);

   TextColor(RED,BLACK,screen);
   gotoxy(DespC+CC-C,DespF+CF-1,screen);
   for(i=0;i<L+2;i++)
      printf(" ");
   gotoxy(DespC+CC-C,DespF+CF,screen);
   printf(" %s ",msg);
   gotoxy(DespC+CC-C,DespF+CF+1,screen);
   for(i=0;i<L+2;i++)
      printf(" ");   
}


//===================================================================================
// NOM: MostraPeces
//===================================================================================
// DATA: 08 / 10 / 2007
//===================================================================================
// DESCRIPCIÓ: Funcio que permet mostrar les peces que hi hagi en un moment
// determinat. Permet amés anar mostrant la puntuació i el nom del jugador.
//===================================================================================
void MostraPeces(int Tauler[NFil][NCol], int TipusPeces, char *Jugador, int Puntuacio, int Missatge)
{

   // ------------------------------------------------------------------------------
   // Les peces estan representades dins la matriu peces, i cadascuna esta codificada
   // amb un valor entre 0 i 7, que coincideix amb l'index del següent vector que
   // n'especifica el color.
   //
   // index 0 -> No hi ha peça.
   // index 1 -> Color de fons de la peça P.
   // index 2 -> Color de fons de la peça S.
   // index 3 -> Color de fons de la peça L.
   // index 4 -> Color de fons de la peça T.
   // index 5 -> Color de fons de la peça LL.
   // index 6 -> Color de fons de la peça RL.
   // index 7 -> Color de fons de la peça LZ.
   // index 8 -> Color de fons de la peça RZ.
   int CL[9]={BLACK,LIGHTMAGENTA,GREEN,BLUE,CYAN,YELLOW,BROWN,MAGENTA,RED};

   // ------------------------------------------------------------------------------
   // Altres variables:
   int f,c;
   char msg[25];
   HANDLE  screen= GetStdHandle(STD_OUTPUT_HANDLE);   


   // ------------------------------------------------------------------------------
   // Dibuixem les peces:
   for(f=0;f<NFil;f++)
      for(c=0;c<NCol;c++)
      {      
         gotoxy(DespC+c+1,DespF+f,screen);         
         TextColor(CL[Tauler[f][c]],BLACK,screen);

         // Peces Discretes:
         if(TipusPeces==0)
            printf("%c",254);
         // Peces continues:
         else
            printf("%c",177);
      }

   // ------------------------------------------------------------------------------
   // Mostrem el nom del jugador i la puntuació:
   gotoxy(DespC+1,DespF+NFil+1,screen);
   TextColor(LIGHTGREY,BLACK,screen);
   printf("PLAYER: ");
   TextColor(RED,BLACK,screen);
   printf("%s\n",Jugador);


   gotoxy(DespC+1,DespF+NFil+3,screen);
   TextColor(LIGHTGREY,BLACK,screen);
   printf("SCORE: ");
   TextColor(RED,BLACK,screen);
   printf(" %d\n",Puntuacio);

   // ------------------------------------------------------------------------------
   // Missatges predefinits. Cadascun té un codi:
   switch(Missatge)
   {
      case 1:
         strcpy(msg,"PAUSE");         
         MostraMSG(msg,screen);
         break;
      case 2:
         strcpy(msg,"GAME OVER");
         MostraMSG(msg,screen);
         break;      

   }

}

Rutines_v1.h:

//===================================================================================
#include <math.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>

//===================================================================================
// Definicio de colors
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define BROWN 6
#define LIGHTGREY 7
#define DARKGREY 8
#define LIGHTBLUE 9
#define LIGHTGREEN 10
#define LIGHTCYAN 11
#define LIGHTRED 12
#define LIGHTMAGENTA 13
#define YELLOW 14
#define WHITE 15
#define BLINK 128

//===================================================================================
// Definició de tecles
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_ESC 27

//===================================================================================
// Dimensions del taulell de joc
#define NFil 28
#define NCol 18

//===================================================================================
// Desplaçament del taulell respecte la cantonada superior esquerre
#define DespF 5
#define DespC 27

//===================================================================================
// Definicio de puntuacions
#define PuntsPerPeca 1
#define PuntsPerFila 10

//===================================================================================
// Declaració de funcions
int NumAleatori(int);
void gotoxy(int,int,HANDLE);
void TextColor(int,int,HANDLE);
void MostraTaulell(void);
void MostraMSG(char,HANDLE);
void MostraPeces(int [NFil][NCol],int,char*,int,int);

Muchas gracias por ayudarme.