Tute - Estrateg
 |  Explicación  |  Código  | 
 
  Explicación

   El juego de Tute está diseñado en 3 grandes partes. Tute.exe que corresponde a toda la interfaz gráfica, e interacción con otros Tutes (juego en red), Tute.dll que administra todos los datos del juego, cumple las reglas y las hace cumplir y Estrateg.dll. Esta última es la que necesita mucho trabajo. Tute.exe llama a los métodos y funciones de Estrateg.dll para que ésta analice los datos recibidos, tome una decisión y le indique a la interfaz gráfica que carta debe jugar. Todos estos métodos y funciones son lo suficientemente sencillos como para que el juego "haga algo", pero dista mucho de tener la inteligencia necesaria para que Tute juege estratégicamente. Si Ud. decidiera participar, debería escribir el código de estas funciones (y muchas otras, seguramente) para que Estrateg.dll pueda brindarle a Tute.exe una carta a tirar estratégicamente analizada. He aquí el código de Estrateg.dll:

 
  Código
Option Explicit
 
Private Juego As TuteDLL.cJuego
Private  bDebugging As Boolean
 
Public Sub ShuffleForDebbuging(sDeck As String, Cards() As String)
    Dim dummy As String
    Dim i As Integer
   
    'Esta rutina es para forzar un orden de las cartas. De esta forma, se pueden elegir que cartas le toca a cada jugador y poder probar distintos
    'escenarios, dependiendo de lo que se quiera analizar o depurar en ese momento.
   
    'NOTA: Si bien esta subrutina no será llamada cuando no se esté jugando en modo ‘depuración’, no olvidarse comentar el código para que la mezcla del mazo no se vea afectado en el juego final (por las dudas)
   
    If Debugging Then
    '''    Estas líneas son para que el jugador que reparta (en un juego de 5) reciba todos los bastos más grandes.
    '''    Era para probar que la rutina de revisar el capote, y si había cantado o no funciona correctamente.
    '    sDeck = "01c02c03c04c01b05c06c07c10c03b11c12c01e02e12b03e04e05e06e11b" & _
            "07e10e11e12e10b01o02o03o04o07b05o06o07o10o06b11o12o02b04b05b"
    '    dummy = sDeck
    '
    '    For i = 0 To 39
    '        Cards(i) = Left(dummy, 3)
    '        dummy = Mid$(dummy, 4)
    '    Next i
    ' ******************************************************************
    '    Estas líneas son para que el jugador que reparta tenga cuarenta y veinte.
    '    sDeck = "01c02c03c04c12b05c06c07c10c11b11c12c01e02e01b03e04e05e06e03b" & _
            "07e10e11e12e12o01o02o03o04o11o05o06o07o10o06b07b10b02b04b05b"
    '    dummy = sDeck
    '
    '    For i = 0 To 39
    '        Cards(i) = Left(dummy, 3)
    '        dummy = Mid$(dummy, 4)
    '    Next i
    ' ******************************************************************
    ''    Estas líneas son para que el jugador que reparta tenga tute de 12, cuarenta y veinte de oros.
    '    sDeck = "01c02c03c04c12b05c06c07c10c11b11c06b01e02e01b03e04e05e06e03b" & _
            "07e10e11e05b12o01o02o03o04o11o05o06o07o10o12c07b10b02b04b12e"
    '    dummy = sDeck
    '
    '    For i = 0 To 39
    '        Cards(i) = Left(dummy, 3)
    '        dummy = Mid$(dummy, 4)
    '    Next i
    ' ******************************************************************  
    ''    Estas líneas son para que el jugador que reparta tenga tute de 12 y cuarenta (de copas) jugando de a 5.
    '    sDeck = "10c02e05c01b12b04c06c02c03b11c04b05b01e07c03c03e04e05e06e01c" & _
            "07e07o11e07b12o01o02o06b10e04o05o06o10o11o12c03o11b02b10b12e"
    '    dummy = sDeck
    '
    '    For i = 0 To 39
    '        Cards(i) = Left(dummy, 3)
    '        dummy = Mid$(dummy, 4)
    '    Next i
    '
    '    'Secuencia de salida de cartas para poder cantar Tute y haber fallado.
    '    'sCarta = "05o"
    '    'sCarta = "07c"
    '
    '    'Secuencia de salida de cartas para poder cantar Tute y que sea válido fallado.
    '    'sCarta = "05c"
    ' ******************************************************************
'    '    Estas líneas son para que el jugador que reparte tenga tute de 12 y tute de 11 jugando de a 3. Y los triunfos: 01c, 03c, 10c y 07c
'        sDeck = "02e10b10c01b04c12b06c02c11b03b04b11c05b01e12c02b03e03c04e05e" & _
            "11e06e07e01c07o07b12o01o02o11o06b10e12e04o05o06o10o03o07c05c"
'        dummy = sDeck
'
'        For i = 0 To 39
'            Cards(i) = Left(dummy, 3)
'            dummy = Mid$(dummy, 4)
'        Next i
    End If
End Sub
 
Public Property Set Tute(cTute As cJuego)
    Set Juego = cTute
End Property
 
Public Function HagoElCanto(ByVal Coll As Collection, ByVal JugId As Integer, _
  ByVal sCanto As String, ByVal iPuntos As Integer, ByVal sPalo As String) As Boolean
    Dim Carta As cCarta
    Dim Jug As cJugador
   
    'La idea de esta función es que decida si es conveniente realizar el canto o no.
   
    'Recibe:
    '  Coll:    tengo una colección con todas las cartas que están involucradas.
    '  JugId:   ID del jugador que podría cantar.
    '  sCanto:  Canto a analizar ("Tute de 12", "Tute de 11", "Cuarenta",
    '                             "Veinte de Basto", "Veinte de Copa",
    '                             "Veinte de Espada", ""Veinte de Oro").
    '  iPuntos: Cantidad de puntos en juego debido al canto. En el caso de Tute, iPuntos será
    '           igual a -1, debido a que se gana la mano.
    '  sPalo:   El palo que está representado con el canto. En el caso de los tutes, esta variable
    '           estará vacía.
   
    Set Jug = Juego.Jugadores(JugId)        'Jugador que podría cantar
   
    For Each Carta In Coll
        'Cada una de las cartas involucradas. Si fuera necesario recorrer la colección, esta es
        'la forma más sencilla. Referirse a https://emilianomartin.com.ar/Tute/Struct/cCarta.asp para obtener información
        'respecto de que significa cada variable miembro.
    Next
   
    '  Por el momento, devuelvo que SÍ debe hacerse el canto. La idea es que esta función haga todo el análisis que corresponda para
    'que decida si es conveniente o no. En caso de no serlo, debería contestar False.
    HagoElCanto = True
End Function
 
Public Function AnalizarCartasElegidas(Restan As cRestan, JugCartas As Collection, JugId As Integer) As Integer
    'OJO!!
    '    La idea es analizar todas las cartas que puedo tirar. Por ahora,
    '  estoy haciendo un random, pero acá tendría que estar la lógica
    '  que decida que carta  me conviene tirar en función de las variables
    '  del juego.
   
    '     En JugCartas tengo una Collection con todas las cartas que puedo tirar: Si
    '  soy mano están todas las cartas que tengo en la mano. Si no lo soy, sólo están
    '  las cartas que puedo tirar:
   
    '   * Respondiendo al palo y matando, o
    '   * Respondiendo al palo pero sin matar porque no puedo hacerlo -en este caso están
    '     todas las cartas que tengo del palo, o
    '   * Triunfos -si no tengo palo- que matan a los triunfos de la mesa (o todos los que tenga si no pudiera matar), o
    '   * Todas las cartas que tengo en la mano, si no se cumple ninguna de las anteriores.
   
    'Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
   
    If Juego.NivelJuego = ACaraDePerro Then
        RomperCantos JugCartas, JugId
    End If
   
    If Juego.NivelJuego = Intermedio Or Juego.NivelJuego = ACaraDePerro Then
        '   Sólo en los niveles de intermedio y experto se protegerán los cantos. En el caso de principiante no se intentará protegerlos y podría
        'suceder, entonces, que un canto sea desperdiciado.
   
   
        '  Temporalmente, llamaré a ProtegerCantos... para evitar destruir un canto si fuera posible. Obviamente, la idea sería analizar
        'si vale la pena proteger el canto o no.
        ProtegerCantos JugCartas, JugId
    End If
   
    Randomize Timer
    AnalizarCartasElegidas = Int(JugCartas.Count * Rnd + 1)
End Function
 
Private  Function RomperCantos(JugCartas As Collection, JugId As Integer)
    '  Esta función debería intentar romper cantos. O sea... debería analizar las cartas que tenemos, las posibilidades de que alguien haga un canto...
    'y si queremos ir a más, diseñar la estrategia para romper el/los canto(s).
   
    '  Mirar la función "ProtegerCantos" para saber como hacer una similar. En ella se revisa que cartas se pueden evitar (para proteger el canto) y luego se fija
    'si quedaría alguna carta que cumpla con las reglas para ser tirada. Si existen, la(s) carta(s) será(n) removidas de la colección para que éstas no sean tenidas
    'en cuenta.
End Function
 
Private  Function ProtegerCantos(JugCartas As Collection, JugId As Integer)
    Dim Coll As Collection
    Dim sCanto As String
    Dim iPuntos As Integer
    Dim sPalo As String
   
    Dim Carta As cCarta
    Dim CartaMano As cCarta
   
    Dim i As Integer
   
    '  Cualquiera de las cartas que tengo en la mano puede ser tirada cumpliendo
    'las reglas. Puedo quitar las cartas que forman cantos de la colección para
    'proteger el canto... siempre y cuando quede alguna carta para tirar.
    Do
        If Juego.AnalizarCanto(Coll, JugId, sCanto, iPuntos, sPalo) Then
            For Each Carta In Coll
                For Each CartaMano In Juego.Jugadores(JugId).Cartas
                    If Carta.ID = CartaMano.ID Then
                        CartaMano.ID = "-" & CartaMano.ID
                        Exit For
                    End If
                Next
            Next
        Else
            Exit Do
        End If
    Loop
   
    iPuntos = 0
    For Each CartaMano In JugCartas
        If Left$(CartaMano.ID, 1) <> "-" Then
            iPuntos = iPuntos + 1
        End If
    Next
   
    If iPuntos Then
        'Todavía quedan cartas que se podrían tirar protegiendo los cantos
        For Each CartaMano In Juego.Jugadores(JugId).Cartas
            If Left$(CartaMano.ID, 1) = "-" Then
                CartaMano.ID = Mid$(CartaMano.ID, 2)
               
                On Error Resume Next
                'Puede que no sea una carta posible para tirar
                JugCartas.Remove CartaMano.ID
                On Error GoTo 0
            End If
        Next
    End If
   
    'Por las dudas
    For Each CartaMano In Juego.Jugadores(JugId).Cartas
        If Left$(CartaMano.ID, 1) = "-" Then
            CartaMano.ID = Mid$(CartaMano.ID, 2)
        End If
    Next
End Function
 
Public Property Get Debugging() As Boolean
    Debugging = bDebugging
End Property
 
Public Property Let Debugging(ByVal bNewValue As Boolean)
    bDebugging = bNewValue
End Property
 |  Explicación  |  Código  | 
 

Visitante Nº
Counter created by Emiliano F. Martín Counter created by Emiliano F. Martín Counter created by Emiliano F. Martín Counter created by Emiliano F. Martín Counter created by Emiliano F. Martín Counter created by Emiliano F. Martín

Artículos propios

Arts. Sobre seguridad

 |  EmilianoMartin's Home  |  Escoba de 15's Home  |  MP3 Organizer's Home  |  Horarios' Home  |  Tute's Home  |  Bookmark us  | 
© Copyright 2001-2023 Ing. Emiliano F. Martín



email