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.
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!!!
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)
No es Randomize Timer , sino Randomize Time
Y esa instruccion la pones al principio de tu Sub enemyload
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!!!
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?
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
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
Entonces en mis codigos que he creado que siempre uso:
Randomize Time
valor = Cint(Rnd() * 6)
No me esta generando los numeros realmente aleatorios como deberia o que?
Cita de: raul338 en 3 Noviembre 2011, 23:02 PM
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.
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
Gracias raullll
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).
Cita de: raul338 en 3 Noviembre 2011, 23:02 PM
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:
enemy1.exists = (dice >= 1)
enemy2.exists = (dice >= 2)
enemy3.exists = (dice >= 3)
enemy4.exists = (dice >= 4)
enemy5.exists = (dice >= 5)
Dulces Lunas!¡.
Hmm, voy a probarlo, muchas gracias.
Hay que ver la que se puede liar por poner mal una cosita, x3
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
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.