el buscaminas en c

Iniciado por chivis cristian, 16 Diciembre 2011, 22:33 PM

0 Miembros y 1 Visitante están viendo este tema.

chivis cristian

tengo un problema con ese codigo fuente y no se porque alguien que me ayude por favor el error esta en la linea  189 esta hecho en c recopilen por favor y demen una ayudita

#include <stdio.h>
#include <stdlib.h>
#include "buscaminas.h"

struct casilla **tablero;   /* tabla dinámica de 2 dimensiones */

int x,   /* número de columnas del tablero */
   y,   /* número de filas del tablero */
   minas,   /* número de minas */
   destapadas = 0,   /* número de casillas destapadas */
   banderas = 0,   /* banderas (posibles minas) puestas */
   pos_x = 0,   /* componente x del cursor */
   pos_y = 0,   /* componente y del cursor */
   seg = 1,   /* tiempo acumulado en segundos */
   modo_juego;   /* 1.- principiante 2.- intermedio 3.- experto 0.- personalizado */

/* prototipos de funciones */
void GenerarMinas ();
void menu ();
void main ();

/* protoripos de funciones definidas en ficheros.c */
void GuardarResultado (int, int);
void GuardarPartida (int, int, int, int, int, int, int, int, int, struct casilla **);
void CargarPartida (int *, int *, int *, int *, int *, int *, int *, int *, int *, struct casilla ***);
void MostrarResultados (int);


/* devuelve los segundos del reloj */
int Segundos ()
{
   struct tm *tiempo;
   time_t t;
   time (&t);
   tiempo = localtime(&t);
   return tiempo->tm_sec;
}

/* muestra el tablero del juego por pantalla según el modo:
0: modo normal
1: todas las casillas visibles (cuando se pierde)
2: todas las casillas tapadas (cuando el juego está en pausa) */
void MostrarTablero (int modo)
{
   int ancho,
      alto;

   printf ("PR%c\n\n   ",1);

   /* imprime el eje de coordenadas x */
   for (ancho=0; ancho<x; ancho++)
      printf ("%3d",ancho);

   printf ("\n   ");

   /* imprime líneas debajo del eje de coordenadas x */
   for (ancho=0; ancho<x*3; ancho++)
      printf ("%c",95);

   /* imprime la primera línea vertical del eje de coordenadas y */
   printf ("\n  %c\n",179);

   /* imprime el tablero por líneas*/
   for (alto=0; alto<y; alto++)
   {
      /* imprime el número de fila y una raya vertical al primcipio de cada línea */
      printf ("%2d%c",alto,179);
      /* imprime todas las casillas de la línea */
      for (ancho=0; ancho<x; ancho++)
      {
         /* si la casilla está oculta y el modo es 0 o el modo es 2 se imprime el
         cursor (si tiene) y un cuadrado negro */
         if (((tablero[ancho][alto].estado == oculto)&&(!modo)) || (modo == 2))
         {
            printf (" %c%c",tablero[ancho][alto].sel,219);
            continue;
         }

         /* si la casilla está visible y el modo es 0 o el modo es 1 se imprime el
         cursor (si tiene) y un cuadrado negro y lo que corresponda */
         if (((tablero[ancho][alto].estado == visible)&&(!modo)) || (modo == 1))
         {
            /* una mina */
            if (tablero[ancho][alto].ady == 9)
            {
               printf (" %c%c",tablero[ancho][alto].sel,15);
               continue;
            }
            /* un cuadro gris (si la casilla tiene 0 minas adyacentes) */
            if (tablero[ancho][alto].ady == 0)
            {
               printf (" %c%c",tablero[ancho][alto].sel,177);
               continue;
            }
            /* el número de minas adyacentes */
            printf (" %c%d",tablero[ancho][alto].sel,tablero[ancho][alto].ady);
            continue;
         }

         /* si la casilla está marcada como mina se imprime una bandera */
         if (tablero[ancho][alto].estado == mina)
         {
            printf (" %c%c",tablero[ancho][alto].sel,4);
            continue;
         }

         /* si la casilla está marcada como dudosa se imprime una interrogación */
         if (tablero[ancho][alto].estado == dudoso)
         {
            printf (" %c?",tablero[ancho][alto].sel);
            continue;
         }
      }
      /* se imprimen barras verticales entre línea y línea */
      if (alto != y-1)
         printf ("\n  %c\n",179);
   }
   printf ("\n\n");
}

/* destapa todas las casillas anexas de una que no tiene minas adyacentes */
void DestaparAnexas (int pos_x,int pos_y)
{
   int   i,
      j;

   /* destapa la casilla */
   tablero[pos_x][pos_y].estado = visible;

   for (i=-1; i<2; i++)
      for (j=-1; j<2; j++)
         if (((pos_x+i>=0)&&(pos_x+i<x))&&((pos_y+j>=0)&&(pos_y+j<y)))
            if (tablero[pos_x+i][pos_y+j].estado != visible)
            {
               /* si la casilla estaba marcada como mina, se quita la bandera */
               if (tablero[pos_x+i][pos_y+j].estado == mina)
                  banderas--;

               /* si la casilla tampoco tiene adyacentes se hace una llamada
               recursiva */
               if (tablero[pos_x+i][pos_y+j].ady == 0)
                  DestaparAnexas (pos_x+i,pos_y+j);

               tablero[pos_x+i][pos_y+j].estado = visible;
               destapadas++;
            }
}

/* gestiona la partida segun el modo:
0: modo normal
1: cuando se pierde
2: cuando el juego está en pausa */
void Partida (int modo)
{
   int tiempo = Segundos (); /* decide cuando hay que cambiar los segundos */

   system ("cls");

   MostrarTablero (modo);

   /* si se han destapado todas las casillas sin minas (cuando se gana) */
   if (destapadas == (x*y)-minas)
   {
      printf ("\nHas ganado!!!\n");
      printf ("\n1.. Volver a jugar");
      printf ("\n2.. Volver al menu");
      /* no se guardan los mejores de modos personalizados */
      if (modo_juego)
         printf ("\n3.. Guardar resultado");

      /* se restauran los datos de la partida */
      pos_x = pos_y = 0;
      tiempo = seg;
      seg = 1;
      banderas = 0;
      destapadas = 0;

      switch (getch ())
      {
      case '1':   /* volver a jugar en el mismo modo */
         GenerarMinas ();

      case '2':   /* volver al menú principal */
         menu ();

      case '3':   /* guardar el resultado */
         /* no se guardan los mejores de modos personalizados */
         if (modo_juego)
            GuardarResultado (tiempo, modo_juego);

      default:
         Partida (0);
      }
   }

   /* si se ha destapado alguna casilla con mina (se ha perdido) */
   if (modo == 1)
   {
      printf ("\nHas perdido\n");
      printf ("\n1.. Menu principal");
      printf ("\n2.. Volver a intentarlo");

      /* se restauran los datos de la partida */
      pos_x = pos_y = 0;
      seg = 1;
      banderas = 0;
      destapadas = 0;

      switch (getch ())
      {
      case '1':   /* volver al menú principal */
         menu ();

      case '2':   /* volver a jugar en el mismo modo */
         GenerarMinas ();

      default:
         Partida (1);
      }
   }

   /* si el juego está en pausa */
   if (modo == 2)
   {
      printf ("\nPulsa una tecla para continuar la partida");
      getch ();
      Partida (0);
   }

   printf ("\nEnter:destapar  m:mina  d:dudosa  o:desmarcar  p:pausa  g:guardar r:retirarse\n");

   /* imprime el número de banderas restantes y el tiempo acumulado */
   printf ("banderas restantes: %d\n", minas-banderas);
   printf ("segundos:%4d",seg);

   /* mientras no se pulse una tecla, seg se incrementa cada segundo */
   while (!kbhit ())
   {
      if (tiempo != Segundos ())
      {
         printf ("\rsegundos:%4d",seg++);
         tiempo = Segundos ();
      }
   }

   switch (tolower (getch ()))
   {
   case 224:   /* si se ha pulsado una tecla del cursor */

      switch (getch ())
      {
      case 72:   /* flecha arriba */
         if (pos_y-1 >= 0)
         {
            tablero[pos_x][pos_y].sel = ' ';
            pos_y = pos_y-1;
            tablero[pos_x][pos_y].sel = '>';
         }
         Partida (0);

      case 80:   /* flecha abajo */
         if (pos_y+1 < y)
         {
            tablero[pos_x][pos_y].sel = ' ';
            pos_y = pos_y+1;
            tablero[pos_x][pos_y].sel = '>';
         }
         Partida (0);

      case 75:   /* flecha izquierda */
         if (pos_x-1 >= 0)
         {
            tablero[pos_x][pos_y].sel = ' ';
            pos_x = pos_x-1;
            tablero[pos_x][pos_y].sel = '>';
         }
         Partida (0);

      case 77:   /* flecha derecha */
         if (pos_x+1 < x)
         {
            tablero[pos_x][pos_y].sel = ' ';
            pos_x = pos_x+1;
            tablero[pos_x][pos_y].sel = '>';
         }
         Partida (0);
      }

   case 13:   /* si se pulsa enter (destapar) */
      /* si la casilla destapada es una mina, se pierde */
      if (tablero[pos_x][pos_y].ady == 9)
         Partida (1);

      /* si no es una mina */
      else
         /* si no tiene minas adyacentes */
         if (tablero[pos_x][pos_y].ady == 0)
         {
            /* si había una bandera, se quita */
            if (tablero[pos_x][pos_y].estado == mina)
               banderas--;

            /* se destapan las casillas anexas */
            DestaparAnexas (pos_x, pos_y);
         }

         /* si tiene minas adyacentes */
         else
         {
            /* si había una bandera, se quita */
            if (tablero[pos_x][pos_y].estado == mina)
               banderas--;

            /* se marca como casilla visible */
            tablero[pos_x][pos_y].estado = visible;
         }

         destapadas++;
         Partida (0);

   case 'm':   /* si se pulsa 'm' (marcar como mina) */
      if ((tablero[pos_x][pos_y].estado != visible)&&(tablero[pos_x][pos_y].estado != mina))
      {
         tablero[pos_x][pos_y].estado = mina;
         banderas++;
      }

      Partida (0);

   case 'd':   /* si se pulsa 'd' (marcar como dudosa) */
      if (tablero[pos_x][pos_y].estado != visible)
      {
         /* si había una bandera, se quita */
         if (tablero[pos_x][pos_y].estado == mina)
            banderas--;

         tablero[pos_x][pos_y].estado = dudoso;
      }

      Partida (0);

   case 'o':   /* si se pulsa 'o' (desmarcar casilla) */
      if (tablero[pos_x][pos_y].estado != visible)
      {
         /* si había una bandera, se quita */
         if (tablero[pos_x][pos_y].estado == mina)
            banderas--;

         tablero[pos_x][pos_y].estado = oculto;
      }

      Partida (0);

   case 'p':   /* si se pulsa 'p' (parar el juego) */
      Partida (2);

   case 'g':   /* si se pulsa 'g' (guardar el juego) */
      GuardarPartida (x, y, minas, destapadas, banderas, pos_x, pos_y, seg, modo_juego, tablero);

   case 'r':   /* si se pulsa 'r' (retirarse y volver al menú principal) */
      pos_x = pos_y = 0;
      seg = 1;
      banderas = 0;
      destapadas = 0;
      menu ();

   default:
      printf ("\nOpcion incorrecta, pulse enter para elegir una opcion");
      getch ();
      Partida (0);
   }
}

/* calcula de cada casilla las minas que tiene alrededor y guarda el valor en
tablero[ancho][alto].ady; guarda un 9 si la casilla contiene una mina y un 0
si no tiene minas adyacentes */
void CalcularMinas ()
{
   int alto,
      ancho,
      i,
      j;

   /* recorre las columnas del tablero */
   for (ancho=0; ancho<x; ancho++)
      /* recorre las filas del tablero para cada columna */
      for (alto=0; alto<y; alto++)
         /* calcula las casillas adyacentes con mina */
         for (i=-1; i<2; i++)
            for (j=-1; j<2; j++)
               if (tablero[ancho][alto].ady != 9)
                  if (((ancho+i>=0)&&(ancho+i<x))&&((alto+j>=0)&&(alto+j<y)))
                     if (tablero[ancho+i][alto+j].ady == 9)
                        tablero[ancho][alto].ady++;

   Partida (0);
}

/* genera las minas de forma aleatoria */
void GenerarMinas ()
{
   int ancho,
      alto,
      minas_aux;   /* se decrementa cuando se inserta una mina */

   minas_aux = minas;

   /* reserva memoria para el tablero */
   tablero = (struct casilla **)malloc(x*sizeof (struct casilla *));
   for (ancho=0; ancho<x; ancho++)
      tablero[ancho] = (struct casilla *)malloc(y*sizeof (struct casilla));

   /* se inicializa el generador de números aleatorios */
   srand(time(NULL));

   /* se recorre el tablero */
   for (ancho=0; ancho<x; ancho++)
   {
      for (alto=0; alto<y; alto++)
         /* si hay o se va a poner una mina en la casilla */
         if (((minas_aux)&&(rand()%20 == 0))||(tablero[ancho][alto].ady == 9))
         {
            if (tablero[ancho][alto].ady != 9)
               minas_aux--;

            tablero[ancho][alto].ady = 9;
         }
         /* si la casilla no tiene mina */
         else
            tablero[ancho][alto].ady = 0;

      /* si se ha recorrido toda la tabla y todavía no se han colocado todas las
      minas, se vuelve a recorrer el tablero */
      if ((ancho == x-1)&&(minas_aux))
         ancho = -1;
   }

   /* se quita el cursor de todas las casillas */
   for (ancho=0; ancho<x; ancho++)
      for (alto=0; alto<y; alto++)
      {
         tablero[ancho][alto].estado = oculto;
         tablero[ancho][alto].sel = ' ';
      }

   /* y se pone en la primera */
   tablero[0][0].sel = '>';

   CalcularMinas ();
}

/* permite elegir uno de los modos de juego: la anchura de el tablero se guarda en la
variable global x, la altura en y, el número de minas en minas y el modo de juego
en modo_juego */
void ElegirTamano ()
{
   system ("cls");

   printf ("\t\t**** ESCOGER NIVEL ****\n");
   printf ("\n1.. Principiante (9x9, 10 minas)");
   printf ("\n2.. Intermedio (16x16, 40 minas)");
   printf ("\n3.. Experto (25x16, 99 minas)");
   printf ("\n4.. Personalizado");
   printf ("\n5.. Volver al menu principal");

   switch (getch ())
   {
   case '1':   /* modo principiante */
      x = 9;
      y = 9;
      minas = 10;
      modo_juego = 1;
      GenerarMinas ();

   case '2':   /* modo intermedio */
      x = 16;
      y = 16;
      minas = 40;
      modo_juego = 2;
      GenerarMinas ();

   case '3':   /* modo experto */
      x = 25;
      y = 16;
      minas = 99;
      modo_juego = 3;
      GenerarMinas ();

   case '4':   /* modo personalizado */
      system ("cls");

      modo_juego = 0;

      printf ("Introduzca la anchura del tablero (2-25): ");
      scanf (" %d",&x);
      /* comprueba la anchura del tablero */
      if ((x > 25)||(x < 2))
      {
         printf ("\n\nla anchura del tablero no puede ser mayor de 30 ni menor de 2"
         ", pulse enter para continuar");
         getch ();
         ElegirTamano ();
      }

      printf ("\nIntroduzca la altura del tablero (2-22): ");
      scanf (" %d",&y);
      /* comprueba la altura del tablero */
      if ((y > 22)||(y < 2))
      {
         printf ("\n\nla altura del tablero no puede ser mayor de 22 ni menor de 2"
         ", pulse enter para continuar");
         getch ();
         ElegirTamano ();
      }

      printf ("\nIntroduzca el numero de minas (1-(alto*ancho-1)): ");
      scanf (" %d",&minas);
      /* comprueba el número de minas */
      if ((minas >= x*y)||(minas < 1))
      {
         /* comprueba si se quieren introducir mas minas que casillas */
         if (minas >= x*y)
            printf ("\n\nVamos a meter todas esas minas ahi???");
         else
            printf ("\n\nNo seria un poco facil??? Anda, mete mas minas");

         printf (", pulse enter para continuar");
         getch ();
         ElegirTamano ();
      }

      GenerarMinas ();

   case '5':   /* volver al menú */
      menu ();

   default:
      printf ("\nOpcion incorrecta, pulse enter para elegir una opcion");
      getch ();
      ElegirTamano ();
   }
}

/* imprime un menú por pantalla con las opciones del juego */
void menu ()
{
   system ("cls");

   printf ("\t\t**** BUSCAMINAS PRO ****");
   printf ("\n\nSeleccione una opcion:\n");
   printf ("\n1.. Nueva partida");
   printf ("\n2.. Cargar Partida");
   printf ("\n3.. Los mejores modo principiante");
   printf ("\n4.. Los mejores modo intermedio");
   printf ("\n5.. Los mejores entre los mejores (modo experto)");
   printf ("\n6.. Mostrar creditos");
   printf ("\n0.. Salir");

   switch (getch ())
   {
   case '1':   /* nueva partida */
      system ("cls");
      ElegirTamano ();
      break;

   case '2':   /* cargar partida */
      CargarPartida (&x, &y, &minas, &destapadas, &banderas, &pos_x, &pos_y, &seg, &modo_juego, &tablero);

   case '3':   /* top principiantes */
      MostrarResultados (1);

   case '4':   /* top intermedio */
      MostrarResultados (2);

   case '5':   /* top expertos */
      MostrarResultados (3);

   case '6':   /* mostrar créditos */
      system ("cls");
      main ();

   case '0':   /* salir del juego */
      free (tablero);
      exit (0);

   default:
      printf ("\nOpcion incorrecta, pulse enter para elegir una opcion");
      getch ();
      menu ();
   }
}

/* muestra los créditos del programa */
void intro_1 ()
{
   printf("          !\n");
   printf("         !__.     ;     '_\n");
   printf("        !____.   ._,  `!__\n");
   printf("     ^;  ,____\"  ;__` ;___             ** UNIVERSIDAD SAN PABLO - CEU **\n");
   printf("    ,__   _____ .___,`___,\n");
   printf("   \"__\"   `;___\" ;__`,_;^\n");
   printf("   ___.     ____.._, \"\n");
   printf("   __^       ___! ;   `\"^           Practica 3 MPI. Buscaminas\n");
   printf("  ^,         ^___   ,___\n");
   printf("  `          `___.  ;__^\n");
   printf("              ;__. ,__!\n");
   printf("              ___. ;!`  '           Alumno: Bartolome Molina Menchen\n");
   printf("              ___.   _;___!.\n");
   printf("              ___.  .;____;,        Profesor: Dr. D. David Losada Carril\n");
   printf("              ___.     .,\n");
   printf("              ___.                  Curso: 2001/2002\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");
   printf("              ___.\n");

   getch();
}

/* muestra los créditos del programa */
void intro_2 ()
{
   printf("\n");
   printf("                               Bartolome Molina\n");
   printf("\n");
   printf("       MMM\n");
   printf("      M                                           M\n");
   printf("      M\n");
   printf("     M  MM  MM   M  MMM   MMM   MMMM  MM MM  MM   M  MM  MM   MMMM  MMM\n");
   printf("     M M M M M   M M     M  M  M   M M MM M M M  MM M M M M  M   M M\n");
   printf("     MM  M   M  M  M    M     M   M    M  MM  M  M    MM  M M   M  M\n");
   printf("     M  M   M  MM   MM  M     M   M    M  M  M   M    M  M  M   M   MM\n");
   printf("    M   M   M M M M  M  M   M M MMM M M  M   M M M M M   M MM MMM M  M\n");
   printf("    MMMM    MM  MMMMM   MMMM  MM  MM  M  M   MM  MM  M   MM MM  MMMMM\n");
   printf("\n");
   printf("\n");
   printf("                                                      M  MM MM  MM MMM\n");
   printf("                                                     MMMM MM M M  M  M\n");
   printf("                                                      M   M  MM  M   M\n");
   printf("                                                      M  M   M   M   M\n");
   printf("                                                     M   M  M    M  M\n");
   printf("                                                     MMMM   M    MMM\n");
   printf("                                                     M\n");
   printf("                                                     M\n");
   printf("                                                    M\n");

   getch();
}

void main ()
{
   intro_1 ();
   system ("cls");
   intro_2 ();
   menu ();
}

Ferno

Primero que nada, usa las etiquetas GeSHi para postear código!
Segundo, ¿Podrías especificar el error? ¿Que te dice el compilador?

<<<-Basura->>>

trata de postear el problema no todo el código  :rolleyes: :rolleyes: :rolleyes:
<<<--Basura-->>>