problema con el juego de undir la flota

Iniciado por MessageBoxA, 22 Julio 2014, 05:04 AM

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

MessageBoxA

buenas e estado realizando un proyecto de la universidad y e logrado hacer muchas cosas ahora luego que finalice el proyecto a mi profesor se le ocurrio la idea de hacer que en vez de un barco sea  igual a una sola posicion de la matriz, quiere que sea un barco formado por varias secciones y con sentidos definidos.



aqui el codigo que entregue y quiere q sea el mismo code que modifique pero realmente si me cuesta evaluar con una sola posicion no se como hacer con varias posiciones al mismo tiempo para determinar si esta undido el barco y tambien el colocarlos en el tablero por ser de varias secciones.

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

// Posiciones: '0'=desocupado | '1'=Hay barco | '2'=Barco destruido

void wait(int seconds) // Funcion 'clock' para el tiempo de juego
{
   clock_t endwait;
   endwait = clock() + seconds * CLOCKS_PER_SEC;
   while( clock() < endwait )
   {}
}

void imprimir();
void iniciar();

int i, j, k, jugador[10][10], oponente[10][10], opcion1, opcion2, puntajejugador=0, puntajeoponente=0; // Variables globales
time_t start,end;
double dif, tiempototal=0;

//________________________________________________________________________________________________
void imprimir() // Funcion que imprime el tablero de juego
{  
   printf("\t\t\t\t\t    Tiempo transcurrido= %.1f segundos\n\n", tiempototal);
   
   for(i=1;i<=10;i++) // Imprime tablero del oponente
   {
       printf("\n\t");
       for(j=1;j<=10;j++)
       {
           if(oponente[i][j]==3)
           {
               printf("  #");
           }
           else
           {
               if(oponente[i][j]==2) // Imprime 'X' si vale 2
               {
                   printf("  X");
               }
               else
               {
                   printf("  -");
               }
           }                                    
       }
       if(i==3)
       {
           printf("\tOPONENTE");
       }
       else
       {
           if(i==1)
           {
               printf("\t\t\tPuntaje oponente: %d", puntajeoponente);
           }
       }
   }
   
   printf("\n\n\t ______________________________\n\n");
   
   for(i=1;i<=10;i++) // Imprime el tablero del jugador
   {
       printf("\n\t");
       for(j=1;j<=10;j++)
       {
           if(jugador[i][j]==3)
           {
               printf("  #");
           }
           else
           {
               if(jugador[i][j]==2) // Imprime 'X' si vale 2 || 'O' si vale 1
               {
                   printf("  X");
               }
               else
               {
                   if(jugador[i][j]==1)
                   {
                       printf("  O");
                   }
                   else
                   {
                       printf("  -");
                   }
               }
           }                                    
       }
       if(i==3)
       {
           printf("\tJUGADOR");
       }
       else
       {
           if(i==1)
           {
               printf("\t\t\tPuntaje jugador: %d", puntajejugador);
           }
       }
   }

   printf("\n\n");  
}
//_______________________________________________________________________________________________

void iniciar() // Rellena con '0' el arreglo y coloca los barcos
{
       
   for(i=1;i<=10;i++) // Llena todo con '0'
   {
       for(j=1;j<=10;j++)
       {
           jugador[i][j]=0;
           oponente[i][j]=0;
       }
   }
   
   printf("\n\n Dame las coordenadas de tus barcos~\n\n");
   
   srand(time(NULL));
   for(k=1;k<=10;k++) // Distribuye los barcos
   {
       imprimir();
                     
       i=1+rand()%10; // Distribuye los barcos oponentes
       j=1+rand()%10;
       while(oponente[i][j]==1)
       {
           i=1+rand()%10; j=1+rand()%10;
       }
       oponente[i][j]=1; // La posicion de los barcos valdra 1
                     
       printf("\n\tX%d = ", k);
       scanf("%d", &opcion2);
       while(opcion2<1 || opcion2>10)
       {
           printf("    Escoje un valor valido ( 1 a 10 )\n\n\tX%d = ", k);
           scanf("%d", &opcion2);
       }
                       
       printf("\n\tY%d = ", k);
       scanf("%d", &opcion1);
       while(opcion1<1 || opcion1>10)
       {
           printf("\n    Escoje un valor valido ( 1 a 10 )\n\n\tY%d = ", k);
           scanf("%d", &opcion1);
       }
                       
       if(jugador[opcion1][opcion2]==1)
       {
           printf("\n Ese valor ya existe...");
           getche();
           k=k-1;
       }
       jugador[opcion1][opcion2]=1;
                     
       system("cls");
                                                       
   }  
   
}

void presentacion()
{
system("color 0B");

   printf("\n\n\t    ~BATALLA NAVAL~\n\n\t\t#\n\t\t#|\n\t\t#|#\n\t\t#|##\n\t\t#|###\n\t\t#|####");
   printf("\n\t\t#|#####\n\t\t#|######\n\t#########################\n\t _______________________");
   printf("\n\t  ####/)###############\n\t   ###(/##############\n\t    #################\n\t     ###############");
   printf("\n\n\n\t1- JUGAR\n\n\t2- SALIR\n\n\n\tDame tu opcion:");
}
//_______________________________________________________________________________________________

main() // Inicia el programa (main)
{
   int res, auxiliar, probabilidadcpu, destruidosoponente=0, destruidosjugador=0, ganador;
   float dificultadcpu=0.5;
   
   presentacion();
   scanf("%d", &res);
   system("cls");
     
   switch(res)
   { // Eliges la opcion Jugar o Salir
     
      case 1:
      {
          iniciar(); // Llama a la funcion iniciar
          printf("\n\n\n\t\t Preparado?\n\n");
          wait(2);
          printf("\n\t\t AHORA!!!");
          wait(1);
                           
          do
          {
              time(&start);
              system("cls"); // Limpia la pantalla
                             
              imprimir();
                             
              printf(" Es tu turno! Dame la posicion que deseas atacar~\n\n");
              printf("\tX = ");
              scanf("%d", &opcion2);
              while(opcion2<1 || opcion2>10)
              {
                  printf("\n    Escoje un valor valido ( 1 a 10 )\n\n\tX = ");
                  scanf("%d", &opcion2);
              }
                             
              printf("\tY = ");
              scanf("%d", &opcion1);
              while(opcion1<1 || opcion1>10)
              {
                  printf("\n    Escoje un valor valido ( 1 a 10 )\n\n\tY = ");
                  scanf("%d", &opcion1);
              }
                             
              auxiliar=oponente[opcion1][opcion2];
              oponente[opcion1][opcion2]=3;
              system("cls");
              imprimir();
              oponente[opcion1][opcion2]=auxiliar;                          
                             
              if(oponente[opcion1][opcion2]==1)
              {
                  oponente[opcion1][opcion2]=2;
                  destruidosoponente=destruidosoponente+1;
                  puntajejugador=puntajejugador+200;
                  printf("\n Haz acertado!!\n\n");
              }
              else
              {
                  printf("\n Haz fallado...\n\n");
              }
                             
              system("PAUSE");
              system("cls");
              if(destruidosoponente==5)
              {
                  printf("\n\n\n\n\t\t\tHAZ GANADO!!");
                  getche();
              }                              
SI LA MATRIX FUERA PERFECTA.... ESTARÍA ESCRITA EN C++

eferion

Necesitas una estructura que te permita almacenar el estado y/o la posición de los barcos:


enum pos
{
 Ninguna,
 Horizontal,
 Vertical
};

struct coord
{
 int x;
 int y;
};

struct barco
{
 int longitud;
 struct coord coordenadas;
 enum posicion pos;
 int estado;
};


Con esto ya puedes "modelar" cada uno de los barcos. Lo ideal sería tener una instrucción que permitiese crear los barcos. Algo del tipo:


struct barco NuevoBarco( int longitud )
{
 struct barco to_return;
 to_return->longitud = longitud;
 to_return->coordenadas.x = -1; // Para indicar que no esta posicionado
 to_return->coordenadas.y = -1; // Para indicar que no esta posicionado
 to_return->pos = Ninguna;
 to_return->estado = longitud;
 return to_return;
}


En este caso, "estado" almacena la "vida" del barco... si la vida llega a 0, el barco se considera hundido.

Como puedes ver, no uso memoria dinámica para los barcos... no es necesaria.

Una vez tienes la flota creada, lo suyo es posicionarla. Por la cantidad de barcos que hay no se me ocurre una combinación (tampoco voy a buscarla) en la que no se puedan colocar todos los barcos... yo, en primer lugar, crearía los barcos del más grande al más pequeño y, después, intentaría posicionarlos en ese orden.

Una forma de posicionar los barcos pudiera ser: En un bucle, elegir al azar un par de coordenadas  (x,y) y una posición (vertical u horizontal), después compruebas si el barco "entra" en esa posición... y repites el bucle hasta dar con una posición "válida".

Ahora toca inicializar el tablero para borrar la partida anterior si la hubiese.

Una vez has realizado estos pasos el programa está listo para iniciar la partida.

Cada vez que introduces unas coordenadas de disparo puedes hacer los siguientes chequeos:

* Si es una casilla que ya ha sido atacada, se piden nuevas coordenadas
* Se recorre el array de barcos y se comprueba si algún barco se encuentra en la coordenada seleccionada... si es así, actualizas el estado del barco para anotar un "toque". Llegados a este punto, si la vida de 3 barcos es 0, el jugador gana la partida. Si no hay barcos en la coordenada marcada... indicas "agua".

A continuación el prototipo de una función que determine si un barco ha resultado "tocado".


int BarcoTocado( struct barco* barco, struct coord coordDisparo )
{
 if ( barco->pos == Horizontal )
 {
   struct coord coordBarco = barco->coord;
   int i = barco->longitud;
   while ( i > 0 )
   {
     if (coordBarco == coordDisparo )
       return 1;

     coordBarco.x++;
     i--;
   }    
 }
 else
 {
   // ...
 }

 return 0;
}


Creo que con estas guías debería ser sencillo completar el programa.