Saltar al contenido

Algoritmo para determinar Game Over de Tic Tac Toe

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.

  1. sencillo.
  2. Un bucle.
  3. Cinco variables simples: 4 enteros y uno booleano.
  4. Escala a cualquier tamaño de n.
  5. Sólo comprueba la pieza actual.
  6. sin magia 🙂

Nos puedes avalar nuestra publicación mostrando un comentario y puntuándolo te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *