Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: Saberuneko en 3 Noviembre 2011, 12:08 PM

Título: Randomize Timer?
Publicado por: Saberuneko en 3 Noviembre 2011, 12:08 PM
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.
Título: Re: Randomize Timer?
Publicado por: 79137913 en 3 Noviembre 2011, 13:17 PM
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!!!
Título: Re: Randomize Timer?
Publicado por: raul338 en 3 Noviembre 2011, 13:41 PM
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)
Título: Re: Randomize Timer?
Publicado por: $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
Título: Re: Randomize Timer?
Publicado por: 79137913 en 3 Noviembre 2011, 15:31 PM
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!!!
Título: Re: Randomize Timer?
Publicado por: Saberuneko en 3 Noviembre 2011, 22:47 PM
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?
Título: Re: Randomize Timer?
Publicado por: raul338 en 3 Noviembre 2011, 23:02 PM
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
Título: Re: Randomize Timer?
Publicado por: $Edu$ en 4 Noviembre 2011, 10:56 AM
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?
Título: Re: Randomize Timer?
Publicado por: Saberuneko en 4 Noviembre 2011, 11:39 AM
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.
Título: Re: Randomize Timer?
Publicado por: raul338 en 4 Noviembre 2011, 13:31 PM
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
Título: Re: Randomize Timer?
Publicado por: $Edu$ en 4 Noviembre 2011, 13:53 PM
Gracias raullll
Título: Re: Randomize Timer?
Publicado por: Saberuneko en 4 Noviembre 2011, 13:53 PM
enemy1.exists = (dice <= 1)
enemy2.exists = (dice <= 2)
enemy3.exists = (dice <= 3)
enemy4.exists = (dice <= 4)
enemy5.exists = (dice <= 5)


No funciona como debería.
Me salen naves de más, y la nave 1 no aparece nunca.
(Cuando el level del jugador es inferior a 10, el máximo debería ser 3, y me suelen salir las naves 4 y/o 5).
Título: Re: Randomize Timer?
Publicado por: BlackZeroX en 4 Noviembre 2011, 20:44 PM
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

yo lo haria asi... es Bastante LOGICO:

Código (Vb) [Seleccionar]


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



Dulces Lunas!¡.
Título: Re: Randomize Timer?
Publicado por: Saberuneko en 6 Noviembre 2011, 15:55 PM
Hmm, voy a probarlo, muchas gracias.

Hay que ver la que se puede liar por poner mal una cosita, x3
Título: Re: Randomize Timer?
Publicado por: raul338 en 6 Noviembre 2011, 16:31 PM
Cita de: Saberuneko en  6 Noviembre 2011, 15:55 PM
Hay que ver la que se puede liar por poner mal una cosita, x3
Y los dolores de cabeza que pueden dar :xD
Título: Re: Randomize Timer?
Publicado por: Saberuneko en 7 Noviembre 2011, 01:22 AM
Pues la cosa sigue fallando, pero debe ser otra parte del código, ahora no me carga las naves que debería, en vez de las naves pirata, me carga civiles, creo que al cambiar esta parte, afecta al código de debajo de alguna forma...
Voy a seguir revisando y re-formando antes de seguir, porque me acabo de topar con un punto muerto cojonudo x3.

EDIT: Bueno, tras retocar unas cuantas cosas, ya funciona mejor. Y al final acabé metiendo las 5 navecitas en un array para cargar sus datos e imagen de una forma más cómoda.

Muchas gracias por la ayuda.