elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 [7] 8
61  Programación / Programación C/C++ / Re: Ayuda con biblioteca que lee un fichero de configuracion en: 21 Agosto 2015, 23:14 pm
Linea 52, tienes un return

Perdona, no se en que estaba pensando...

Muchísimas gracias por tu ayuda, marco como solucionado.
62  Programación / Programación C/C++ / Re: Ayuda con biblioteca que lee un fichero de configuracion en: 21 Agosto 2015, 22:06 pm
copio desde la linea 39, hablaré de los numeros de linea aquí
Código
  1. for (x=0; x<subject_size; x++) {
  2. if(buffer[x]=='=') break;
  3. subject[x]=buffer[x];
  4. }
  5.  
  6. for (x; x<file_line_size; x++) {
  7.  
  8. value[x]=buffer[x];
  9.  
  10. }

supongamos que en el fichero tienes
Código:
hola=mundo
el for de la linea 1 empieza en 0 y avanza hasta conseguir '=' es decir hasta 5
así que subject quedaría en memoria
Código:
|h|o|l|a|0|0|0|0|0|....

cuando llegas a la linea 6 tienes un for que no inicia, sino que continúa

value está limpio y sería a nivel de memoria algo como
Código:
|0|0|0|0|0|0|0|0|0|....

cuando lo llenas, empiezas a llenarlo desde la posición que quedó el ciclo anterior (en nuestro caso 5), así que
Código:
|0|0|0|0|0|m|u|n|d|o|0|0....

cuando lo vas a imprimir, printf no lee cadena en en value, ya que empieza con fin de cadena (ese 0 que muestro en el string) y no imprime nada

value tienes que escribirlo desde 0, así que puedes usar x como base para buffer, pero no para value

Gracias por la aclaración, me ha servido de mucho, he modificado un poco el código y ya obtiene tanto el campo como el valor, pero ahora tengo otro pequeño problema... ahora resulta, que solo lee una linea, es decir un campo y un valor e ignora el resto, te dejo el código que he editado:

Código
  1. y=0;
  2. for (x=x+1; x<file_line_size; x++) {
  3. if(buffer[x]=='\n') break;
  4. value[y]=buffer[x];
  5. y++;
  6.  
  7. }
  8.  

¿Por que puede ser?

Gracias de antemano.
63  Programación / Programación C/C++ / Re: Ayuda con biblioteca que lee un fichero de configuracion en: 21 Agosto 2015, 20:56 pm
recomiendo lo siguiente...

1- siempre que se cargue la librería y se le pase un archivo, lee todo el archivo
2- todos los valores obtenidos guardalos en un array bidimensional, siendo el primer valor el nombre y el segundo el contenido
3- recomiendo siempre borrar los espacios en los bordes (trim) ya que la gente podría hacer
Código:
 #comentario con espacio por delante
variable = valor con un espacio de sobre aqui ->
para esto podría ser util isspace de la librería ctype.h

por otro lado tu error está probablemenet en la linea 46  donde value empieza a popularse desde el medio y sin discriminación

No entiendo lo del error en la linea 46, ¿me lo podrías explicar un poco más detallado?
64  Programación / Programación C/C++ / Ayuda con biblioteca que lee un fichero de configuracion en: 21 Agosto 2015, 20:12 pm
Hola a tod@s, pues ahora estoy haciendo una pequeña libreria que facilita la extracción de información de archivos de configuración, estos ficheros de configuración serían del tipo:

Código:
campo1=valor1
campo2=valor2
#esto lo ignora, es solo un comentario
campo3=valor3
etc...

La función que se usaría tendría la sintaxys:

Código
  1. get_value("archivo.conf", "campo1", valor);
  2.  

Es decir, le pasamos, como primer elemento, el archivo de configuración, como segundo elemento el campo del que va a extraer la información, y como tercer parametro, un array (creado en el programa que usa la librería) donde guardará el valor extraido (con strcpy).

El código es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int get_value(char [], char [], char []);
  6. static void clear_array(char [], int);
  7.  
  8.  
  9. int get_value(char file_conf[], char subject_i[], char value_i[]) {
  10.  
  11. FILE * file;
  12.  
  13. int file_line_size=50;
  14. int subject_size=25;
  15. int value_size=25;
  16.  
  17. char buffer[file_line_size];
  18. char subject[subject_size];
  19. char value[value_size];
  20.  
  21. file=fopen(file_conf, "r");
  22. if (file==NULL) {
  23.  
  24. printf("Error al abrir el archivo\n");
  25. return 1;
  26.  
  27. }
  28.  
  29. int x, y;
  30. while (!feof(file))
  31. {
  32. clear_array(buffer, file_line_size);
  33. clear_array(subject, subject_size);
  34. clear_array(value, value_size);
  35.  
  36. fgets(buffer,file_line_size,file);
  37. if (buffer[0]=='#') continue;
  38. x=0;
  39. for (x=0; x<subject_size; x++) {
  40. if(buffer[x]=='=') break;
  41. subject[x]=buffer[x];
  42. }
  43.  
  44. for (x; x<file_line_size; x++) {
  45.  
  46. value[x]=buffer[x];
  47.  
  48. }
  49. printf("el campo es %s\n", subject);
  50. printf("el valor es %s\n", value);
  51.  
  52. if (strcmp(subject_i, subject)==0) { strcpy(value_i, value); return 0; }
  53. }
  54. printf("No existe el campo dentro del fichero\n");
  55. return 1;
  56. }
  57.  
  58. static void clear_array(char array[], int size) {
  59.  
  60. int x;
  61.  
  62. for(x=0;x<size;x++) {
  63.  
  64. array[x]='\0';
  65.  
  66.  
  67. }
  68.  
  69. }
  70.  

Los problemas que me dan son:

1) No extrae la información, ni siquiera me muestra el campo, la salida que me da es la siguiente:

el campo es
el valor es
el campo es
el valor es
el campo es
el valor es

2) El while hace un ciclo más del que debe, es decir, si el fichero de configuración tiene 3 lineas, el while da 4 vueltas... lo he comprobado con los printfs que he puesto en mitad del while.

Gracias de antemano.

Saludos.
65  Programación / Programación C/C++ / Re: Ayuda con sencillo motor de Pokemon. en: 19 Agosto 2015, 00:51 am
En nombres de variables, no uses ningún caracter acentuado (ñ incluída). Solo caracteres alfanuméricos (sin empezar por número) y '_'.

Gracias por la ayuda, solucionado!
66  Programación / Programación C/C++ / Re: Ayuda con sencillo motor de Pokemon. en: 18 Agosto 2015, 20:51 pm
He avanzado bastante en el codigo pero cuando he compilado me ha dado un monton de errores que no comprendo, me da los siguientes errores:

Código:
pokemon.c: En la función ‘main’:
pokemon.c:31:8: aviso: declaración implícita de la función ‘time’ [-Wimplicit-function-declaration]
  srand(time(NULL)+getpid());
        ^
pokemon.c:31:19: aviso: declaración implícita de la función ‘getpid’ [-Wimplicit-function-declaration]
  srand(time(NULL)+getpid());
                   ^
pokemon.c: En la función ‘atacar’:
pokemon.c:103:1: error: ‘\303’ parásito en el programa
 int ataque, daño;
 ^
pokemon.c:103:1: error: ‘\261’ parásito en el programa
pokemon.c:103:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘o’
 int ataque, daño;
                 ^
pokemon.c:112:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon1.ataque[0]);
     ^
pokemon.c:112:5: error: ‘\261’ parásito en el programa
pokemon.c:112:5: error: nombre de tipo ‘da’ desconocido
pokemon.c:112:19: aviso: el paso del argumento 2 de ‘azar’ crea un entero desde un puntero sin una conversión [-Wint-conversion]
     daño=azar(0, pokemon1.ataque[0]);
                   ^
pokemon.c:10:5: nota: se esperaba ‘int’ pero el argumento es de tipo ‘char *’
 int azar(int, int);
     ^
pokemon.c:115:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:115:5: error: ‘\261’ parásito en el programa
pokemon.c:115:50: error: ‘da’ no se declaró aquí (primer uso en esta función)
     printf("Le has quitado %d puntos de vida\n", daño);
                                                  ^
pokemon.c:115:50: nota: cada identificador sin declarar se reporta sólo una vez para cada función en el que aparece
pokemon.c:115:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:116:5: error: ‘\303’ parásito en el programa
     pokemon2.pv-=daño;
     ^
pokemon.c:116:5: error: ‘\261’ parásito en el programa
pokemon.c:116:22: error: expected ‘;’ before ‘o’
     pokemon2.pv-=daño;
                      ^
pokemon.c:123:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon1.ataque[1]);
     ^
pokemon.c:123:5: error: ‘\261’ parásito en el programa
pokemon.c:123:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon1.ataque[1]);
         ^
pokemon.c:126:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:126:5: error: ‘\261’ parásito en el programa
pokemon.c:126:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:127:5: error: ‘\303’ parásito en el programa
     pokemon2.pv-=daño;
     ^
pokemon.c:127:5: error: ‘\261’ parásito en el programa
pokemon.c:127:22: error: expected ‘;’ before ‘o’
     pokemon2.pv-=daño;
                      ^
pokemon.c:134:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon1.ataque[2]);
     ^
pokemon.c:134:5: error: ‘\261’ parásito en el programa
pokemon.c:134:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon1.ataque[2]);
         ^
pokemon.c:137:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:137:5: error: ‘\261’ parásito en el programa
pokemon.c:137:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:138:5: error: ‘\303’ parásito en el programa
     pokemon2.pv-=daño;
     ^
pokemon.c:138:5: error: ‘\261’ parásito en el programa
pokemon.c:138:22: error: expected ‘;’ before ‘o’
     pokemon2.pv-=daño;
                      ^
pokemon.c:145:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon1.ataque[3]);
     ^
pokemon.c:145:5: error: ‘\261’ parásito en el programa
pokemon.c:145:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon1.ataque[3]);
         ^
pokemon.c:148:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:148:5: error: ‘\261’ parásito en el programa
pokemon.c:148:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:149:5: error: ‘\303’ parásito en el programa
     pokemon2.pv-=daño;
     ^
pokemon.c:149:5: error: ‘\261’ parásito en el programa
pokemon.c:149:22: error: expected ‘;’ before ‘o’
     pokemon2.pv-=daño;
                      ^
pokemon.c:167:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon2.ataque[0]);
     ^
pokemon.c:167:5: error: ‘\261’ parásito en el programa
pokemon.c:167:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon2.ataque[0]);
         ^
pokemon.c:170:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:170:5: error: ‘\261’ parásito en el programa
pokemon.c:170:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:171:5: error: ‘\303’ parásito en el programa
     pokemon1.pv-=daño;
     ^
pokemon.c:171:5: error: ‘\261’ parásito en el programa
pokemon.c:171:22: error: expected ‘;’ before ‘o’
     pokemon1.pv-=daño;
                      ^
pokemon.c:178:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon2.ataque[0]);
     ^
pokemon.c:178:5: error: ‘\261’ parásito en el programa
pokemon.c:178:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon2.ataque[0]);
         ^
pokemon.c:181:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:181:5: error: ‘\261’ parásito en el programa
pokemon.c:181:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:182:5: error: ‘\303’ parásito en el programa
     pokemon1.pv-=daño;
     ^
pokemon.c:182:5: error: ‘\261’ parásito en el programa
pokemon.c:182:22: error: expected ‘;’ before ‘o’
     pokemon1.pv-=daño;
                      ^
pokemon.c:189:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon2.ataque[0]);
     ^
pokemon.c:189:5: error: ‘\261’ parásito en el programa
pokemon.c:189:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon2.ataque[0]);
         ^
pokemon.c:192:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:192:5: error: ‘\261’ parásito en el programa
pokemon.c:192:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:193:5: error: ‘\303’ parásito en el programa
     pokemon1.pv-=daño;
     ^
pokemon.c:193:5: error: ‘\261’ parásito en el programa
pokemon.c:193:22: error: expected ‘;’ before ‘o’
     pokemon1.pv-=daño;
                      ^
pokemon.c:200:5: error: ‘\303’ parásito en el programa
     daño=azar(0, pokemon2.ataque[0]);
     ^
pokemon.c:200:5: error: ‘\261’ parásito en el programa
pokemon.c:200:9: error: expected ‘;’ before ‘o’
     daño=azar(0, pokemon2.ataque[0]);
         ^
pokemon.c:203:5: error: ‘\303’ parásito en el programa
     printf("Le has quitado %d puntos de vida\n", daño);
     ^
pokemon.c:203:5: error: ‘\261’ parásito en el programa
pokemon.c:203:54: error: expected ‘)’ before ‘o’
     printf("Le has quitado %d puntos de vida\n", daño);
                                                      ^
pokemon.c:204:5: error: ‘\303’ parásito en el programa
     pokemon1.pv-=daño;
     ^
pokemon.c:204:5: error: ‘\261’ parásito en el programa
pokemon.c:204:22: error: expected ‘;’ before ‘o’
     pokemon1.pv-=daño;
                      ^


Dejo aquí el código que llevo ahora, es largo pero bueno:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. void ayuda(void);
  7. void atacar();
  8. void pociones();
  9. void informacion();
  10. int azar(int, int);
  11. void ganador();
  12.  
  13. typedef struct {
  14.  
  15. char nombre[25];
  16. int pv;
  17. char *ataque[4];
  18. int pd[4];
  19. int pp[4];
  20. int pociones;
  21.  
  22. } pokemon;
  23.  
  24. pokemon pokemon1;
  25. pokemon pokemon2;
  26.  
  27. int turno=1;
  28.  
  29. int main() {
  30.  
  31. srand(time(NULL)+getpid());
  32.  
  33.  
  34. strcpy(pokemon1.nombre, "pokemon1");
  35. pokemon1.pv=100;
  36. pokemon1.ataque[0]="ataque1";pokemon1.ataque[1]="ataque2";pokemon1.ataque[2]="ataque3";pokemon1.ataque[3]="ataque4";
  37.   pokemon1.pd[0]=1;pokemon1.pd[1]=5;pokemon1.pd[2]=2;pokemon1.pd[3]=4;
  38.   pokemon1.pp[0]=20;pokemon1.pp[1]=30;pokemon1.pp[2]=10;pokemon1.pp[3]=40;
  39. pokemon1.pociones=2;
  40.  
  41. strcpy(pokemon2.nombre, "pokemon2");
  42. pokemon2.pv=100;
  43. pokemon2.ataque[0]="ataque1";pokemon2.ataque[1]="ataque2";pokemon2.ataque[2]="ataque3";pokemon2.ataque[3]="ataque4";
  44.   pokemon1.pd[0]=4;pokemon1.pd[1]=3;pokemon1.pd[2]=8;pokemon1.pd[3]=2;
  45.   pokemon2.pp[0]=25;pokemon2.pp[1]=30;pokemon2.pp[2]=70;pokemon2.pp[3]=15;
  46. pokemon2.pociones=3;
  47.  
  48. char comando;
  49.  
  50. informacion();
  51.  
  52.  
  53. while (1) {
  54.  
  55. if (turno==1)
  56. printf("[%s]", pokemon1.nombre);
  57. else
  58. printf("[%s]", pokemon2.nombre);
  59.  
  60.  
  61.  
  62. printf("Introduce la orden...");
  63. comando = fgetc(stdin);
  64. while(fgetc(stdin) != '\n');
  65. switch ( comando ) {
  66.  
  67. case 'h':
  68. ayuda();
  69. break;;
  70. case 'a':
  71. atacar();
  72. break;;
  73. case 'p':
  74. pociones();
  75. break;;
  76. case 'i':
  77. informacion();
  78. break;;
  79. case 'e':
  80. exit(0);
  81.  
  82. }
  83. }
  84. }
  85.  
  86. void ayuda() {
  87.  
  88. printf("h -> Despliega esta ayuda\n");
  89. printf("a -> Ataca al pokemon enemigo\n");
  90. printf("p -> Cura a tu pokemon si tienes pociones\n");
  91. printf("i -> Da información sobre tu pokemon y el enemigo\n");
  92. printf("e -> Cancelar la partida\n");
  93.  
  94.  
  95. }
  96.  
  97. void atacar() {
  98.  
  99. int ataque, daño;
  100. ataque = scanf("%d", &ataque);
  101.  
  102. if (turno==1) {
  103.  
  104. switch ( ataque ) {
  105.  
  106. case '1':
  107. if (pokemon1.pp[0]==0){printf("no te quedan pp\n"); turno=2; break;;}
  108. daño=azar(0, pokemon1.ataque[0]);
  109. printf("%s uso %s", pokemon1.nombre, pokemon1.ataque[0]);
  110. pokemon1.pp[0]--;
  111. printf("Le has quitado %d puntos de vida\n", daño);
  112. pokemon2.pv-=daño;
  113. if (pokemon2.pv<=0)
  114. ganador();
  115. turno=2;
  116. break;;
  117. case '2':
  118. if (pokemon1.pp[1]==0){printf("no te quedan pp\n"); turno=2; break;;}
  119. daño=azar(0, pokemon1.ataque[1]);
  120. printf("%s uso %s", pokemon1.nombre, pokemon1.ataque[1]);
  121. pokemon1.pp[1]--;
  122. printf("Le has quitado %d puntos de vida\n", daño);
  123. pokemon2.pv-=daño;
  124. if (pokemon2.pv<=0)
  125. ganador();
  126. turno=2;
  127. break;;
  128. case '3':
  129. if (pokemon1.pp[2]==0){printf("no te quedan pp\n"); turno=2; break;;}
  130. daño=azar(0, pokemon1.ataque[2]);
  131. printf("%s uso %s", pokemon1.nombre, pokemon1.ataque[2]);
  132. pokemon1.pp[2]--;
  133. printf("Le has quitado %d puntos de vida\n", daño);
  134. pokemon2.pv-=daño;
  135. if (pokemon2.pv<=0)
  136. ganador();
  137. turno=2;
  138. break;;
  139. case '4':
  140. if (pokemon1.pp[3]==0){printf("no te quedan pp\n"); turno=2; break;;}
  141. daño=azar(0, pokemon1.ataque[3]);
  142. printf("%s uso %s", pokemon1.nombre, pokemon1.ataque[3]);
  143. pokemon1.pp[3]--;
  144. printf("Le has quitado %d puntos de vida\n", daño);
  145. pokemon2.pv-=daño;
  146. if (pokemon2.pv<=0)
  147. ganador();
  148. turno=2;
  149. break;;
  150. default:
  151. printf("no has elegido ninguna opcion, así que pierdes el turno\n");
  152. turno=2;
  153. break;;
  154.  
  155. }
  156.  
  157. }else{
  158.  
  159. switch ( ataque ) {
  160.  
  161. case '1':
  162. if (pokemon2.pp[0]==0){printf("no te quedan pp\n"); turno=1; break;;}
  163. daño=azar(0, pokemon2.ataque[0]);
  164. printf("%s uso %s", pokemon2.nombre, pokemon2.ataque[0]);
  165. pokemon2.pp[0]--;
  166. printf("Le has quitado %d puntos de vida\n", daño);
  167. pokemon1.pv-=daño;
  168. if (pokemon1.pv<=0)
  169. ganador();
  170. turno=1;
  171. break;;
  172. case '2':
  173. if (pokemon2.pp[1]==0){printf("no te quedan pp\n"); turno=1; break;;}
  174. daño=azar(0, pokemon2.ataque[0]);
  175. printf("%s uso %s", pokemon2.nombre, pokemon2.ataque[0]);
  176. pokemon2.pp[1]--;
  177. printf("Le has quitado %d puntos de vida\n", daño);
  178. pokemon1.pv-=daño;
  179. if (pokemon1.pv<=0)
  180. ganador();
  181. turno=1;
  182. break;;
  183. case '3':
  184. if (pokemon2.pp[2]==0){printf("no te quedan pp\n"); turno=1; break;;}
  185. daño=azar(0, pokemon2.ataque[0]);
  186. printf("%s uso %s", pokemon2.nombre, pokemon2.ataque[0]);
  187. pokemon2.pp[2]--;
  188. printf("Le has quitado %d puntos de vida\n", daño);
  189. pokemon1.pv-=daño;
  190. if (pokemon1.pv<=0)
  191. ganador();
  192. turno=1;
  193. break;;
  194. case '4':
  195. if (pokemon2.pp[3]==0){printf("no te quedan pp\n"); turno=1; break;;}
  196. daño=azar(0, pokemon2.ataque[0]);
  197. printf("%s uso %s", pokemon2.nombre, pokemon2.ataque[0]);
  198. pokemon2.pp[3]--;
  199. printf("Le has quitado %d puntos de vida\n", daño);
  200. pokemon1.pv-=daño;
  201. if (pokemon1.pv<=0)
  202. ganador();
  203. turno=1;
  204. break;;
  205. }
  206.  
  207. }
  208.  
  209.  
  210. }
  211.  
  212. void pociones() {
  213.  
  214.  printf("prueba");
  215.  
  216. }
  217.  
  218. void informacion() {
  219.  
  220.  
  221. if (turno==1){
  222. printf("**********\n");
  223. printf("%s\n", pokemon1.nombre);
  224. printf("pv:%d\n", pokemon1.pv);
  225. printf("\t-----ATAQUES-----\n");
  226. printf("\t%s pp:%d\n", pokemon1.ataque[0], pokemon1.pp[0]);
  227. printf("\t%s pp:%d\n", pokemon1.ataque[1], pokemon1.pp[1]);
  228. printf("\t%s pp:%d\n", pokemon1.ataque[2], pokemon1.pp[2]);
  229. printf("\t%s pp:%d\n", pokemon1.ataque[3], pokemon1.pp[3]);
  230. printf("Numero de pociones:%d\n", pokemon1.pociones);
  231. printf("\t-----------------\n");
  232. printf("pv enemigo:%d\n", pokemon2.pv);
  233. printf("**********\n");
  234. }
  235. if (turno==2){
  236. printf("**********\n");
  237. printf("%s\n", pokemon2.nombre);
  238. printf("pv:%d\n", pokemon2.pv);
  239. printf("\t-----ATAQUES-----\n");
  240. printf("\t%s pp:%d\n", pokemon2.ataque[0], pokemon1.pp[0]);
  241. printf("\t%s pp:%d\n", pokemon2.ataque[1], pokemon1.pp[1]);
  242. printf("\t%s pp:%d\n", pokemon2.ataque[2], pokemon1.pp[2]);
  243. printf("\t%s pp:%d\n", pokemon2.ataque[3], pokemon1.pp[3]);
  244. printf("Numero de pociones:%d\n", pokemon2.pociones);
  245. printf("\t-----------------\n");
  246. printf("pv enemigo:%d\n", pokemon1.pv);
  247. printf("**********\n");
  248.  
  249. }
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256. }
  257.  
  258. int azar(int minimo, int maximo){
  259. srand(time(NULL));
  260. return minimo+rand()%maximo+1;
  261. }
  262.  
  263. void ganador() {
  264.  
  265. if (turno==1) {
  266.  
  267. printf("%s ha ganado la partida\n", pokemon1.nombre);
  268. exit(0);
  269.  
  270. } else {
  271.  
  272. printf("%s ha ganado la partida\n", pokemon2.nombre);
  273. exit(0);
  274.  
  275. }
  276. }
  277.  

Os agradecería que me echarais una mano en lo que pudierais, ¿que es eso de parasito?

Gracias de antemano, saludos.
67  Programación / Programación C/C++ / Re: Ayuda con sencillo motor de Pokemon. en: 18 Agosto 2015, 18:52 pm
el while(1) origrinal está bien,

solo que después de leer un char necesitas terminar de leer la linea ya que cuando escribes en la consola realmente lo que ve el programa es:

"h\n" o "h\r\n" (depende de si es linux o windows)

para poder evitar que las siguientes lecturas de fgetc lean los otros caracteres que no te interesan puedes hacer un skip de ellos con el:

while(fgetc(stdin) != '\n');

por lo que el codigo te quedaría como:
Código:
printf("Introduce la orden...");
comando = fgetc(stdin);
while(fgetc(stdin) != '\n');
switch ( comando ) {
....
}


lo que estas haciendo en tu codigo es avanzar un turno por caracter hay en la linea hasta que lees '\n'


Gracias por la aclaración, ya funciona el código y creo que se más o menos como funciona la solución.

A ver si e esto... la primera linea, la de "comando=fgetc(stdin)" lee un caracter y va avanzando en cada ciclo, pero para evitar que también lea el /n y además para que se pare para poder escribir en el teclado, hemos puesto ese while, es así?

Saludos.
68  Programación / Programación C/C++ / Re: Ayuda con sencillo motor de Pokemon. en: 18 Agosto 2015, 17:08 pm
Gracias a todos chicos, ya funciona como debía de funcionar, ahora tengo otro problema, he modificado un poco el código y el problema ahora es que cuando selecciono una opción, al ser un switch case, cuando se selecciona la opción se cierra el programa, y claro yo quiero que vuelva a mostrar la "shell" para poner otra orden y así siempre hasta que termine la partida, ¿ Cómo puedo hacer eso ? ( Perdonenme soy bastante nuevo en C)

Dejo el código que llevo por ahora:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void ayuda(void);
  6. void atacar(int);
  7. void pociones(int);
  8.  
  9. int main() {
  10.  
  11.  
  12. typedef struct {
  13.  
  14. char nombre[25];
  15. int pv;
  16. char ataque[4][25];
  17. int pd[8];
  18. int pp[4];
  19.  
  20. } pokemon;
  21.  
  22. pokemon pokemon1;
  23. pokemon pokemon2;
  24.  
  25. strcpy(pokemon1.nombre, "pokemon1");
  26. pokemon1.pv=100;
  27. pokemon1.ataque[0][0]="ataque1";pokemon1.ataque[1][0]="ataque2";pokemon1.ataque[2][0]="ataque3";pokemon1.ataque[3][0]="ataque4";
  28.   pokemon1.pd[0]=1;pokemon1.pd[1]=5;pokemon1.pd[2]=2;pokemon1.pd[3]=4;pokemon1.pd[4]=0;pokemon1.pd[5]=4;pokemon1.pd[6]=3;pokemon1.pd[7]=4;
  29.   pokemon1.pp[0]=20;pokemon1.pp[1]=30;pokemon1.pp[2]=10;pokemon1.pp[3]=40;
  30.  
  31. strcpy(pokemon2.nombre, "pokemon2");
  32. pokemon2.pv=100;
  33. pokemon2.ataque[0][0]="ataque1";pokemon2.ataque[1][0]="ataque2";pokemon2.ataque[2][0]="ataque3";pokemon2.ataque[3][0]="ataque4";
  34.   pokemon2.pd[0]=1;pokemon2.pd[1]=5;pokemon2.pd[2]=2;pokemon2.pd[3]=4;pokemon2.pd[4]=0;pokemon2.pd[5]=4;pokemon2.pd[6]=3;pokemon2.pd[7]=4;
  35.   pokemon1.pp[0]=25;pokemon1.pp[1]=30;pokemon1.pp[2]=70;pokemon1.pp[3]=15;
  36.  
  37.  
  38.  
  39. int turno=1;
  40. char comando;
  41.  
  42.  
  43.  
  44. do {
  45.  
  46. if (turno==1)
  47. printf("[%s]", pokemon1.nombre);
  48. else
  49. printf("[%s]", pokemon2.nombre);
  50.  
  51.  
  52.  
  53. printf("Introduce la orden...");
  54. comando = fgetc(stdin);
  55. switch ( comando ) {
  56.  
  57. case 'h':
  58. ayuda();
  59. break;;
  60. case 'a':
  61. atacar(turno);
  62. break;;
  63. case 'p':
  64. pociones(turno);
  65. break;;
  66.  
  67.  
  68.  
  69.  
  70.  
  71. }
  72. } while(fgetc(stdin) != '\n');
  73. }
  74.  
  75. void ayuda() {
  76.  
  77. printf("h -> Despliega esta ayuda\n");
  78. printf("a -> Ataca al pokemon enemigo\n");
  79. printf("p -> Cura a tu pokemon si tienes pociones\n");
  80.  
  81.  
  82.  
  83. }
  84.  
  85. void atacar(int turno) {
  86.  
  87.  
  88. printf("prueba");
  89.  
  90.  
  91. }
  92.  
  93. void pociones(int turno) {
  94.  
  95.  printf("prueba");
  96.  
  97. }
  98.  
  99.  
69  Programación / Programación C/C++ / Re: Ayuda con sencillo motor de Pokemon. en: 18 Agosto 2015, 15:44 pm
Gracias, el error ya lo he solucionado como me has dicho, ahora el problema está en que cuando selecciono una opción y vuelve al while, no se para en el scanf y repite todo el rato "[pokemon1]introduce la orden...".

Saludos.
70  Programación / Programación C/C++ / Ayuda con sencillo motor de Pokemon. en: 18 Agosto 2015, 15:20 pm
Hola gente de Elhacker.net, estoy intentando aprender C, y como "reto" me he propuesto implementar un algoritmo sencillo que simule una batalla pokemon (a lo cutre claramente), el caso es que para ello, he almacenado todos los datos de los pokemon, como "puntos de vida", "puntos de poder" etc... en una structura, con la cual defino los dos pokemons.

Pv=puntos de vida, la vida del pokemon
Pp=puntos de poder, es decir, las veces que puedes usar un ataque
Pd= puntos de poder, en este caso, defino un minimo y un maximo, de forma que aleatoriamente un ataque haga x daño.

El caso es que me he quedado atascado en la estructura, entre otras cosas por que no se como rellenar los datos, lo he hecho como he podido pero al ejecutarlo me da error de violación segmento.

Pego el código aquí:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void ayuda(void);
  6. void atacar(int);
  7. void pociones(int);
  8.  
  9. int main() {
  10.  
  11.  
  12. typedef struct {
  13.  
  14. char nombre[25];
  15. int pv;
  16. char **ataque;
  17. int pd[8];
  18. int pp[4];
  19.  
  20. } pokemon;
  21.  
  22. pokemon pokemon1;
  23. pokemon pokemon2;
  24.  
  25. strcpy(pokemon1.nombre, "pokemon1");
  26. pokemon1.pv=100;
  27. pokemon1.ataque[0]="ataque1";pokemon1.ataque[1]="ataque2";pokemon1.ataque[2]="ataque3";pokemon1.ataque[3]="ataque4";
  28.   pokemon1.pd[0]=1;pokemon1.pd[1]=5;pokemon1.pd[2]=2;pokemon1.pd[3]=4;pokemon1.pd[4]=0;pokemon1.pd[5]=4;pokemon1.pd[6]=3;pokemon1.pd[7]=4;
  29.   pokemon1.pp[0]=20;pokemon1.pp[1]=30;pokemon1.pp[2]=10;pokemon1.pp[3]=40;
  30.  
  31. strcpy(pokemon2.nombre, "pokemon2");
  32. pokemon2.pv=100;
  33. pokemon2.ataque[0]="ataque1";pokemon2.ataque[1]="ataque2";pokemon2.ataque[2]="ataque3";pokemon2.ataque[3]="ataque4";
  34.   pokemon2.pd[0]=1;pokemon2.pd[1]=5;pokemon2.pd[2]=2;pokemon2.pd[3]=4;pokemon2.pd[4]=0;pokemon2.pd[5]=4;pokemon2.pd[6]=3;pokemon2.pd[7]=4;
  35.   pokemon1.pp[0]=25;pokemon1.pp[1]=30;pokemon1.pp[2]=70;pokemon1.pp[3]=15;
  36.  
  37.  
  38.  
  39. int turno=1;
  40. char comando;
  41.  
  42.  
  43. while (1) {
  44.  
  45. if (turno==1)
  46. printf("[%s]", pokemon1.nombre);
  47. else
  48. printf("[%s]", pokemon2.nombre);
  49.  
  50. printf("Introduce la orden...");
  51. scanf("&comando");
  52.  
  53. switch ( comando ) {
  54.  
  55. case 'h':
  56. ayuda();
  57. case 'a':
  58. atacar(turno);
  59. case 'p':
  60. pociones(turno);
  61.  
  62.  
  63.  
  64.  
  65.  
  66. }
  67. }
  68. }
  69.  
  70. void ayuda() {
  71.  
  72. printf("h -> Despliega esta ayuda\n");
  73. printf("a -> Ataca al pokemon enemigo\n");
  74. printf("p -> Cura a tu pokemon si tienes pociones\n");
  75.  
  76.  
  77.  
  78. }
  79.  
  80. void atacar(int turno) {
  81.  
  82.  
  83. printf("prueba");
  84.  
  85.  
  86. }
  87.  
  88. void pociones(int turno) {
  89.  
  90.  printf("prueba");
  91.  
  92. }
  93.  
  94.  
  95.  

Me gustaría que me dijerais por que me da ese error y una forma un poco mas elegante de rellenar esos arrays dentro de la estructura.

Saludos.
Páginas: 1 2 3 4 5 6 [7] 8
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines