[ Foro de C ]

Simulador en C Dial a pirate (The Secret of Monkey Island)

15-Aug-2023 21:37
Invitado (Marcos)
1 Respuestas

Cordial saludo y muchas gracias de antemano.

He realizado un programa en C que replica el famoso "Dial a Pirate" del juego "The Secret of Monkey Island".

Sin embargo, el funcionamiento a veces es correcto, a veces es incorrecto.

Por ejemplo:
-Si el programa pregunta: ¿En qué año fue arrestado este pirata en la ciudad de Barbados? 3 0, la fecha mostrada es: 1594, la cuál es correcta al utilizar las ruedas físicas.

-Si el programa pregunta: ¿En qué año fue arrestado este pirata en la ciudad de Nebraska? 12 0 la fecha mostrada es: 1705, la cuál es correcta al utilizar las ruedas físicas.

PERO
-Si el programa pregunta: ¿En qué año fue arrestado este pirata en la ciudad de Jamaica? 8 0, la fecha mostrada es: 1686. Sin embargo, la fecha correcta debería ser 1573.

-Si el programa pregunta: ¿En qué año fue arrestado este pirata en la ciudad de Nebraska? 3 0, la fecha mostrada es: 1665. Sin embargo, la fecha correcta debería ser 1722.

Acontinuación dejo el código completo:

/******************************************************************************
DIAL A PIRATE en C.
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h> //rand(), srand().
#include <time.h>   //time().

int main()
{
   int num1=0, i=0,j=0,aux=0;
   int num2=0; //número aleatorio para elegir semicara superior del pirata.
   int num3=0; //número aleatorio para elegir semicara inferior del pirata.
   int num4=0; //número aleatorio para elegir la ciudad.
   int cara_pirata[2]={0,0};
   int fecha=0;    //guardará la fecha final solicitada.
   int respuesta=0;    //fecha solicitada al usuario.
   

   int v1[15]={0,1,2,3,4,5,6,7,8,9,1,11,12,13,14};
   int v2[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int v3[7]={0,1,2,3,4,5,6};
   int m1[7][15]={
                 {1710,1651,1679,1719,1694,1632,1668,1703,1726,1564,1615,1599,1669,1660,1687},
                 {1658,1702,1725,1630,1709,1594,1614,1563,1649,1693,1577,1678,1686,1597,1718},
                 {1724,1667,1691,1685,1613,1580,1723,1717,1684,1628,1643,1559,1573,1708,1701},
                 {1672,1562,1721,1666,1673,1670,1692,1656,1567,1674,1662,1665,1646,1671,1611},
                 {1627,1707,1688,1699,1568,1705,1579,1585,1665,1706,1506,1772,1716,1584,1551},
                 {1566,1592,1654,1635,1639,1695,1704,1711,1609,1681,1712,1542,1565,1720,1664},
                 {1690,1682,1601,1619,1680,1621,1652,1689,1713,1697,1696,1624,1604,1653,1641}};

   //primera ciudad o ciudad semilla.
   int antigua[2]={0,0};

   //Seleccionar la cara del pirata: generar dos números aleatorios.
   //  - generamos dos números aleatorios que representan las dos semicaras
   //    del pirata: representa los giros de las dos ruedas.
   //  - Luego, colocadas las dos ruedas con las nuevas caras de los piratas,
   //    y elegimos una de ellas aleatoriamente.
   //  - Por último, elegirmos una de las seis ciudades aleatoriamente.
   srand (time(NULL));
   num1 = rand() % (14+1); // semicara superior aleatoria: entre 0 y 14
   num2 = rand() % (14+1); // semicara inferior aleatoria: entre 0 y 14
   num3 = rand() % (14+1); // elegimos una de las caras formadas entre 0 y 14
   num4 = rand() % (6+1);  // ciudad aleatoria entre 0 y 6

// Prueba: ver los números aleatorios generados.
   printf("\n%d", num1);
   printf("\n%d", num2);
   printf("\n%d", num3);
   printf("\n%d", num4);


   //seleccionar la cara de nuestro pirata en la posición aleatoria.
   cara_pirata[0]=v1[num3];    
   cara_pirata[1]=v2[num3];    

//prueba: ver la posición de la cara de nuestro pirata.
   printf("\n\n%d", cara_pirata[0]);
   printf("\n%d", cara_pirata[1]);


   //Hacemos la pregunta:
   printf("\n¿En qué año fue arrestado este pirata en la ciudad de ");
   switch(num4){
       case 0: printf("Antigua?"); break;
       case 1: printf("Barbados?"); break;
       case 2: printf("Jamaica?"); break;
       case 3: printf("Monserrat?"); break;
       case 4: printf("Nebraska?"); break;
       case 5: printf("St.Kitts?"); break;
       case 6: printf("Tortuga?"); break;
   }

   j=0;
   for(i=num1;i<15;i++){
       v2[i]=num2+j;
       if(v2[i]>14)
          v2[i]=(15-v2[i])*(-1);
          aux=v2[i];
       j++;
   }

   for(i=0;i<num1;i++){
      v2[i]=aux+i+1;
   }
   
   j=0;
   for(i=0;i<num1;i++){
      if(v2[i]>14){
        v2[i]=0+j;
       j++;          
      }
   }
   
switch(num4){
   //Antigua
   case 0: fecha=m1[cara_pirata[1]][cara_pirata[0]]; break;
   //Barbados
   case 1: fecha=m1[cara_pirata[1]+1][cara_pirata[0]+2]; break;
   //Jamaica
   case 2: fecha=m1[cara_pirata[1]+1][cara_pirata[0]+4]; break;
   //Monserrat
   case 3: fecha=m1[cara_pirata[1]+2][cara_pirata[0]+6]; break;
   //Nebraska
   case 4: fecha=m1[cara_pirata[1]+3][cara_pirata[0]+8]; break;
   //St.Kitts
   case 5: fecha=m1[cara_pirata[1]+4][cara_pirata[0]+10]; break;
   //Tortuga
   case 6: fecha=m1[cara_pirata[1]+5][cara_pirata[0]+12]; break;
}

   printf("\n%d %d", cara_pirata[0], cara_pirata[1]);
   printf("\n\nFecha:%d", fecha);
   scanf("%d", &respuesta);

   //evaluar la respueta:
   //  si respuesta correcta; entonces mostrar un mensaje: acertaste. Puedes jugar.
   //  sino,
   //  si respuesta incorrecta; entonces mostrar mensaje: Fallasta. No puedes jugar.
   //
   if(respuesta==fecha)
       printf("\nAcertaste. Puedes jugar.");
   else
       printf("\nFallaste. No puedes jugar.");
   
   return 0;
}


22-Sep-2023 10:07
Invitado (didac)

hola marcos

no se bien que quieres hacer pues aunque para ti el juego está claro, yo no acabo de entenderlo.

lo que si veo es que el tabulado en los if de los for lleva a engaño pues como no pones llaves solo ejecuta la primera sentencia

v3 no lo usas para nada ¿¿??

comentas o explicas los printf que ya se entienden y lo que haces en los bucles y porqué lo haces, eso no lo explicas

así mismo explicas las variables elementales como num2 pero en los arrays v1, v2 y m1, no dices que son, para que los vas a usar y porque lo inicializas a esos valores

y puestos a mejorar el código, los nombres de las variables deberían ser significativos, num1 o v1 no dice nada más que hay un número o un vector. pero n_cara_sup si se puede entender que es el número de la cara superior

si haces algún cambio, y no te acaba de funcionar, ponlo en el foro y te ayudaré en serio y veremos donde falla

suerte ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)