Randomize Timer?

Iniciado por Saberuneko, 3 Noviembre 2011, 12:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Saberuneko

Hola, en Basic, siempre he usado Randomize Timer para obtener un resultado lo más parecido a algo verdaderamente aleatorio...
En el juego que estoy desarrollando, pensé en utilizar lo mismo en Visual Basic para generar un conjunto de naves aleatorias que atacarían a la flota del jugador.

Sin Randomize Timer funciona, pero siempre me genera las mismas naves así que realmente no me vale.

Ésta es la parte del código que tengo hecha para generar dichas naves y cargarlas en pantalla:

Cabecera del Frame:
Option Explicit

Dim enemy1 As Ship
Dim enemy2 As Ship
Dim enemy3 As Ship
Dim enemy4 As Ship
Dim enemy5 As Ship

Randomize Timer


Sub que genera una flota enemiga aleatoria:
-Storage.shipdb contiene tanto los nombres de naves como las rutas de las imágenes a cargar, sus stats etc. Haré que esta pseudo-base de datos se cargue desde ficheros luego, de momento esto es experimental. (Así que no nos centremos en mi chapuza :3)
-Si necesitáis todo el código para orientarme, decídmelo y paso también el módulo storage que contiene todas las estructuras, arrays, etc... No pongo más de momento, ya que mi única duda es sobre cómo utilizar Randomize Timer correctamente.
Private Sub enemyload()
Dim dice As Integer
If Storage.level > 10 Then
    dice = Int((Rnd * 5) + 1)
Else
    dice = Int((Rnd * 3) + 1)
End If

    Select Case (dice)
        Case 1
            enemy1.exists = True
            enemy2.exists = False
            enemy3.exists = False
            enemy4.exists = False
            enemy5.exists = False
        Case 2
            enemy1.exists = True
            enemy2.exists = True
            enemy3.exists = False
            enemy4.exists = False
            enemy5.exists = False
        Case 3
            enemy1.exists = True
            enemy2.exists = True
            enemy3.exists = True
            enemy4.exists = False
            enemy5.exists = False
        Case 4
            enemy1.exists = True
            enemy2.exists = True
            enemy3.exists = True
            enemy4.exists = True
            enemy5.exists = False
        Case 5
            enemy1.exists = True
            enemy2.exists = True
            enemy3.exists = True
            enemy4.exists = True
            enemy5.exists = True
    End Select
   
    'this will have to be modified as it is just for combat alpha testing
    'in the way it currently is, it only supports pirate ship load
    If enemy1.exists Then
        If Storage.level > 10 Then
            dice = Int((Rnd * 6) + 6)
            enemy1.shipModel = Storage.shipdb(dice, 0)
        Else
            dice = Int((Rnd * 3) + 6)
            enemy1.shipModel = Storage.shipdb(dice, 0)
        End If
    Else
        enemy1.shipModel = Storage.shipdb(0, 0)
        img_enemy1.Visible = False
    End If
    img_enemy1.Picture = LoadPicture(App.Path & Storage.shipdb(dice, 2))
       
    If enemy2.exists Then
        If Storage.level > 10 Then
            dice = Int((Rnd * 6) + 6)
            enemy2.shipModel = Storage.shipdb(dice, 0)
        Else
            dice = Int((Rnd * 3) + 6)
            enemy2.shipModel = Storage.shipdb(dice, 0)
        End If
    Else
        enemy2.shipModel = Storage.shipdb(0, 0)
        img_enemy2.Visible = False
    End If
    img_enemy2.Picture = LoadPicture(App.Path & Storage.shipdb(dice, 2))
   
    If enemy3.exists Then
        dice = Int((Rnd * 3) + 6)
        enemy3.shipModel = Storage.shipdb(dice, 0)
    Else
        enemy3.shipModel = Storage.shipdb(0, 0)
        img_enemy3.Visible = False
    End If
    img_enemy3.Picture = LoadPicture(App.Path & Storage.shipdb(dice, 2))
   
    If enemy4.exists Then
        dice = Int((Rnd * 3) + 6)
        enemy4.shipModel = Storage.shipdb(dice, 0)
    Else
        enemy4.shipModel = Storage.shipdb(0, 0)
        img_enemy4.Visible = False
    End If
    img_enemy4.Picture = LoadPicture(App.Path & Storage.shipdb(dice, 2))
   
    If enemy5.exists Then
        dice = Int((Rnd * 3) + 6)
        enemy5.shipModel = Storage.shipdb(dice, 0)
    Else
        enemy5.shipModel = Storage.shipdb(0, 0)
        img_enemy5.Visible = False
    End If
    img_enemy5.Picture = LoadPicture(App.Path & Storage.shipdb(dice, 2))
   
End Sub


El problema es que me da un error cuando intento ejecutarlo:
CitarEl procedimiento externo no es válido.
Marcándome la palabra Timer de la linea:
Randomize Timer

Se puede usar esta función en VB?
Si es así, cómo puedo hacerlo?

Muchas gracias por adelantado.

79137913

HOLA!!!

No se si te servira:
Es un juego de naves que arme hace un tiempo:
el tema: http://foro.elhacker.net/empty-t313866.0.html;msg1554959#msg1554959
la descarga: http://www.gigasize.com/get.php?d=tcthckoql1f

Y si, se puede hacer "randomize timer" pero te recomiendo hacerlo en el form load y nunca mas :P.


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Solo hace falta ejecutar Randomize por si solo y listo :D (Timer, es cuando lo usas en un Control Timer, ademas de que el parametro es opcional)

$Edu$

No es Randomize Timer , sino Randomize Time

Y esa instruccion la pones al principio de tu Sub enemyload

79137913

HOLA!!!

Cita de: $Edu$ en  3 Noviembre 2011, 14:06 PM
No es Randomize Timer , sino Randomize Time

Y esa instruccion la pones al principio de tu Sub enemyload

El sub Randomize (seed) funciona con cualquier numero.

Se suele utilizar Timer.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Saberuneko

#5
Cita de: 79137913 en  3 Noviembre 2011, 15:31 PM
HOLA!!!

El sub Randomize (seed) funciona con cualquier numero.

Se suele utilizar Timer.

GRACIAS POR LEER!!!

Si, en Basic se usa "Randomize Timer", literalmente.

He probado, las flotas se generan ahora de forma variada y aleatoria, ¡muchísimas gracias!

Una duda, sólo curiosidad, cómo funciona "Randomize"? Funciona de forma similar a "Randomize Timer" de basic? O funciona de otra forma?

raul338

Randomize por si solo elige una semilla aleatoria, si tu le das una semila la genera a partir de esta :P

No he usado otras vesiones de basic ademas de Visual Basic

Cita de: Saberuneko en  3 Noviembre 2011, 12:08 PM

   Select Case (dice)
       Case 1
           enemy1.exists = True
           enemy2.exists = False
           enemy3.exists = False
           enemy4.exists = False
           enemy5.exists = False
       Case 2
           enemy1.exists = True
           enemy2.exists = True
           enemy3.exists = False
           enemy4.exists = False
           enemy5.exists = False
       Case 3
           enemy1.exists = True
           enemy2.exists = True
           enemy3.exists = True
           enemy4.exists = False
           enemy5.exists = False
       Case 4
           enemy1.exists = True
           enemy2.exists = True
           enemy3.exists = True
           enemy4.exists = True
           enemy5.exists = False
       Case 5
           enemy1.exists = True
           enemy2.exists = True
           enemy3.exists = True
           enemy4.exists = True
           enemy5.exists = True
   End Select

Eso lo resumiria a esto

Código (vb) [Seleccionar]

enemy1.exists = (dice <= 1)
enemy2.exists = (dice <= 2)
enemy3.exists = (dice <= 3)
enemy4.exists = (dice <= 4)
enemy5.exists = (dice <= 5)

Si no entiendes, avisas  ;D

$Edu$

Entonces en mis codigos que he creado que siempre uso:

Código (vb) [Seleccionar]

Randomize Time

valor = Cint(Rnd() * 6)


No me esta generando los numeros realmente aleatorios como deberia o que?

Saberuneko

Cita de: raul338 en  3 Noviembre 2011, 23:02 PM
Código (vb) [Seleccionar]

enemy1.exists = (dice <= 1)
enemy2.exists = (dice <= 2)
enemy3.exists = (dice <= 3)
enemy4.exists = (dice <= 4)
enemy5.exists = (dice <= 5)

Si no entiendes, avisas  ;D

Creo que lo pillo, al ser enemyn.exists una variable de tipo boolean y tener una condición "matemática" en la asignación, si se cumple es true y si no false, verdad?
Muchas gracias, llevaba un buen rato intentando pensar una manera de compactar mejor eso.

Cita de: $Edu$ en  4 Noviembre 2011, 10:56 AMNo me esta generando los numeros realmente aleatorios como deberia o que?
No, realmente en la programación no existe una aleatoriedad real, pero sí se puede llegar a algo bastante aproximado.
Simplemente prueba a guardar una cantidad considerable de números aleatorios en un intervalo no muy grande, y notarás que algunos patrones se repiten.

raul338

Cita de: Saberuneko en  4 Noviembre 2011, 11:39 AM
Creo que lo pillo, al ser enemyn.exists una variable de tipo boolean y tener una condición "matemática" en la asignación, si se cumple es true y si no false, verdad?
Exacto, ademas de matematica es logica, por lo que solo puede ser verdadero o falso (nunca sera mayor y menor que uno a la vez, etc) y que es el tipo booleano? una variable logica :D Es como la matematicas en el cole, empiezas con x = y y terminas con formulas de media hoja :xD

Cita de: $Edu$ en  4 Noviembre 2011, 10:56 AM
Entonces en mis codigos que he creado que siempre uso
No me esta generando los numeros realmente aleatorios como deberia o que?
el simple hecho de llamar a Randomize ya te cambia las proximas salidas de Rnd, lo que si, es que habrá veces que notaras que saldran ciertos patrones, como cuando sale un numero seguido 3 veces en la loteria :xD