Compruebe el ganador, empate o partida de tres en raya
Este comprobador de ganador de tres en raya lee un tablero 3x3 completo o parcial y determina su resultado actual.
Ejecutar — gratis
Indica si ha ganado X u O, si un tablero lleno termina en empate o a quién corresponde el siguiente turno cuando la partida puede continuar. También rechaza tableros mal formados y cantidades imposibles de fichas X y O, por lo que sirve para validar partidas guardadas, probar lógica de juegos, revisar ejercicios y alimentar aplicaciones pequeñas sin depender de conjeturas ni inspecciones visuales.
Introduzca el tablero en un formato claro de tres líneas
Proporcione exactamente tres filas con tres casillas en cada una. Use X para el primer jugador, O para el segundo y un guion para cualquier casilla vacía. Puede colocar espacios entre las casillas para facilitar la lectura, como en X O X, porque se ignoran los espacios en blanco dentro de cada fila. Mantenga cada fila del tablero en su propia línea. El comprobador trata las letras x y o minúsculas como sus equivalentes mayúsculas, pero rechaza cualquier otro carácter de casilla. Este formato estricto facilita escribir, pegar, guardar como caso de prueba o generar el tablero desde una aplicación, a la vez que evita símbolos ambiguos. El primer jugador siempre es X, de acuerdo con el orden habitual del tres en raya. Por tanto, un tablero vacío consta de tres filas de tres guiones, y un tablero parcial conserva un guion donde nadie haya jugado. Si hay demasiadas o muy pocas filas, una fila tiene un número incorrecto de casillas o aparece una marca no admitida, la solicitud devuelve un error de entrada en lugar de intentar reparar o reinterpretar la posición. Así, las comprobaciones automatizadas siguen siendo previsibles.
Interprete la detección de victorias y empates
El comprobador examina las ocho líneas ganadoras posibles: tres filas horizontales, tres columnas verticales y las dos diagonales. Un jugador gana cuando una o varias de esas líneas contienen tres marcas iguales. La respuesta ganadora identifica al jugador y devuelve todas las líneas vencedoras como pares de coordenadas de fila y columna. Las coordenadas empiezan en uno, por lo que la casilla superior izquierda es fila 1, columna 1. Devolver todas las líneas coincidentes resulta importante cuando el último movimiento completa dos líneas a la vez. Si ningún jugador tiene una línea ganadora y todas las casillas están ocupadas, el resultado es un empate. Si quedan casillas vacías, la partida se declara en curso y la respuesta identifica al siguiente jugador según la cantidad de marcas. El algoritmo es determinista y solo recorre las nueve casillas y las ocho líneas conocidas. No utiliza aleatoriedad, servicios de red, estado almacenado ni suposiciones sobre movimientos que no estén representados en el tablero. Un mismo tablero siempre produce el mismo resultado estructurado, lo que hace que la capacidad sea apropiada para pruebas unitarias y validaciones repetibles.
Detecte posiciones que no pueden surgir en una partida legal
Un tablero puede parecer plausible y, aun así, incumplir el orden de juego. Como X mueve primero y los jugadores se alternan, X debe tener la misma cantidad de marcas que O o exactamente una más. El comprobador rechaza una posición si O ha jugado más veces que X o si X lleva una ventaja de dos movimientos o más. También contrasta una victoria con esas cantidades: para que gane X debe haber una marca X adicional, mientras que una victoria de O exige cantidades iguales. Se rechaza un tablero donde ambos jugadores tengan líneas ganadoras, porque la partida debería haberse detenido tras la primera victoria válida. Estas comprobaciones son especialmente útiles cuando los tableros proceden de entradas de usuarios, registros de bases de datos, tutoriales, ejercicios de entrevistas o un motor de juego personalizado en desarrollo. Impiden que una posición imposible se etiquete por error como victoria o empate válido. La capacidad evalúa la instantánea proporcionada, no reconstruye todo el historial de movimientos, por lo que la validación se centra en los hechos que un tablero 3x3 puede demostrar directamente. En una posición válida sin terminar, use next_player para continuar con la marca correcta.
Qué puede hacer con ella
Pruebe un motor de juego
Compare el tablero guardado por su aplicación con un resultado determinista durante las pruebas automatizadas.
Valide problemas enviados
Rechace posiciones mal formadas o con turnos incoherentes antes de calificar la respuesta de una persona.
Reanude una partida guardada
Determine si el juego ha terminado e identifique al siguiente jugador correcto en un tablero sin finalizar.
Preguntas frecuentes
¿Qué formato de tablero debo usar?
Envíe tres líneas de tres casillas y use X, O y - para una casilla vacía. Los espacios entre casillas son opcionales.
¿Se admiten letras minúsculas?
Sí. Las letras x y o minúsculas se convierten a mayúsculas antes de comprobar el tablero.
¿Cómo se representan las líneas ganadoras?
Cada línea ganadora es una matriz de tres pares de coordenadas de fila y columna que empiezan en uno.
¿Cuándo es inválida la cantidad de X y O?
O nunca puede tener más marcas que X, y X no puede tener más de una marca adicional porque empieza y los turnos se alternan.
¿Cuánto cuesta?
Cada solicitud API cuesta $0.002. La versión para navegador puede ejecutarse localmente en la página.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/game/tic-tac-toe-winner-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"board":"X O X\nO X -\n- O X"}'const res = await fetch("https://api.kit.forhosting.com/game/tic-tac-toe-winner-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"board": "X O X\nO X -\n- O X"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/game/tic-tac-toe-winner-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"board": "X O X\nO X -\n- O X"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/game/tic-tac-toe-winner-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"board":"X O X\\nO X -\\n- O X"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"board":"X O X\nO X -\n- O X"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/game/tic-tac-toe-winner-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"board": "X O X\nO X -\n- O X"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "game.tic_tac_toe_winner_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |