Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Xs And Os Referee
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Xs And Os Referee 
 
Hace unos días Shell comentó sobre Checkio y pss me puse a jugar algunos retos, y aquí lanzo la convocatoria para la resolución de uno de ellos en gambas.

Tic-Tac-Toe, a veces conocido también como Xs y Os, es un juego de dos jugadores (X y O) que toman turnos para marcar espacios en una malla 3x3. El jugador que logra poner tres respectivas marcas en línea horizontal, vertical o diagonal (de noroeste-sureste y noreste-suroeste) gana el juego.

Pero nosotros no estaremos jugando este juego. Tu seras el referee para los resultados de este juego. Se te dará un resultado de un juego y tu debes determinar si el juego terminó en una vitoria o empate, así como quien será el ganador. Asegurate de regresar 'X' si jugador-X gana y una 'O' si jugador-O gana. Si el juego queda en empate regresa una 'D' (Draw - Empate).

x-o-referee

Un resultado de juego es presentado como un array de strings, donde 'X' y 'O' son las marcas de los jugadores y '.' es una celda vacía.

Entrada: Un resultado de juego como un array de strings (unicode).

Salida: 'X', 'O' o 'D' como una string.
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Se supone que es un reto de los "simples", aunque yo me tardé un ratillo porque quería hacerlo simple y elegante pero creo aún no conozco bien python porque terminé usando mis loops FOR, jajaja

Espero se animen a participar que está muy divertido este reto.

Saludos!
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Hola RazaAztk.

Se debe tener en cuenta "solo" las posibles combinaciones para hacer tres en raya.
Tenemos una función a la que pasamos el tablero y la letra del jugador. Devolviendo verdadero o falso
si se ha hecho tres en raya.

Podemos hacer tres en raya de estas formas:

- En la parte superior
- En la parte de en medio
- En la parte de abajo
- Por la izquierda
- Por el medio
- Por la derecha
- Diagonal 1
- Diagonal 2

Nuestra función va a recibir: tablero y letra y devolverá verdadero o falso

HayGanador(t, l)

Continuara..


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Qué tal!

Que bueno Shell que te animes a resolver este reto, yo acabo de terminar mi implementación en gambas y ocupé más líneas que el código que hice en python, y también ocupé otros recursos (en python corrí sobre los elementos de tuplas y en gambas usé funciones de cadena). Espero ver que tal te ha quedado tu código y cómo lo resolviste.

Dejo una plantilla para usar como base en la implementación en gambas.

Saludos!

' gambas module file

Function checkio(game_result As String[]) As String
  
  ' Your code here!
  Return "X" Or "O" Or "D"
  
End

Public Sub Main()

  If checkio(["X.O",
              "XX.",
              "XXO"]) = "X" Then Print "1st Ok"
  If checkio(["OO.",
              "XOX",
              "XOX"]) = "O" Then Print "2nd Ok"
  If checkio(["OOX",
              "XXO",
              "OXX"]) = "D" Then Print "3rd Ok"
  If checkio(["O.X",
              "XX.",
              "XOO"]) = "X" Then Print "4th Ok"

End
 

 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Hola!.

Esta es otra forma de hacerlo. Como lo primero es la honradez, diré que la idea no es mía.
La implementación si. Como veo que es una buena opción la muestro para que la veáis.

Existen dos funciones, una que comprueba si se ha hecho tres en raya y la otra para dibujar el tablero. (en consola)
Durante el juego se comprueba la letra jugador y el tablero, saliendo del juego en caso de que alguno
haya conseguido hacer tres en raya, persona o ordenador.

El código se extiende debido al testeo.

' gambas module file
Public Sub Main()
  
  Dim tablero As New String[10]

 'No es necesario si no se juega  
 ' tablero.Fill(" ", 0, 10)
 
  'Prueba1
  tablero = ["",
    "X", " ", "O",
    "X", "X", " ",
    "X", "X", "O"]  
  
  DibujaTablero(tablero)
  'Jugador X    
  Print HayGanador(tablero, "X")  
  Print
  
  'Prueba 2
  tablero = ["",
    "O", "O", " ",
    "X", "O", "X",
    "X", "O", "X"]
  
  DibujaTablero(tablero)
  'Jugador O    
  Print HayGanador(tablero, "O")
  Print
  
  'Prueba 3
  tablero = ["",
    "O", "O", "X",
    "X", "X", "O",
    "O", "X", "X"]
  
  DibujaTablero(tablero)
  'Jugador X    
  Print HayGanador(tablero, "X")
  'Jugador O    
  Print HayGanador(tablero, "O")
  Print
  
  'Prueba 4
  tablero = ["",
    "O", " ", "X",
    "X", "X", " ",
    "X", "O", "O"]
  
  DibujaTablero(tablero)
  'Jugador X    
  Print HayGanador(tablero, "X")
  
End

Public Function HayGanador(t As String[], l As String) As Boolean
  
  Return ((t[7] = l And t[8] = l And t[9] = l) Or 'En la parte superior
    (t[4] = l And t[5] = l And t[6] = l) Or  'En la parte de en medio
    (t[1] = l And t[2] And t[3] = l) Or     'En la parte de abajo    
    (t[7] = l And t[4] = l And t[1] = l) Or  'Por la izquierda
    (t[8] = l And t[5] = l And t[2] = l) Or  'Por el medio
    (t[9] = l And t[6] = l And t[3] = l) Or  'Por la derecha
    (t[7] = l And t[5] = l And t[3] = l) Or   'diagonal
    (t[9] = l And t[5] = l And t[1] = l))     'diagonal
  
End

Public Sub DibujaTablero(tablero As String[])
  
  ' No se usa el elemento con indice 0  
  Print "   |   |"
  Print " " & tablero[7] & " | " & tablero[8] & " | " & tablero[9]
  Print "   |   |"
  Print "-----------"
  Print "   |   |"
  Print " " & tablero[4] & " | " & tablero[5] & " | " & tablero[6]
  Print "   |   |"
  Print "-----------"
  Print "   |   |"
  Print " " & tablero[1] & " | " & tablero[2] & " | " & tablero[3]
  Print "   |   |"
  
End
 


Es normal que el código en gambas sea siempre algo mas grande que en Python.
Sobre todo por las declaraciones. Como veis en este código no hay muchas declaraciones.
Creo que es una buena posibilidad, pasarle la letra del jugador y el tablero a la función.

P.d Comprueba el número de jugadas. ¿ Cómo es posible que en la primera partida haya cinco jugadas de la X y solo dos de la O ?.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Viernes, 10 Octobre 2014, 12:45; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Sin usar bucles, la función puede quedar así:  

Function checkio(game_result As String[]) As String
  
  Dim letras As String[] = ["X", "O", "D"]
  Dim l As String
  
  For Each l In letras
    'Parte superior
    If Left(game_result[0], 1) = l And Mid(game_result[0], 1, 1) = l And Right(game_result[0], 1) = l Then Break
    'Parte de en medio
    If Left(game_result[1], 1) = l And Mid(game_result[1], 2, 1) = l And Right(game_result[1], 1) = l Then Break
    'Parte de abajo
    If Left(game_result[2], 1) = l And Mid(game_result[2], 2, 1) = l And Right(game_result[2], 1) = l Then Break
    'Por la izquierda
    If Left(game_result[0], 1) = l And Left(game_result[1], 1) = l And Left(game_result[2], 1) = l Then Break
    'Por en medio
    If Mid(game_result[0], 2, 1) = l And Mid(game_result[1], 2, 1) = l And Mid(game_result[2], 2, 1) = l Then Break
    'Por la derecha
    If Right(game_result[0], 1) = l And Right(game_result[1], 1) = l And Right(game_result[2], 1) = l Then Break
    'Diagonal 1
    If Left(game_result[0], 1) = l And Mid(game_result[1], 2, 1) = l And Right(game_result[2], 1) = l Then Break
    'Diagonal 2
    If Right(game_result[0], 1) = l And Mid(game_result[1], 2, 1) = l And Left(game_result[2], 1) = l Then Break
  Next
  Return l
  
End

Public Sub Main()
  
  If checkio(
      ["X.O",
      "XX.",
      "XXO"]) = "X" Then Print "1st Ok"
  If checkio(
      ["OO.",
      "OOX",
      "OOX"]) = "O" Then Print "2nd Ok"
  If checkio(
      ["OOX",
      "XXO",
      "OXX"]) = "D" Then Print "3rd Ok"
  If checkio(
      ["O.X",
      "XX.",
      "XOO"]) = "X" Then Print "4th Ok"
  If checkio(
      ["XO.",
      "OXO",
      ".OX"]) = "X" Then Print "5th Ok"
  If checkio(
      [".XO",
       "XO.",
       "OX."]) = "O" Then Print "6th Ok"
          
End

 


La ultima letra que es la D se devolvería por defecto en caso de no haberse encontrado la X o la O, lo que haría es recorrer todo los if's hasta el final.
Como es normal esto es el primer ejemplo funcional sin mejorar.

P.d si formateo el código me deforma las sentencias ifs, dejándolas desplazadas, cuando deberían tener la misma sangría.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Por cierto, ahora que estábamos hablando de tres en raya.

Cuando era pequeño jugábamos a otra modalidad de tres en raya. La base era la misma.
Pero cada jugador solo disponías de tres fichas.

A la salida del colegio, en frente teníamos la Catedral Vieja (su construcción fue entre el 1262-1263, luego en el siglo XVIII fue remodelada).
En la escaleras de mármol usábamos una tiza. Y creábamos un tablero como este:

 tres_en_raya

Vaya, como cambia el tamaño de jpg a png.  

Como veis hay unos caminos. Una vez colocadas las tres piezas de cada jugador, los turnos de los jugadores en el caso de
no haber hecho tres en raya, era mover esas fichas por los caminos para lograr hacer tres en raya, solo se podía desplazar
un movimiento.

¿ Imagináis los año que no recordaba esta manera de jugar ?.
En la imagen se ve una dirección, quizás se pueda jugar de esa manera.

Oye, pues la pagina esta muy interesante, otro post más para Shell!, alla voyyy!.

Pues si, debió ser una variante del juego tres en raya.

Citar:

Tres en línea: Es una variante que se juega en un tablero con nueve puntos conectados vertical y horizontalmente, además de dos grandes diagonales. Cada jugador consta de tres piezas. Por turnos, cada uno coloca sus piezas, cuando todas están en el tablero, empiezan a moverse una intersección por turno. El primero que logra hacer una fila con sus tres piezas, gana.


Pero por lo general estamos tan acostumbrados a la clásica versión que no volvemos a verla.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Domingo, 12 Octobre 2014, 12:40; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Shell:
Citar:

Tres en línea: Es una variante que se juega en un tablero con nueve puntos conectados vertical y horizontalmente, además de dos grandes diagonales. Cada jugador consta de tres piezas. Por turnos, cada uno coloca sus piezas, cuando todas están en el tablero, empiezan a moverse una intersección por turno. El primero que logra hacer una fila con sus tres piezas, gana.

Esta chula, no conocia esa variante...  


Citar:
Vaya, como cambia el tamaño de jpg a png.

Cambiar de jpg a png, no varia el tamaño, solo el número de colores

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Hola Julio.

jsbsan escribió: [Ver mensaje]
Shell:
Citar:
Vaya, como cambia el tamaño de jpg a png.

Cambiar de jpg a png, no varia el tamaño, solo el número de colores


No me refiero a la resolución, sino a que los archivos son mas grande.  
Y eso que le pongo la calidad a la mitad con Gimp cuando exporto el archivo a otro formato.

Es que normalmente los jpeg no se suelen previsualizar "aparentemente" en el editor de la comunidad,
por eso los convierto a png.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Xs And Os Referee 
 
Qué tal!

Disculpen la tardanza, fue un fin de semana muy divertido, jejeje.

Hey Shell, código simple y funcional; creo yo me compliqué mucho usando un buen de variables y otras cosas. Pero aquí dejo mis códigos. El primero en python, el que usé para pasar el reto en checkio

def checkio(game_result):
    op = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
    
    for p in op:
        i_r, i_c = int(p[0]/3), p[0]%3
        j_r, j_c = int(p[1]/3), p[1]%3
        k_r, k_c = int(p[2]/3), p[2]%3
        p_p = game_result[i_r][i_c] + game_result[j_r][j_c] + game_result[k_r][k_c]
        if p_p == 'XXX':
            return 'X'
        elif p_p == 'OOO':
            return 'O'
    return 'D'

if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert checkio([
        "X.O",
        "XX.",
        "XOO"]) == "X", "Xs wins"
    assert checkio([
        "OO.",
        "XOX",
        "XOX"]) == "O", "Os wins"
    assert checkio([
        "OOX",
        "XXO",
        "OXX"]) == "D", "Draw"
    assert checkio([
        "O.X",
        "XX.",
        "XOO"]) == "X", "Xs wins again"
 


Y mi código rebuscado en gambas:

' gambas module file

Function checkio(game_result As String[]) As String
  
  Dim op As String[] = ["*1*2*3*", "*4*5*6*", "*7*8*9*", "*1*4*7*", "*2*5*8*", "*3*6*9*", "*1*5*9*", "*3*5*7*"]
  Dim pt As String
  Dim s_t As String
  Dim py As String
  Dim s_r As String = ""
  Dim i As Integer = -1
  s_t = game_result.Join("")
  For Each py In ["X", "O"]
    While (i <> 0) And (i < 10)
      i = String.InStr(s_t, py, i + 1)
      s_r = s_r & i
    Wend
    For Each pt In op
      If s_r Like pt Then Return py
    Next
    s_r = ""
    i = -1
  Next
  Return "D"
  
End

Public Sub Main()

  If checkio(["X.O",
              "XX.",
              "XXO"]) = "X" Then Print "1st Ok"
  If checkio(["OO.",
              "XOX",
              "XOX"]) = "O" Then Print "2nd Ok"
  If checkio(["OOX",
              "XXO",
              "OXX"]) = "D" Then Print "3rd Ok"
  If checkio(["O.X",
              "XX.",
              "XOO"]) = "X" Then Print "4th Ok"

End
 


Saludos!
 



 
razaAztk - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuarioVer la galería personal del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron