Mejorar el ataque

Kr4n3oK

Buenas, para practicar me he hecho un juego en DOS, nada de gráfico y tal, digamos que sería la mecánica pura de un juego cualquiera.
La cosa es que, como sabeis y sé, el rand genera números aleatorios, pero como tiene una semilla predefinida, no sé como poder cambiar la aleitoriedad de estos números, he estado mirando cosilas, pero nada.
Bueno os dejo la parte aquí donde uso rand(), y si podeí ayudarme mejor :D

      //Jugador dos habilidades
              printf("****Ataques jugador dos**** \t[%s]\t[%d] puntos de impacto\n", jugadordos, vidados);
              printf("1.Patada\n");
              printf("2.Cabezazo\n");
              printf("3.Puñetazo\n");
                           // Ataques jugadordos
              printf("Que ataque quieres realizar\n");
              scanf("%d", &opciondos);
                          //Eleccion ataque
                          switch(opciondos) {
                                            case 1:
                                                 ataquedos  = rand() % 250; 
                                            break;
                                            case 2:
                                                 ataquedos = rand() % 150;
                                            break;
                                            case 3:
                                                 ataquedos = rand() % 501;
                                            break;
                          }

Y por si lo queréis os dejo el código para lo que mireis.

#include <stdio.h>

int main(){
//Define var
char jugadoruno[10];
char jugadordos[10];
int opcionuno, opciondos;
int vidauno = 3000;
int vidados = 3000;
int ataqueuno, ataquedos;




 //Nombre de los jugadores
              printf("****** NOMBRE DE LOS JUGADORES ********\n");
              printf("Nombre del jugador uno: \n");
              scanf("%s", &jugadoruno);
              printf("Nombre del jugador dos: \n");
              scanf("%s", &jugadordos);

while( vidauno >= 0 && vidados >= 0){
// Game Loop,seleccion ataques,habilidades, resulución de la lucha
//Jugador uno habilidades


              printf("****Ataques jugador uno**** \t[%s]\t[%d] puntos de impacto\n", jugadoruno, vidauno);
              printf("1.Patada\n");
              printf("2.Cabezazo\n");
              printf("3.Puñetazo\n");
                           //Ataques jugadordos
              printf("Que ataque quieres realizar\n");
              scanf("%d", &opcionuno);
                          //Eleccion ataque
                          switch(opcionuno) {
                                            case 1:
                                                 ataqueuno  = rand() % 250; 
                                            break;
                                            case 2:
                                                 ataqueuno = rand() % 150;
                                            break;
                                            case 3:
                                                 ataqueuno = rand() % 501;
                                            break;
                          
                          }
              //Jugador dos habilidades
              printf("****Ataques jugador dos**** \t[%s]\t[%d] puntos de impacto\n", jugadordos, vidados);
              printf("1.Patada\n");
              printf("2.Cabezazo\n");
              printf("3.Puñetazo\n");
                           // Ataques jugadordos
              printf("Que ataque quieres realizar\n");
              scanf("%d", &opciondos);
                          //Eleccion ataque
                          switch(opciondos) {
                                            case 1:
                                                 ataquedos  = rand() % 250; 
                                            break;
                                            case 2:
                                                 ataquedos = rand() % 150;
                                            break;
                                            case 3:
                                                 ataquedos = rand() % 501;
                                            break;
                          }
                        
                          printf("%s\t", jugadoruno);
                          printf("Asesta un golpe de\t");
                          printf("%d\t", ataqueuno);
                          printf("puntos de impacto\n\n\n");
                          vidados = vidados - ataqueuno;
                          
                          printf("%s\t", jugadordos);
                          printf("Asesta un golpe de\t");
                          printf("%d\t", ataquedos);
                          printf("puntos de impacto\n\n\n");
                          vidauno = vidauno - ataquedos;
}
//Ganador de la pelea
if (vidauno >= 0){
            printf("Ha ganado el jugador: %s", jugadoruno);
            }else{
            printf("Ha ganado el jugador: %s", jugadordos);
            }

getche();
return 0;

}

Gnos1s

Multiplícalo por un número y listo.

1
NeB1

#2 no me seais cutres xDD usa srand (time(NULL)); u algo similar para generar una semilla aleatoria o pseudoaleatoria

r2d2rigo

Recuerda llamar solo una vez a srand o te reiniciara la semilla y te sacara siempre el mismo resultado.

NeB1

#4 aún llamando a la función srand con diferentes valores?? (suponiendo que la ejecución tarda más de 1 segundo entre llamada y llamada de srand, esperando a que el jugador decida y tal)

r2d2rigo

No, solo depende de que se use time() para el valor de la semilla (que por defecto es lo que se usa en casi todas las APIs...).

NeB1

lo que quieres decir entonces es que dos llamadas en la misma ejecución te generarán la misma semilla porque time devolverá el mismo valor porque la ejecución durará menos de 1 sec?

r2d2rigo

No. A ver, el caso que yo digo es si ocurre en un bucle de programa y se hacen llamadas a srand/rand consecutivas. Por ejemplo:

while (talcual)
{
srand(time(null));
int num = rand();
}

Eso te sacaria todo el rato el mismo numero, porque la funcion pseudoaleatoria tiene dependencia de la semilla bla bla bla. Vamos, que es una gilipollez que muchas veces suele ocurrir (sobre todo en C#, que los Random son objetos y los vas recreando a tu libre albedrio).

NeB1

peroooooo si time(null) devuelve valores diferentes, srand debería devolver valores diferentes de semilla y por tanto rand también, no?

(a no ser que la ejecución del programa dure menos de un segundo, ya que time tiene precisión de segundos cre, no?)

Pd: es que si no te refieres a eso y no es así me rompes los esquemas xDD

Deoxys

#1

En clase nos dicen que hagamos lo de #3, usar el tiempo del ordenador como semilla.

NeB1

#10 x'DD

oFF-sIDE

Yo siempre he pensado que los milisegundos del timestamp son muy útiles para esto, aunque no es que lo haya usado mucho.

9 días después
Kr4n3oK

Voy a revivir el tema porque la opción de usar el time actual del pc es la mejor opción, pero claro, siempre hay un pero, xdd, la cosa es que, este time() utiliza el tiempo en minutos, por lo tanto, mientras la función se ejecute dentro de un mismo minuto, me sacará los mismos números.
Supongo que para que me lo haga en segundos, tendré ya que usar la libreria time.h no? y sacar al time completo, hh:mm:ss

NeB1

#13 la función time retorna minutos!?!? pues si, busca alguna que te saque segundos, e incluso milisegundos si fuese posible. Porque si durante la ejecución del programa llamas varias veces a la función time, es posible que no llegue a pasar ni 1 segundo (a no ser que se espere la acción del usuario con un scanf o algo asi)

Kr4n3oK

NeB1, creo que segundos me valen, puesto que la ejecucción de srand iría en función de una persona física.

Usuarios habituales

  • Kr4n3oK
  • NeB1
  • oFF-sIDE
  • Deoxys
  • r2d2rigo
  • Gnos1s