Menú principal
Inicio
Noticias
Descargas
Tecnicoanonimo
Contacte con nosotros
Presentación
Contenidos
Hardware
Software
Redes e Internet
Linux
Scripts Linux
Microsoft / Windows
Programación
Herramientas
Editor HTML
Visor CSS
Verificar E-mail
Crear PDF
Calculadora subredes
Ping
Test de velocidad
IP pública
Verificar dominio
Buscar en Google


Buscar en Wikipedia

Buscar en Wikipedia



Creative Commons License
Juego de los barcos en C PDF Imprimir E-Mail
Programa para jugar a los barcos, llevando puntuaciones. #include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define FILASTOTAL 8                                     //Filas del tablero
#define COLUMNASTOTAL 8                                  //Columnas del tablero
#define INTENTOSMAXIMOS 32                                //Numero de intentos
#define BARCOSTOTAL 5                                    //numero de barcos totales
    struct tipopuntuacion{                                //Estructura que define la puntuaciÛn
            char nombre[25];
         int puntos;
   };
   char tablabarcos[FILASTOTAL][COLUMNASTOTAL];             //Array que contiene la configuraciÛn del tablero
   char tablaintentos[FILASTOTAL][COLUMNASTOTAL];           //Array que contiene los intentos del usuario
   int contador;                                            //Contador  de intentos
   int estado;                                              //Indica si un barco ha sido hundiodo o ha sido agua
   void pensarbarcos();                                     //FunciÛn que piensa los barcos al azar
   void inicializar();                                      //FunciÛn que pone inicializa los array
   void verbarcos();                                        //FunciÛn que muestra el estado de la partida
   void vertablero();                                       //FunciÛn que muestra la configuraciÛn del tablero una vez terminado el juego
   void aceptarbarcos();                                    //FunciÛn para que el usuario meta la fila y la columna
   void comprobar(int,int);                                 //FunciÛn que comprueba si ha sido hundido o agua
   void ganar();                                            //FunciÛn que visualiza un grafico si se gana
   void perder();                                          //FunciÛn que muestra un grafico diferente al anterior si se pierde
   void bienvenida();                                       //FunciÛn que muestra un gr·fico de bienvenida
   void despedida();                                        //Funcion que muestra el grafico de despedida
   int fcomppunt(const void *pelem1,const void *pelem2); //FunciÛn de comparaciÛn para el ranking de puntos
    int contarreg(FILE *);                                  //FunciÛn quecuenta los registros que hay en el fichero
main(){
    struct tipopuntuacion punt,puntuaciones[100];
    int intentos, cuentaatras, puntos,registros,contadoreg,contadorcolor;
   char confirmacion;
   FILE *pfich;
   pfich=fopen("PUNTUACION.DAT","a+");    //abrimos el fichero de puntuaciones
   confirmacion='s';
   bienvenida();
   while(confirmacion=='s' || confirmacion=='S'){ //mientras que la confirmaciÛn sea 's'  se sigue jugando.
   estado=2;                                      //inicializaciÛn de las variables necesarias.
   intentos=0;
   contador=0;
   puntos=0;
   contadorcolor=0;
   cuentaatras=INTENTOSMAXIMOS;
   clrscr();
   randomize();
   inicializar();                                 //inicializamos los array
     pensarbarcos();                                //ponemos los barcos
   while(contador<BARCOSTOTAL && intentos<INTENTOSMAXIMOS){ //mientras que no se hayan encontrado los barcos y no se hayan superado los intentos se sigue jugando
      verbarcos();                                          //Visualizamo el estado del tablero
      if (estado==0){                                       //Comprobamos el esado si es = a 0 es agua y sino hemos hundido un barco
              textcolor(9);                                   //con textcolor lo que hacemos es cambiar el color de texto
            puntos=puntos-1;                                //si es agua quitamos 3 puntos
              cprintf("       Agua");                         //visualizamos si es agua o no
      }else{
          if (estado==1){
             textcolor(12);
            puntos=puntos+15;                               //Si se ha hundido un barco sumamos 15 puntos
            cprintf("      Hundido");
         }

      }
      textcolor(14);
      cprintf("            Te quedan %i intentos.     Y %i barcos por encontrar.",cuentaatras, BARCOSTOTAL-contador);   //mensaje de los intentos y barcos
      printf("\n\n");                                                                                                   //que quedan por hundir
       aceptarbarcos();       //pedimos que meta un barco
      intentos++;            //aumentamos el contaodr de intentos
      cuentaatras--;         //Disminuimos es 1 a la cuenta atras
      clrscr();
   }

       if (estado==0){           //CondiciÛn que suma o resta la ultima accion antes de salir del while anterior
            puntos=puntos-1;
      }else{
          if (estado==1){
            puntos=puntos+15;
         }
      }


   if(intentos<INTENTOSMAXIMOS){  //condiciÛn que identifica si hemos ganado o perdido
      puntos=puntos+50;
       ganar();                    //si hemos ganado nos muestra el grafico de ganador
   }else{
      if(puntos<0){
           puntos=0;
      }
       perder();                   //si hemos perdido nos muestra el grafico de perdedor
       vertablero();               //nos muestra como estaban colocados los barcos
   }

     printf("\n\n");

   contadoreg=0;                     //inicializamos el contador de regitros a 0
   fseek(pfich,0,2);                 //colocamos el puntaro al final del fichero
   printf("Dame un nombre: ");
   gets(punt.nombre);                 //aceptamos un nombre
   punt.puntos=puntos;                //metemos los puntos en la estructura
   fwrite(&punt,sizeof(struct tipopuntuacion),1,pfich);//escribimos en el fichero

      registros=contarreg(pfich);  //contaamos los registros mediante la funciÛn contarreg
      fseek(pfich,0,0);            //colocamos el puntero al inicio del fichero
      fread(puntuaciones,sizeof(struct tipopuntuacion),registros,pfich);//leemos los registros y lo metemos en un array de estructuras
      qsort(puntuaciones,registros,sizeof(struct tipopuntuacion),fcomppunt); //ordenamos el array en orden descendente
      clrscr();
      textcolor(10);
      cprintf("--------------------------------------------------------------------------------");
      printf("\n");
      cprintf("                           TABLA DE PUNTUACIONES                            ");
      printf("\n");
      cprintf("--------------------------------------------------------------------------------");
      printf("\n\n");
      cprintf("                            Usuario     Puntos                             ");
      printf("\n");
      cprintf("********************************************************************************");
      printf("\n");

      while(contadoreg<registros){          //Visualizamos las puntuaciones
         if(contadorcolor%2!=0){
             textcolor(14);
         }else{
             textcolor(23);
         }
          printf("\n\t");

         cprintf("%25s",puntuaciones[contadoreg].nombre);
         printf("\t");

         cprintf("%4i",puntuaciones[contadoreg].puntos);
         contadoreg++;
         contadorcolor++;
      }
       textcolor(14);
   printf("\n");
    cprintf("Volver a Jugar: ");
   confirmacion=getche();
   }
   despedida();
   getche();
}

void aceptarbarcos(){        //Funcion para que el usaurios introduzca los barcos
    int fila,columna;         //Variables necesarias

    do{                           //no sale del bucle mientras que no sea un numero comprendido entre 1 y las filas del tablero
       printf("Dame una fila: ");
        scanf("%i",&fila);
      fflush(stdin);
   }while(fila<1||fila>FILASTOTAL);
   do{                              //no sale del bucle mientras que no sea un numero comprendido entre 1 y las columnas del tablero
       printf("Dame una columna: ");
        scanf("%i",&columna);
      fflush(stdin);
   }while(columna<1||columna>COLUMNASTOTAL);
   if(tablaintentos[fila-1][columna-1]=='t'){    //si las coorenadas ya estan metidas volvemos a pedir coorenadas
      printf("Inserta una coordenada que no estÈ en el tablero: \n");
       aceptarbarcos();
   }else{
   tablaintentos[fila-1][columna-1]='t';
   comprobar(fila,columna);      //comprobamos si lo que ha introducido el usuario es agua o no
   }


}

void comprobar(int fila,int columna){
        if(tablabarcos[fila-1][columna-1]=='b'){   //si lo que hemos introducido es igual a b es que hemos hundido un barco
          estado=1;                               //poemos el estado a 1
         contador++;                             //aumentadmos el contador de hundidos
      }else{
          estado=0;                               //sino ponemos estado en 0
      }
}

void inicializar(){                            //iniciaciÛn de los arrays
    static int j=0,k=0;
   for(j=0;j<8;j++){
        for(k=0;k<8;k++){
        tablabarcos[j][k]='~';
      }
   }
   for(j=0;j<8;j++){
        for(k=0;k<8;k++){
        tablaintentos[j][k]=' ';
      }
   }
}

void pensarbarcos(){                           //colocaciÛn de barcos
    int i=0, numerofila=0, numerocolumna=0;
    numerofila=random(FILASTOTAL);        //seleccion al azar de una fila
    numerocolumna=random(COLUMNASTOTAL);  //seleccion al azar de una columna
    while(i<BARCOSTOTAL){ //mientras que i sea menor que los barcos a poner
              //CondiciÛn que verifica que el barco no se coloca pegado a otro
       if(tablabarcos[numerofila][numerocolumna]!='b' && tablabarcos[numerofila-1][numerocolumna]!='b' && tablabarcos[numerofila+1][numerocolumna]!='b' && tablabarcos[numerofila][numerocolumna+1]!='b' && tablabarcos[numerofila][numerocolumna-1]!='b' && tablabarcos[numerofila+1][numerocolumna+1]!='b' && tablabarcos[numerofila+1][numerocolumna-1]!='b' && tablabarcos[numerofila-1][numerocolumna+1]!='b' && tablabarcos[numerofila-1][numerocolumna-1]!='b'){
              tablabarcos[numerofila][numerocolumna]='b';
            i++;
      }
   numerofila=random(FILASTOTAL);
   numerocolumna=random(COLUMNASTOTAL);
   }

}

void verbarcos(){   //FunciÛn que construye el tablero para ver los barcos
    static int i,j=0,k=0;
   textcolor(14);
   cprintf("Tiene que encontrar %i barcos de longitud 1 dando el numero de fila y de columna.",BARCOSTOTAL);
   printf("\n");
   printf("\t\t    ---------------------------------\n");
   printf("\t\t    |");
   for(i=0;i<COLUMNASTOTAL;i++){
   textcolor(10);
   cprintf(" %i",i+1);
   printf(" |");
   }
   printf("\n");
   printf("\t\t-------------------------------------\n");

   for(j=0;j<FILASTOTAL;j++){
       printf("\t\t| ");
      textcolor(10);
      cprintf("%i ",j+1);
      printf("|");
        for(k=0;k<COLUMNASTOTAL;k++){
          if(tablaintentos[j][k]!=' '){
             if(tablabarcos[j][k]=='b'){
                textcolor(12);
            }else{
                textcolor(9);
            }
               cprintf(" %c ",tablabarcos[j][k]);
               printf("|");
            }else{
                 printf("   |");
        }
      }
      printf("\n") ;
      printf("\t\t-------------------------------------\n");
   }
}
void vertablero(){
    static int i,j=0,k=0;            //FunciÛn que nos muestra la configuraciÛn del tablero
   clrscr();
   textcolor(10);
   cprintf("               La configuracion del tablero es:        ");
   printf("\n\n");
   printf("\t\t    ---------------------------------\n");
   printf("\t\t    |");
   for(i=0;i<COLUMNASTOTAL;i++){
   textcolor(10);
   cprintf(" %i",i+1);
   printf(" |");
   }
   printf("\n");
   printf("\t\t-------------------------------------\n");

   for(j=0;j<FILASTOTAL;j++){
       printf("\t\t| ");
      textcolor(10);
      cprintf("%i ",j+1);
      printf("|");
        for(k=0;k<COLUMNASTOTAL;k++){

             if(tablabarcos[j][k]=='b'){
                textcolor(12);
            }else{
                textcolor(9);
            }
               cprintf(" %c ",tablabarcos[j][k]);
               printf("|");
      }
      printf("\n") ;
      printf("\t\t-------------------------------------\n");
   }
   printf("Pulse una tecla para continuar");
     getche();

}


int contarreg(FILE *pfich){              //Funcion para contar los registros
    int bytes;
   fseek(pfich,0,2);
   bytes=ftell(pfich);
   return bytes/sizeof(struct tipopuntuacion);
}

 int fcomppunt(const void *pelem1,const void *pelem2){      //Funcion de comparacion
          struct tipopuntuacion punt1,punt2;
      punt1=*(struct tipopuntuacion *)pelem1;
      punt2=*(struct tipopuntuacion *)pelem2;
      return punt2.puntos-punt1.puntos;

 }
                                                       //Funcion si se gana
void ganar(){
  printf("\t\t                      |\\\n");
   printf("\t\t                      | \\\n");
   printf("\t\t                      |  \\\n");
   printf("\t\t                      |   \\\n");
   printf("\t\t                      |    \\\n");
   printf("\t\t                      |     \\\n");
   printf("\t\t                      |     /\n");
   printf("\t\t                      |    /\n");
   printf("\t\t                      |   /\n");
   printf("\t\t                      |  /\n");
   printf("\t\t                      | /\n");
   printf("\t\t                      |/\n");
    printf("\t\t                      |\n");
   printf("\t\t                      |\n");
    printf("\t\t\\-------------------------------------------/\n");
    printf("\t\t \\-----------------------------------------/\n");
   printf("\t\t  \\---------------------------------------/\n");
   printf("\t\t   \\-------------------------------------/\n");
   printf("\t\t    \\-----------------------------------/  \n ");
   printf("\t\t\t|-----------------------|\n");
   printf("\t\t\t| Enhorabuena ha ganado |\n");
   printf("\t\t\t|-----------------------|\n");

  }
void perder(){                                //Funcion si e pierde
   printf("\t\t                         |\\\n");
   printf("\t\t                         | \\\n");
   printf("\t\t                         |  \\\n");
   printf("\t\t                         |   \\\n");
   printf("\t\t                         |    \\\n");
    printf("\t\t       /|                |    /\n");
   printf("\t\t      / |                |   /\n");
    printf("\t\t     /--|                |  /         |\\ \n");
    printf("\t\t    /---|                | /          |-\\  \n");
   printf("\t\t   /----|                |/           |--\\ \n");
   printf("\t\t   |----|                |            |---\\ \n");
   printf("\t\t   |----|                |            |----\\    \n\n\n ");
   printf("\t\t\t      |-----------------------|\n");
   printf("\t\t\t      |       Ha perdido.     |\n");
   printf("\t\t\t      |-----------------------|\n");
   printf("\n\n\n");
   printf("Presione una tecla para ver la condiguracion del tablero.");
   getche();

  }

void bienvenida(){                  //grafico de bienvenida
  textcolor(10);
  printf("\n");
  cprintf("      |---------------------------------------------------------------|");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |      *   *   *   *   **        *   ****    *****   ****       |");
  printf("\n");
  cprintf("      |      *   *   *   *   *  *      *   *   *     *     *   *      |");
  printf("\n");
  cprintf("      |      *****   *   *   *    *    *   *   *     *     *   *      |");
  printf("\n");
  cprintf("      |      *   *   *   *   *      *  *   *   *     *     *  *       |");
  printf("\n");
  cprintf("      |      *   *   *****   *        **   ****    *****   *   *      |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |                        *       *****                          |");
  printf("\n");
  cprintf("      |                        *       *   *                          |");
  printf("\n");
  cprintf("      |                        *       *****                          |");
  printf("\n");
  cprintf("      |                        *       *   *                          |");
  printf("\n");
  cprintf("      |                        *****   *   *                          |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |             *****   *       *****   *****   *****             |");
  printf("\n");
  cprintf("      |             *       *       *   *     *     *   *             |");
  printf("\n");
  cprintf("      |             ***     *       *   *     *     *****             |");
  printf("\n");
  cprintf("      |             *       *       *   *     *     *   *             |");
  printf("\n");
  cprintf("      |             *       *****   *****     *     *   *             |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |---------------------------------------------------------------|");
  printf("\n\n");
  cprintf("Autor: Aitor Lechuga Saenz.               Pulse cualquier letra para continuar.");
  getche();


}


void despedida(){                        //Gr·fico de despedida
  textcolor(10);
  clrscr();
  printf("\n");
  cprintf("      |---------------------------------------------------------------|");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |      *****   ****    *****   *****   *****   *****    ****    |");
  printf("\n");
  cprintf("      |      *       *   *   *   *   *         *     *   *   *        |");
  printf("\n");
  cprintf("      |      * **    ****    *****   *         *     *****    ***     |");
  printf("\n");
  cprintf("      |      *   *   *   *   *   *   *         *     *   *       *    |");
  printf("\n");
  cprintf("      |      ****    *   *   *   *   *****   *****   *   *    ***     |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |                        ****    *****   ****                   |");
  printf("\n");
  cprintf("      |                        *   *   *   *   *   *                  |");
  printf("\n");
  cprintf("      |                        ****    *   *   ****                   |");
  printf("\n");
  cprintf("      |                        *       *   *   *   *                  |");
  printf("\n");
  cprintf("      |                        *       *****   *   *                  |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |               *****   *   *   *****   *****   ****            |");
  printf("\n");
  cprintf("      |                   *   *   *   *       *   *   *   *           |");
  printf("\n");
  cprintf("      |                ** *   *   *   * **    *****   ****            |");
  printf("\n");
  cprintf("      |               *   *   *   *   *   *   *   *   *   *           |");
  printf("\n");
  cprintf("      |                ****   *****   ****    *   *   *   *           |");
  printf("\n");
  cprintf("      |                                                               |");
  printf("\n");
  cprintf("      |---------------------------------------------------------------|");
  printf("\n\n");
}