Programación General > Visual Basic 6.0 e inferiores

 Problemas Con El Mastermind

<< < (2/2)

Nebire:
A ver, recuerda que aquí no se hacen tareas. Expones dudas y se te orienta.

No se exactamente cual es tu problema, creía que era que no entendías el código anterior, ahora pones el formulario pero no reflejas cuales son las dudas que tienes ... no cnoces las reglas del juego?.

En fin más bien creo que no sabes por donde empezar.Entonces te explico someramente como proceder pero el trabajo de programarlo será tuyo.

Veamos: De entrada podrías usar colores en vez de números, basta que pintes 10 colores, por ejemplo 10 controles label(label1(0) ... label1(9))  y le das color de fondo distinto y que la 'banca' elija al azar 4 de ellos .
Algo así:

--- Código: Text --- public function Barajar_JugadaBanca() as integer()   dim colores(0 to 3) as integer    randomice timer  ' activamos aleatorio usando como semilla el timer    for k= 0 to 3       colores(k)= int(10 * (rnd +1)  'tomamos una bola al azar, no nos importa el color sólo la posición en la matriz    next    Barajar_JugadaBanca=coloresend function  
Luego de tener la jugada guardada, le cedes el turno al jugador 'destapando' las celdillas y activando las bolas. las bolas son controles  label (o controles image o picture) . Inicias el contador de oportunidades del jugador (un bucle va bien si tiene 10 jugadas pues eso ). Cuando pulse en el control que contiene un color capturas el color del fondo  colorElegido= label1(index).backcolor  ' colorelegido es un long

luego esperas que pulse en la línea de controles, las celdillas son una matriz de dos dimensiones


--- Código: Text ---public type infoCeldas    celda as long   ' contedrá el color    usado as boolean   ' para marcar que se ha colocado bola en ellaend type ' será 0 to 9, 0 to 3 pero eso cuando se redimensiones el arraydim celdas() as infoceldas 
Cuando el usuario pulse en la línea activa (para indicar la línea activa ponle un shape rodeando las 4 celdas en que debe depositar sus bolas.

Las celdas como controles son tambien label pero con fondo blanco de entrada. necesitarás 40,


--- Código: Text ---dim lineaActiva as integer ' indica que línea sería la activa, al iniciar una partida su valor se pone a 1lineaActiva=1 en el evento click delos  'labelCeldas' compruebas si se pulsó en la línea activa


--- Código: Text ---  dim lineaJugador as integer dim posicionLinea as integer   lineaJugador= index&#092;4  ' por ejemplo si era la 18  = línea 4 if lineaJugador= lineaActiva then  '     posicionLinea = index mod 4 ' por ejemplo si pulsó en la celda 18 será la 2ª en la línea    if celdas(lineaJugador,posicionlinea).usado=false then    ' depositamos el color elegido         labelcelda(index).backcolor=colorelegido         celdas(lineaJugador,posicionlinea).usado=true ' la marcamos como usada         celdas(lineaJugador,posicionlinea).color=colorElegido  ' para comprobar color posteriormente        for k=0 to 3  ' comprobamos si la línea está completa             if celdas(lineaactiva,k).usado=false then exit sub  ' si hay alguna sin marcar se sale, a la espera de que esté completo, entonces el bucle finaliza sin salir y se ejecuta el código que le sigue        next        if comprobar_Linea=true then              ' acertó , se notifica al jugador, juego termina        else              lineaActiva=lineaActiva +1              ' desplazamos el shape a la siguiente línea        end if    else        beep ' esa posición ya está ocupada    end ifelse    beep  ' la línea no es la activaend if   
comprobar_Linea es una función que compara la matriz por pareja de índices en un bucle entre 0 y 3 entre la matriz que contiene los colores ocultos que elegimos aleatoriamente y la matriz celdas(lineaActiva, ...)... esta función a su vez marca cada acierto o fallo al lado con unos form1.line(x1,y1)-(x2,y2), monoColor, BF  (monoColor debería ser blanco o negro (vbBlack ó vbWhite) en función de si acertó o falló.

Como el que debe pensar es el jugador aquí no hay que diseñar estrategia para resolverlo, te limitas a: crear función Iniciar_Partida donde pones todas las celdas del jugador en blanco haces un form1.cls para borrar los cuadraditos de fallo o acierto sobre las líneas. iniciar partida se invoca desde un botón que se activa cuando la partida termina y cuando se abre el programa, iniciar partida también borra la matriz celdas,  redim celdas(0 to 9, 0 to 3), toma la matriz aleatoria de colores (usando índices o el color eso a tu gusto) se deshabilita el botón a sí mismo y antes de salir de dicho evento se le pasa al turno al jugador...

Vamos ya lo tienes mascado...

ildiavolo:
ok muy agradecido  :D

Nebire:
Hay algunos detalles que he dejado sueltos...

Por ejemplo es deseable que el color elegido al azar no esté repetido, por lo que tendrás que comprobarlo con cada elección eso es tarea tuya.

En casi todo he usado un índica basado en 0 así 'lineaActiva' también debería ser 0 de entrada ya que hasta que no se llegue a las celda 4 no será la línea 1 de acuerdo a la fórmula usada  'lineaactiva= celda \ 4'.

No incluí una comprobación de final de juego si el jugador completa todas las líneas sin acertar. Tu deberías saber donde debe ponerse, así que queda a tu trabajo.

Fíjate que he dejado abierto la posibilidad de que puedas referirte a la matriz de solución tanto por su color como por el índice que ocupa en la fila de donde el jugador selecciona las 'bolas', en el código esto se 've' mezclado, para forzarte a pensar y descubrir que falla, por tanto antes de empezar si lo piensas bien deberías elegir cual, para hacer la lógica acorde a esa eleccción.

Si te animas pon el resultado final que veamos como te quedó...

ildiavolo:
el trabajo era mas que nada en numeros, no me deja poner un link para que puedan bajar el juego pero buen aca les dejo el codigo final   B)

Option Explicit
Dim strnum As String
Dim byterr As Byte
 Dim S_MIN, S_SEC As Integer


Private Sub cmdprocesar_Click()
Dim i As Byte
Dim j As Byte
Dim pbueno As Integer
Dim pmedio As Integer
Dim pmalo As Integer
Dim bueno As Integer
Dim medio As Integer
Dim malo As Integer
Dim a As Boolean
Dim b As String
b = Txtnumero.Text

For i = 1 To Len(Txtnumerofinal.Text)
  For j = 1 + i To Len(Txtnumerofinal.Text)
    If Mid(Txtnumerofinal, i, 1) = Mid(Txtnumerofinal, j, 1) Then
      MsgBox "SOLO NUMEROS DISTINTOS"
      Txtnumerofinal.Text = ""
      Txtnumerofinal.SetFocus
      Exit Sub
    End If
  Next
Next

If Not IsNumeric(Txtnumerofinal.Text) Then
  MsgBox "SOLO SE PERMITEN NUMEROS"
  Txtnumerofinal.Text = ""
  Txtnumerofinal.SetFocus
  Exit Sub
Else
  If Txtnumerofinal.Text = "" Then
    MsgBox "SOLO NUMEROS DISTINTOS"
    Txtnumerofinal.Text = ""
    Txtnumerofinal.SetFocus
    Exit Sub
  Else
    If Len(Txtnumerofinal.Text) <> 4 Then
      MsgBox "SOLO NUMEROS DISTINTOS"
      Txtnumerofinal.Text = ""
      Txtnumerofinal.SetFocus
      Exit Sub
    End If
  End If
End If

For i = 1 To Len(Txtnumerofinal.Text)
  a = False
  j = 1
  bueno = 0
  medio = 0
 malo = 0
  Do While a = False And j <= 9
    If Mid(Txtnumerofinal.Text, i, 1) = Mid(b, j, 1) Then
      If i = j Then
       bueno = 1
        medio = 0
        malo = 0
      Else
        medio = 1
        bueno = 0
       malo = 0
      End If
      a = True
    Else
      If bueno = 0 And medio = 0 Then
        malo = 1
       bueno = 0
     medio = 0
      End If
    End If
    j = j + 1
  Loop
pbueno = pbueno + bueno
  pmedio = pmedio + medio
  pmalo = pmalo + malo
Next

Txtmalo.Text = pmalo
Txtmedio.Text = pmedio
Txtbueno.Text = pbueno

If Txtbueno = 4 Then
  MsgBox "ENHORABUENA HAS GANADO " & Txtnumero.Text
  End
End If

If Txtbueno.Text & 4 Then
  byterr = byterr + 1
  lblVer.Caption = "" & byterr & " de 10"
End If

If byterr = 10 Then
  MsgBox "PERDISTE EL NUMERO ERA: " & Txtnumero.Text
End
End If
Txtnumerofinal = ""
Txtnumerofinal.SetFocus
Print Txtnumerofinal; ""

End Sub

Private Sub Cmdorde_Click()
Dim strg As String
Dim i As Integer
Dim j As Integer
Dim numeric As Integer
Timer = True
    For i = 1 To Len(Txtnumero.Text)
        For j = 1 + i To Len(Txtnumero.Text)
            If Mid(Txtnumero, i, 1) = Mid(Txtnumero, j, 1) Then
                MsgBox "SOLO NUMEROS"
                Txtnumero.Text = ""
                Txtnumero.SetFocus
                Exit Sub
            End If
        Next
    Next
If Not IsNumeric(Txtnumero.Text) Then
    MsgBox "INGRESE SOLO NUMEROS"
        Txtnumero.Text = ""
        Txtnumero.SetFocus
    Exit Sub
Else
If Txtnumero.Text = "" Then
    MsgBox "INGRESE SOLO NUMEROS"
        Txtnumero.Text = ""
        Txtnumero.SetFocus
    Exit Sub
Else
If Len(Txtnumero.Text) <> 4 Then
    MsgBox "INGRESE SOLO NUMEROS"
        Txtnumero.Text = ""
        Txtnumero.SetFocus
    Exit Sub
End If
End If
End If
Franum.Visible = False
Framegame.Visible = True
Cmdprocesar.Enabled = True
Txtnumerofinal.Enabled = True
Txtnumerofinal.SetFocus
End Sub


Private Sub CmdSalir_Click()
End
End Sub

Private Sub cmdsalir2_Click()
End
End Sub

Private Sub Txtnum_Change()

End Sub

Private Sub Command1_Click()

MsgBox "EL JUEGO DE TRATA DE INGRESAR 4 NUMEROS DISTINTOS Y TRATAR DE ACERTAR LOS NUMEROS I SU CORRESPONDIENTE LUGAR SOLO TIENES 10 OPORTUNIDADES "
End Sub

Private Sub Form_Load()

End Sub

Private Sub Timer_Timer()
 
S_SEC = S_SEC + 1
 
 If S_SEC = 60 Then
    S_SEC = 0
    S_MIN = S_MIN + 1
End If
If S_SEC < 10 Then
    Label5.Caption = Str$(S_MIN) + ":0" + Str$(S_SEC)
Else
    Label5.Caption = Str$(S_MIN) + ":" + Str$(S_SEC)
End If
 
End Sub
Public Sub initilize()

SI = 0
TI = 0
   
Counter = 0
S_MIN = 0
S_SEC = 0
   
Dim X, Y, w, Z As Integer
   
   
   
    X = Int(10)
   Time(0) = X
    Y = Int(10)
    Do While (X = Y)
        Y = Int(10)
    Loop
   Time(1) = Y
    Z = Int(10)
    Do While (X = Z) Or (Y = Z)
        Z = Int(10)
    Loop
   Time(2) = Z
    w = Int(10)
    Do While (w = Y) Or (w = X) Or (w = Z)
        w = Int(10)
    Loop
   Time(3) = w
End Sub

Nebire:
No tiene mala pinta.  :beer:
El código no es muy clarificador, resulta nebuloso. Acostúmbrate a usar funciones y rutinas para separar el código de manipulación de la interfaz (botones, y demás) de lo que es la lóogica del programa en este caso del juego. No es posible separarlo totalmente pero usando una función puedes darle un nombre coherente y cuando decidas cambiar un botón por otro objeto para realizar la misma acción te quedará más claro. Siempre que puedas nombra tus variables con algo que tenga sentido al menos para ti. :hitcomp:

Te mando un ejemplo de un ejecutable gráfico que acabo de realizar...   :comp:   en otro momento (si a la gente le interesa y lo pide) las fuentes...
debajo de la imagen se puede descargar el ejecutable:


debajo de la imagen se puede descargar el ejecutable:

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa