como ocultar números en un juego

Iniciado por creiko, 4 Septiembre 2016, 04:11 AM

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

creiko

Buenas estoy haciendo el famoso juego de memoria
con 6 botones
tengo problemas en la parte de ocultar los números y que cuando estos no coincidan se vueltan a tapar
ya tengo la parte que estos solo se repitan 2 veces
1 2 3
3 2 1
es un ejemplo
y otra cosa mas como hago para que estos se roten en los cuadros
solo me logrado que se me cambien en 4 posiciones
si alguien me ayude o me facilite algún código de 6 cuadros para guiarme

pkj

#1
Me aburro mucho, así que aquí tienes un ejemplo de tu juego con explicaciones.

Necesitas un command button llamado command1 y una matriz de controles Image de 6 elementos llamado Image1, (osea, pones un control Image en la ventana. lo copias y lo pegas 5 veces mas, y cuando te pregunte si quieres crear una matriz de controles le dices que si.)

Y luego pegas este code en el form:

Código (vb) [Seleccionar]
Option Explicit

Dim Numeros(5) As Long
Dim Imagen(5) As String
Dim Descubiertas(5) As Long
Dim Tachadas(5) As Long
Dim ImagenReverso As String
Dim Seguir As Long
Dim Intentos As Long
Const MaxIntentos = 5

Private Sub Form_Load()
 Dim F As Long
 ' definimos los ficheros de imagenes
 Imagen(0) = "Imagen1.jpg"
 Imagen(1) = "Imagen2.jpg"
 Imagen(2) = "Imagen3.jpg"
 ImagenReverso = "ImagenReverso.jpg"
 Command1.Caption = "Nueva Partida" ' ponemos el titulo del boton
 For F = 0 To 5
   Image1(F).Stretch = True ' esto sirve para que la imagen se adapte al recuadro del control Image
 Next F
 Randomize Timer
 ' comenzamos una nueva partida
 NuevaPartida
End Sub

Private Sub NuevaPartida()
 Dim F As Long
 Dim F2 As Long
 Dim Numero As Long
 ' cargamos los valores aleatorios de alguna manera...
 For F = 0 To 5
   Numeros(F) = 0
 Next F
 For F = 1 To 2
Repite:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 0
   Else
     GoTo Repite
   End If
 Next F
 For F = 1 To 2
Repite2:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 1
   Else
     GoTo Repite2
   End If
 Next F
 For F = 1 To 2
Repite3:
   Numero = Int(Rnd * 6)
   If Numeros(Numero) = 0 Then
     Numeros(Numero) = 2
   Else
     GoTo Repite3
   End If
 Next F
 
 ' inicializamos
 Intentos = 0
 Seguir = -1
 For F = 0 To 5
   Image1(F).Enabled = True
   Image1(F).Picture = LoadPicture(ImagenReverso) ' cargamos los reversos de las cartas
   Descubiertas(F) = 0 ' todas estan sin descubrir
   Tachadas(F) = 0 ' no hay parejas tachadas
 Next F
End Sub

Private Sub Image1_Click(Index As Integer)
 ' al hacer click
 Static EnUso As Long
 Dim F As Long
 Dim Contador As Long
 ' si la imagen esta descubierta o tachada por haber encontrado la pareja no hacemos nada y salimos
 If Descubiertas(Index) <> 0 Or Tachadas(Index) <> 0 Then Exit Sub
 
 ' si esta sin descubrir...
 ' si estamos en una pausa le metemos prisa a la sub EsperaMiliseg.
 
 
 ' si esta sub esta en uso o ya hemos vuelto a pinchar otra imagen salimos.
 If EnUso = 1 Then
   If Seguir = -1 Then Seguir = Index
   Exit Sub
 End If
 ' si no estaba en uso avisamos de que ahora si lo esta
 EnUso = 1
 
 ' nos ponemos a la espera de otra pulsacion
 Seguir = -1
 
 ' marcamos la imagen como descubierta
 Descubiertas(Index) = 1
 ' cargamos la imagen que hay que mostrar
 Image1(Index).Picture = LoadPicture(Imagen(Numeros(Index)))
 
 ' hacemos una pausa para que se muestre la imagen
 EsperaMiliseg 1000
 
 ' comprobamos si hay parejas o hemos acabado
 Comprobar
 
 ' y salimos
 EnUso = 0
 
 ' si le metimos prisa a la pausa era porque habiamos pinchado
 ' en una imagen, asi que pinchamos la imagen de nuevo
 If Seguir <> -1 Then
   Image1_Click (Seguir)
   Seguir = -1
 End If
End Sub

Sub EsperaMiliseg(ByVal Tiempo As Double)
 Dim HoraActual As Double
 On Local Error Resume Next
 Seguir = -1
 HoraActual = Timer
 Do Until (Timer >= HoraActual + (Tiempo / 1000)) Or (Seguir = 1)
   DoEvents
 Loop
 On Local Error GoTo 0
End Sub

Private Sub Comprobar()
 Dim F As Long
 Dim Pic1 As Long
 Dim Contador As Long
 Pic1 = -1
 For F = 0 To 5
   ' si una imagen esta descubierta y no esta tachada por haber encontrado ya pareja...
   If Descubiertas(F) <> 0 And Tachadas(F) = 0 Then
     ' la contamos...
     Contador = Contador + 1
     ' y nos guardamos su indice.
     If Pic1 = -1 Then
       Pic1 = F
     Else
       ' si ya tenemos guardado un indice, es que esta es la segunda carta descubierta.
       ' si las 2 cargas son iguales...
       If Numeros(F) = Numeros(Pic1) Then
         ' las tachamos...
         Tachadas(F) = 1
         Tachadas(Pic1) = 1
         ' avisamos del acierto con un beep.
         BeepAcierto
       Else
         ' si son diferentes avisamos del fallo.
         BeepFallo
       End If
       ' y dejamos de buscar porque ya hemos encontrado 2 descubiertas.
       Exit For
     End If
   End If
 Next F
 
 ' comprobamos las descubiertas
 For F = 0 To 5
   If Descubiertas(F) = 0 Then Exit For
 Next F
 ' si hemos descubieto ya todas las cartas hemos ganado
 If F = 6 Then
   MsgBox "Finalizado. Has ganado."
 Else
   ' si no estan todas descubiertas...
   If Contador = 2 Then
     ' contamos los intentos.
     Intentos = Intentos + 1
     ' si ya has llegado al maximo de intentos pierdes
     If Intentos = MaxIntentos Then
       MsgBox "No te quedan intentos. Has perdido."
       ' deshabilitamos los Image para no seguir procesando ordenes.
       For F = 0 To 5
         Image1(F).Enabled = False
       Next F
       ' y salimos.
       GoTo FinSub
     End If
     
     ' si no era el ultimo intento...
     For F = 0 To 5
       ' volteamos las cartas que no estan tachadas y seguimos.
       If Tachadas(F) = 0 Then
         Image1(F) = LoadPicture(ImagenReverso)
         Descubiertas(F) = 0
       End If
     Next F
   End If
 End If

FinSub:

End Sub

Private Sub BeepAcierto()
 Beep
End Sub

Private Sub BeepFallo()
 Beep
End Sub

Private Sub Command1_Click()
 NuevaPartida
End Sub



No es una obra de arte pero funciona.

Saludos




Sorry, la línea 125 (en la sub EsperaMiliseg) debería ser así:

Código (vb) [Seleccionar]
Do Until (Timer >= HoraActual + (Tiempo / 1000)) Or (Seguir <> -1)

Si no, no le metemos prisa al timer :P

Resaludos

MOD EDIT: A estas alturas deberías saber que no debes hacer doble post. Edita tu mensaje.

Pido perdón, el botón Modificar es tan pequeño que creo que no lo había visto nunca.
Siempre busco abajo entre los botones grandes (y me cabreo por no poder editar :) )