Dado en VB?

Iniciado por Frikimaster, 29 Enero 2008, 02:48 AM

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

Frikimaster

Muy buenas a todos, hacia mucho que no posteaba por aquí, pero siempre voy mirando post de gente para aprender cosas nuevas :P, soy un programador novato, hace apenas 1 año que empecé con C++ y VB...y lo que me queda xD

Bueno, ahora me encuentro con que estoy haciendo mi proyecto de fin de curso en VB, se trata de un Trivial, y bueno, tengo todavía tiempo para hacer cosas xD, pero ahora estoy enfurruñado en hacer un dado que haga el efecto de girar, y que se me salga un numero aleatorio, y me gustaría que vosotros, que tenéis mas experiencia que yo, me recomendarais como hacerlo, hay algún tutorial o manual? Encontré este

http://www.lawebdelprogramador.com/cursos/mirtavb/entrega3.php , pero me gustaría "juntar" varios códigos, quedarme con el que mas me gusta >.<, que me recomendáis? ^^

Muchisimas Gracias por adelantado.


Frikimaster
La musica de la logica nunca fallara al sonar la melodia de la verdad.

Sancho.Mazorka

#1
Mira buscate un dado, y dibujalo en paint o busca imagenes e intenta dibujarlo en una perspectiva que se vean 3 caras o si queres una sola y cargas en cada picture una cara del dado. Ej:

Código (vb) [Seleccionar]

Picture1.Picture = LoadPicture("C:\dado1.jpg")
Picture2.Picture = LoadPicture("C:\dado2.jpg")
Picture3.Picture = LoadPicture("C:\dado3.jpg")
Picture4.Picture = LoadPicture("C:\dado4.jpg")
Picture5.Picture = LoadPicture("C:\dado5.jpg")
Picture6.Picture = LoadPicture("C:\dado6.jpg")


y despues cuando apretas un boton que su funciona sea "tirar los dados" haces:

Código (vb) [Seleccionar]

Private Sub cmdTirar_Click()
Dim i As Integer
Dim x As Integer

For i = 1 To Int(Rnd * 15) + 3  'El dado puede llegar a rodar 15 veces, minimo 3
   x = Int(Rnd * 6) + 1 'El dado puede salir entre 1 y 6 (osea sus caras)
   Select Case x
      Case 1: PictureDado.Picture = Picture1.Picture 'Si el dado sale 1 carga dado 1
      Case 2: PictureDado.Picture = Picture2.Picture 'Si el dado sale 2 carga dado 2
      Case 3: PictureDado.Picture = Picture3.Picture 'Si el dado sale 3 carga dado 3
      Case 4: PictureDado.Picture = Picture4.Picture 'Si el dado sale 4 carga dado 4
      Case 5: PictureDado.Picture = Picture5.Picture 'Si el dado sale 5 carga dado 5
      Case 6: PictureDado.Picture = Picture6.Picture 'Si el dado sale 6 carga dado 6
    End Select
    DoEvents 'Para que nuestro programa funcione sin colgarse
    PictureDado.Refresh 'Redibujamos la imagen del dado para visualizar bien
    Call Sleep(250) 'Duerme al programa por 0.25 segundos
Next i
End Sub


Y por ultimo agregamos esta API y esta funcion en el Form_Load para que empieze a crear numeros aleatorios:

Código (vb) [Seleccionar]
Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Randomize


Entonces el codigo bien armado nos queda asi:

Código (vb) [Seleccionar]

Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Private Sub Form_Load()
'Aca cargamos cada picture con una imagen del dado diferente (1 x cada cara)
Randomize
Picture1.Picture = LoadPicture("C:\dado1.jpg")
Picture2.Picture = LoadPicture("C:\dado2.jpg")
Picture3.Picture = LoadPicture("C:\dado3.jpg")
Picture4.Picture = LoadPicture("C:\dado4.jpg")
Picture5.Picture = LoadPicture("C:\dado5.jpg")
Picture6.Picture = LoadPicture("C:\dado6.jpg")
End Sub

Private Sub cmdTirar_Click()
Dim i As Integer
Dim x As Integer

For i = 1 To Int(Rnd * 15) + 3  'El dado puede llegar a rodar 15 veces, minimo 3
   x = Int(Rnd * 6) + 1 'El dado puede salir entre 1 y 6 (osea sus caras)
   Select Case x
      Case 1: PictureDado.Picture = Picture1.Picture 'Si el dado sale 1 carga dado 1
      Case 2: PictureDado.Picture = Picture2.Picture 'Si el dado sale 2 carga dado 2
      Case 3: PictureDado.Picture = Picture3.Picture 'Si el dado sale 3 carga dado 3
      Case 4: PictureDado.Picture = Picture4.Picture 'Si el dado sale 4 carga dado 4
      Case 5: PictureDado.Picture = Picture5.Picture 'Si el dado sale 5 carga dado 5
      Case 6: PictureDado.Picture = Picture6.Picture 'Si el dado sale 6 carga dado 6
    End Select
    DoEvents 'Para que nuestro programa funcione sin colgarse
    PictureDado.Refresh 'Redibujamos la imagen del dado para visualizar bien
    Call Sleep(250) 'Duerme al programa por 0.25 segundos
Next i
End Sub


Necesitas:
1 PictureBox llamado PictureDado (Para mostrar el dado)
6 PictureBox llamados Picture1, Picture2, Picture3, etc y con propiedad Visible = False (Para guardar cada cara del dado)
1 CommandButton llamado cmdTirar (Para tirar los dados)
6 Imagenes guardadas en C:\ con nombre dado1.jpg, dado2.jpg hasta el 6


Lo elabore recien, cualquier cosa avisame y espero te sirva

PD: Podes ponerle las imagenes vos a los Picture o buscate 6 imagenes de dados y ponelas en tu Disco C:\ y llamalas Dado1, Dado2, Dado3 y que esan jpg, si queres cambiale la ruta, la extension o lo que te parezca!


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Chefito

Estoy deacuerdo con la respuesta Sancho.Mazorka. Solo voy a puntualizar en dos aspecto....sobre todo uno importante:
En el procedimiento cmd_TirarClick(), mete al principio un Randomize, para que la secuencia de tiradas no se repitan cada vez que pones el programa.
Yo creo que no hace falta poner un Doevents, ya que pones un Sleep.
Ahhhh...por cierto....Int(Rnd * 15) + 3 el dado puede llegar a rodar 17 veces, no 15  ;).
Saludos.
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

Sancho.Mazorka

Chefito lo del Randomize cuando puse el post me di cuenta al revisarlo y cuando fui a editar se me corto la luz, cuando volvio me re olvide, ahora lo arreglo y lo del Int(Rnd * 15) + 3 ninguno tiene razon porque en realidad son 12 numeros empezando en el 3 (por eso dice +3) y terminando en 15

YA EDITE EL POST Y QUEDO ARREGLADO FUNCIONA PERFECTAMENTE!


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Chefito

Haber.........creo que te estas equivocando con los conceptos y resultados un poco. Tu has hecho un for.....next para simular el giro de un dado no?.....pues piensa en tu bucle for.....next por un momento:
for i=1 to int(rnd*15)+3
El int(rnd*15) da un resultado de 0 a 14, siendo 14 el máximo, ok? y a eso se le suma 3 más.......contando con los dedos me salen 14+3=17  ;D.
Por que el maximo de vueltas del dado es 17? Pues por lo anterior, ya que tu bucle for.....next recorre desde 1 (i=1) hasta un maximo de 17 (int(rnd*15)+3).
Saludos.
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

Sancho.Mazorka

#5
 >:( hace la prueba y fijate, el +3 suma a la base del numero osea desde donde empieza, osea que el minimo de giros es 3 xq el RND da un Double aleatorio que x15 puede dar tanto 1,2,3,4,5,6,7,8,9,10,11,12,13,14 pero yo le digo que sea +3 osea que ahora el valor esta entre 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 osea que puede dar maximo 17 giros y minimo 3 giros osea que esta entre 15 posibilidades. En la respuesta anterior mia yo me confundi  :-[

EDIT: me olvide de responder sobre el DoEvents, lo puse porque generalmente al usar la funcion sleep al igual que otras parecidas el programa no acepta eventos hasta que el sleep o dicha funcion termine.


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Chefito

Jajajajaja......esto es un tira y afloja para una chorrada....jajajaja. No te enfades hombre.....los dos tenemos razon a lo que creemos contestar. Pero este comentario que has puesto: 'El dado puede llegar a rodar 15 veces, minimo 3....pues hace pensar que es lo que yo digo y no lo que tu dices. Bueno, dejemoslo, que es una chorrada. Los dos tenemos razón:
Tu, porque el máximo de posibilidades que determina el valor de las vueltas dadas estan entre 3 y 17, o sea 15(que no es lo mismo que el máximo de vueltas que pueda dar el dado, porque esto esta determinado por el bucle for....next).
Yo, porque el máximo de vueltas que puede realizar el bucle abarca de 1 a 17, o sea, 17 vueltas.
Dejemoslo en empate y decir que han sido dos puntos de vista distintos  :xD.
Ni que estuviesemos discutiendo el protocolo del msn, que es lo que estoy mirando ahora mismo en vb!!!!!  ;D jajajajaja.
Saludos.
Moderador del foro oficial de AutoIt en español: www.AutoIt.es.

Todos tenemos inteligencia, lo malo es que algunos no nos acordamos donde la dejamos guardada ;)

Sancho.Mazorka

#7
Tenes razon en lo de las 17 vueltas, x eso me disculpe en mi mensaje anterior!

Va a venir algun Mod y nos va a sacar a patadas de aca  :P

EDIT: y Frikimaster se murio?
:xD


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Frikimaster

Lo que muerto es de envidia, madre mia, yo quiero aprender a programar como vosotros >.<.

Entonces...como queda al final la cosa? xD


Frikimaster
La musica de la logica nunca fallara al sonar la melodia de la verdad.

Freeze.

[broma]Uy FrikiMaster no seas como ellos, son unos creidos. :( :(

Fijate en mi que soy muy humilde.[/broma]




Por cierto, si necesitas ayuda con los dados me avisas. :D