|
Página 1 de 1
|
Autor |
Mensaje |
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
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).
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.
|
#1 Jueves, 09 Octobre 2014, 04:53 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
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!
|
#2 Jueves, 09 Octobre 2014, 04:57 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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"
|
#3 Jueves, 09 Octobre 2014, 21:21 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
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!
|
#4 Viernes, 10 Octobre 2014, 07:01 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#5 Viernes, 10 Octobre 2014, 11:53 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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"
|
#6 Viernes, 10 Octobre 2014, 18:23 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
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
|
#7 Domingo, 12 Octobre 2014, 12:15 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
|
#8 Domingo, 12 Octobre 2014, 21:25 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Xs And Os Referee
Hola Julio.
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"
|
#9 Lunes, 13 Octobre 2014, 00:22 |
|
|
razaAztk
aztk crux
Analista Programador
Registrado: Enero 2010
Mensajes: 340
Edad: 35 Ubicación: Tenochtitlan
|
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!
|
#10 Martes, 14 Octobre 2014, 05:19 |
|
|
|
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|