[ Foro de C ]
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;
}
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.)