Posteriormente a investigar en diferentes repositorios y sitios de internet al concluir nos hemos encontrado la resolución que te enseñaremos a continuación.
Solución:
Usted sabe que un movimiento ganador solo puede ocurrir después de que X u O hayan realizado su movimiento más reciente, por lo que solo puede buscar filas/columnas con diag opcionales que están contenidos en ese movimiento para limitar su espacio de búsqueda cuando intenta determinar un tablero ganador. Además, dado que hay un número fijo de movimientos en un juego de tres en raya, una vez que se realiza el último movimiento, si no fue un movimiento ganador, por defecto es un juego de empate.
editar: este código es para un tablero n por n con n seguidos para ganar (el tablero 3×3 requiere 3 seguidos, etc.)
editar: código agregado para verificar el antidiagnóstico, no pude encontrar una forma sin bucle para determinar si el punto estaba en el antidiagnóstico, por eso falta ese paso
public class TripleT
enum StateBlank, X, O;
int n = 3;
State[][] board = new State[n][n];
int moveCount;
void Move(int x, int y, State s)
if(board[x][y] == State.Blank)
board[x][y] = s;
moveCount++;
//check end conditions
//check col
for(int i = 0; i < n; i++)
if(board[x][i] != s)
break;
if(i == n-1)
//report win for s
//check row
for(int i = 0; i < n; i++)
if(board[i][y] != s)
break;
if(i == n-1)
//report win for s
//check diag
if(x == y)
//we're on a diagonal
for(int i = 0; i < n; i++)
if(board[i][i] != s)
break;
if(i == n-1)
//report win for s
//check anti diag (thanks rampion)
if(x + y == n - 1)
for(int i = 0; i < n; i++)
if(board[i][(n-1)-i] != s)
break;
if(i == n-1)
//report win for s
//check draw
if(moveCount == (Math.pow(n, 2) - 1))
//report draw
puede usar un cuadrado mágico http://mathworld.wolfram.com/MagicSquare.html si cualquier fila, columna o diag suman 15, entonces un jugador ha ganado.
¿Qué tal este pseudocódigo:
Después de que un jugador coloca una pieza en la posición (x,y):
col=row=diag=rdiag=0
winner=false
for i=1 to n
if cell[x,i]=player then col++
if cell[i,y]=player then row++
if cell[i,i]=player then diag++
if cell[i,n-i+1]=player then rdiag++
if row=n or col=n or diag=n or rdiag=n then winner=true
usaría un array de carbón [n,n]con O,X y espacio para vacío.
- sencillo.
- Un bucle.
- Cinco variables simples: 4 enteros y uno booleano.
- Escala a cualquier tamaño de n.
- Sólo comprueba la pieza actual.
- sin magia 🙂
Nos puedes avalar nuestra publicación mostrando un comentario y puntuándolo te estamos agradecidos.