1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
// 1x30: Un marinero /* Un marinero ebrio se tambalea al subir por una rampa del muelle a su barco. La rampa tiene 5 pasos de ancho y 15 de largo. Comenzamos a observar al marinero cuando está en el extremo de la rampa que se apoya sobre el muelle, comenzando a caminar hacia el barco por el centro de la rampa. Si da más de dos pasos a la izquierda o a la derecha, caerá al agua y se ahogará, pero si da más de 15 pasos hacia delante estará a salvo a bordo de su barco. Escribe un programa para simular el irregular avance del marinero según estas instrucciones: a. El programa lee repetidamente un entero del teclado. b. Si el entero es negativo, supondremos que el pirata se durmió sobre la rampa. c. Si el entero es divisible entre 2, el pirata da un paso hacia adelante. d. Si el entero no es divisible entre 2, pero el entero menos 1 es divisible entre 4, el pirata da un paso a la derecha. e. En otro caso, el pirata da un paso a la izquierda. f. El programa finalizará escribiendo el paradero del pirata: cae por un costado y se ahoga, logra abordar su barco o se duerme sobre la rampa. Debe de ir detallando cada acción que acomete. */ /* Precondición: El usuario ha de introducir un parámetro consecutivamente de tipo entero, introducirlo de tipo real conllevara un desecho de los decimales y se considerara entero. Poscondición: Según los parámetros que vaya introduciendo el usuario se dará un caso u otro, en el momento que el marinero llegue a -3 ó +3 se habrá ahogado, si llega a +15 habrá abordado se galeón. */ #include <stdio.h> #define WHITE "\e[m" // Letra normal #define B_BLUE "\e[34;1m" // _ Agua #define MAGENTA "\e[35m" // | Tabla #define GREEN "\e[32m" // X Marinero #define RED "\e[31m" // X Marinero ahogado main(){ system("clear"); float num; int numEnt, verti=0, hori=0, bol=0, rip=0, i; printf( "\n Un marinero ebrio se tambalea al subir por una rampa del muelle a su barco.\n La rampa tiene 5 pasos de ancho y 15 de largo. Comenzamos a observar al\n marinero cuando esta en el extremo de la rampa que se apoya sobre el muelle,\n comenzando a caminar hacia el barco por el centro de la rampa. Si da mas de dos\n pasos a la izquierda o a la derecha, caera al agua y se ahogara, pero si da mas\n de 15 pasos hacia delante estara a salvo a bordo de su barco.\n\n" ); printf( " Introduzca un numero, !cuidado, si elige mal puede ahogarse!\n\n" ); // Comienza una iteración cuyo fin será provocado cuando bol valga 1: do{ //Se solicita el numero: if( verti == 0 ){ printf( " Empecemos! Introduzca su primero numero: " ); scanf( "%f", &num ); } else{ printf( " Sigue a salvo! Prueba otro numero mas: " ); scanf( "%f", &num ); }; system("clear"); // Si el usuario ha usado decimales se desechan con la conversión de float -> int. numEnt = num; // Comienza la comprobación del numero: if( numEnt < 0 ){ // Si es negativo = Duerme printf( " Vaya! el marinero se ha dormido en medio de la pasarela :S " ); } else if( numEnt%2 == 0 ){ //Si es divisible por 2 = adelante: verti++; printf( " Bien, el marinero dio un paso adelante, le quedan %i pasos.", 15-verti ); } else if( (numEnt-1)%4 == 0 ){ // Si entero-1 es divisible por 4 = derecha hori++; printf( " No!, el marinero se dirige a la derecha, cuidado!!!" ); } else{ // En cualquier otro caso = izquierda hori--; printf( " Ojo!, el marinero se dirige a la izquierda, cuidado!!!" ); }; // Mientras no se hayan dado los 15 pasos al frente imprime la pasarela if( verti < 15 ){ //Impresión del galeón: printf("\n ___________ \n / / \n \\ \\ \n \\__________\\ \n | | \n __________|_|________ \n \\ / \n \\_________________/ \n"); // Impresión por pantalla de la posición actual del marinero: for( i=14; i>=0; i-- ){ printf(" "); if( verti == i ){ if( hori == -3 ){ //Agua printf( B_BLUE " _" RED "X" B_BLUE "_" MAGENTA "| | | | |" B_BLUE "___ \n" WHITE ); bol = 1; rip = 1; } else if( hori == -2 ){ printf( B_BLUE " ___" GREEN "X" MAGENTA " | | | |" B_BLUE "___ \n" WHITE ); } else if( hori == -1 ){ printf( B_BLUE " ___" MAGENTA "| " GREEN "X" MAGENTA " | | |" B_BLUE "___ \n" WHITE ); } else if( hori == 0 ){ //Centro printf( B_BLUE " ___" MAGENTA "| | " GREEN "X" MAGENTA " | |" B_BLUE "___ \n" WHITE ); } else if( hori == 1 ){ printf( B_BLUE " ___" MAGENTA "| | | " GREEN "X" MAGENTA " |" B_BLUE "___ \n" WHITE ); } else if( hori == 2 ){ printf( B_BLUE " ___" MAGENTA "| | | | " GREEN "X" B_BLUE "___ \n" WHITE ); } else if( hori == 3 ){ //Agua printf( B_BLUE " ___" MAGENTA "| | | | |" B_BLUE "_" RED "X" B_BLUE "_ \n" WHITE ); bol = 1; rip = 1; }; } else{ // Vacio printf( B_BLUE " ___" MAGENTA "| | | | |" B_BLUE "___ \n" WHITE ); }; }; printf("\n"); } else if( verti == 15 ){ // Una vez en el barco imprime el resultado sin la pasarela: system("clear"); printf("\n ___________ \n / / \n \\ \\ \n \\__________\\ \n | | \n __________|_|________ \n \\ El marinero / \n \\__llego a salvo__/ \n\n\n"); bol = 1; }; //Si ha muerto se imprime su tumba: if( rip == 1 ){ printf( "\n El marinero se ha ahogado : / \n ____ \n __/ \\__ \n / \\ \n | R.I.P. | \n | 1941-2011 | \n _|____________|_ \n |________________| \n\n\n" ); }; }while( bol !=1 ); }; |