Desarrollo de Lógica y Algoritmos para Juegos en Programación

Clasificado en Inglés

Escrito el en español con un tamaño de 9,34 KB

Implementación de Algoritmos y Lógica de Juegos en Pseudocódigo

Este documento presenta una serie de implementaciones en pseudocódigo, que simulan la lógica de diversos juegos y algoritmos fundamentales. Se abordan desde la mecánica de un juego clásico como el Tres en Raya, hasta las reglas de movimiento de piezas de ajedrez, la lógica de un juego de adivinanzas como Mastermind, la conversión de números a binario y una validación básica para Sudoku.

Juego de Tres en Raya (Tic-Tac-Toe)

A continuación, se detalla la lógica para un juego de Tres en Raya, incluyendo la inicialización del tablero, la gestión de turnos, la validación de movimientos y la determinación del ganador o un empate.


tablero = [0,0,0; 0,0,0; 0,0,0]; % Inicialización de un tablero 3x3 con ceros
ganador = 0;
lleno = 0;
jugador = 1;

while (lleno < 9 && ganador == 0)
    disp(['Jugador ' num2str(jugador)]);
    x = input('Ingrese coordenada x (1-3): ');
    y = input('Ingrese coordenada y (1-3): ');

    if tablero(x,y) ~= 0
        disp('¡Casilla ocupada! Por favor, introduzca una ficha en otra casilla.');
    else if x < 1 || x > 3 || y < 1 || y > 3
        disp('¡Coordenadas fuera de rango! Por favor, introduzca una ficha en otra casilla.');
    else
        correcto = 1; % Indica que la jugada es válida
    end
    end
    % Nota: La siguiente línea se ejecuta independientemente de si la jugada fue "correcta"
    % en el bloque if/else if/else anterior. En una implementación real,
    % esta parte debería estar dentro del 'else' del bloque de validación.
    tablero(x,y) = jugador;

    % Comprobación de victoria en fila
    n = find(tablero(x, :) == jugador);
    % Comprobación de victoria en columna
    v = find(tablero(:,y) == jugador);
    % Comprobación de victoria en diagonal principal
    d1 = find(diag(tablero) == jugador);
    % Comprobación de victoria en diagonal secundaria
    aux = [tablero(1,3) tablero(2,2) tablero(3,1)];
    d2 = find(aux == jugador);

    if (length(n) == 3 || length(v) == 3 || length(d1) == 3 || length(d2) == 3)
        ganador = jugador;
    end

    lleno = lleno + 1; % Incrementa el contador de casillas llenas

    if jugador == 1
        jugador = 2;
    else
        jugador = 1;
    end
end % Fin del bucle principal del juego

if jugador == 1
    disp('¡Jugador 1 gana!');
else
    if ganador == 2
        disp('¡Jugador 2 gana!');
    else
        disp('¡Es un empate!');
    end
end

Lógica de Movimiento de Piezas de Ajedrez

Esta sección presenta funciones individuales para validar los movimientos básicos de las piezas de ajedrez en un tablero de 8x8. Cada función devuelve s=1 si el movimiento es válido y s=0 si no lo es, considerando solo la posición inicial y final, sin tener en cuenta obstáculos o capturas (excepto el peón).

Función para la Reina (Queen)


function s = reina(a, b, x, y)
    s = 1;
    if x < 1 || x > 8 || y < 1 || y > 8 % Fuera de los bordes del tablero
        s = 0;
    end
    ax = abs(a - x);
    by = abs(b - y);
    % Nota: La lógica original para la reina es incompleta.
    % Una reina se mueve horizontal, vertical o diagonalmente.
    % La condición correcta sería: if ~(ax == 0 || by == 0 || ax == by) s = 0; end;
    if a ~= x && b ~= y % Si no es movimiento horizontal ni vertical
        s = 0;
    end
end

Función para el Alfil (Bishop)


function s = alfil(a, b, x, y)
    s = 1;
    color = 1; % Variable 'color' no definida como entrada, posible placeholder.
    if x < 1 || x > 8 || y < 1 || y > 8
        s = 0;
    end
    % Nota: Falta la lógica para validar el movimiento diagonal (abs(a-x) == abs(b-y)).
end

Función para el Peón (Pawn)


function s = peon(tablero, color, a, b, x, y)
    s = 1;
    if x < 1 || x > 8 || y < 1 || y > 8
        s = 0;
    end
    if color == 1 % Asumiendo color 1 para peones que avanzan hacia arriba (disminuyen 'a')
        if (a - x) ~= 1 || (b - y) ~= 0 % Si no avanza una casilla hacia adelante
            s = 0;
        end
        % Lógica de captura: si las casillas adyacentes diagonales no están ocupadas por el oponente (2)
        % Nota: Esta lógica de captura es muy específica y podría ser incorrecta o incompleta.
        if tablero(a, b - 1) ~= 2 || tablero(a, b + 1) ~= 2
            s = 0;
        end
    end
    % Nota: Falta la lógica para el color 2 (peones que avanzan hacia abajo).
end

Función para la Torre (Rook)


function s = torre(a, b, x, y)
    s = 1;
    color = 2; % Variable 'color' no definida como entrada, posible placeholder.
    if x < 1 || x > 8 || y < 1 || y > 8
        s = 0;
    end
    if color == 1 % Inconsistencia con 'color = 2' anterior.
        if a ~= x && b ~= y % Si no es movimiento horizontal ni vertical
            s = 0;
        end
    end
end

Función para el Caballo (Knight)


function s = caballo(tablero, color, a, b, x, y)
    if x < 1 || x > 8 || y < 1 || y > 8
        s = 0;
    end
    % Nota: La lógica para el movimiento del caballo es compleja y parece incorrecta.
    % Un caballo se mueve en forma de 'L': (abs(dx) == 1 && abs(dy) == 2) || (abs(dx) == 2 && abs(dy) == 1).
    if abs((a + 1) - x) ~= abs(b - y)
        s = 0;
    else
        if abs((a - 1) - x) ~= abs(b - y)
            s = 0;
        else
            if abs(a - x) ~= abs((b + 1) - y)
                s = 0;
            else
                if abs(a - x) ~= abs((b - 1) - y)
                    s = 0;
                else
                    s = 1;
                end
            end
        end
    end
end

Función para el Rey (King)


function s = rey(tablero, color, a, b, x, y)
    if x < 1 || x > 8 || y < 1 || y > 8
        s = 0;
    end
    if abs(x - a) > 1 || abs(y - b) > 1 % Si el movimiento es mayor a una casilla
        s = 0;
    end
    % Nota: 'tablero(x-y)' no es una indexación válida. Se asume 'tablero(x,y)'.
    % Esta condición verifica si la casilla de destino está ocupada por una pieza del mismo color.
    if tablero(x,y) == color
        s = 0;
    end
end

Implementación del Juego Mastermind

Este segmento de código simula una versión simplificada del juego Mastermind, donde se comparan secuencias de números para determinar coincidencias.


W = []; % Secuencia a adivinar
V = []; % Intento del jugador
col = 0; % Contador de coincidencias exactas (valor y posición)

for i = 1:4
    V(i) = input('Ingrese valor para la secuencia secreta (1-9): ');
end

while col < 4 % Bucle principal del juego, continúa hasta adivinar los 4 valores
    col = 0; % Reiniciar contador de coincidencias exactas para cada intento
    for i = 1:4
        W(i) = input('Ingrese valores para su intento (1-9): ');
    end

    % 'ncorrecta' cuenta las coincidencias exactas (valor y posición)
    ncorrecta = length(find(V == W));
    % 'col' también cuenta las coincidencias exactas.
    % Nota: En Mastermind real, se distinguen "fichas negras" (correctas en valor y posición)
    % y "fichas blancas" (correctas en valor pero no en posición).
    % Esta implementación solo cuenta las "fichas negras".
    for i = 1:4
        if V(i) == W(i)
            col = col + 1;
        end
    end
    disp([num2str(ncorrecta) ' correctas, ' num2str(col) ' colocadas']);
end

Conversión de Número Decimal a Binario

Este algoritmo convierte un número entero decimal a su representación binaria, mostrándolo como un número decimal (ej. 5 -> 101).


n = input('Introduce un número entero positivo: ');
sol = 0; % Almacena el resultado binario como un número decimal
i = 0;   % Contador para la posición del bit (potencia de 10)
co = n;  % Copia del número original para las operaciones

while co ~= 1
    if rem(co, 2) == 1 % Si el residuo es 1, el bit actual es 1
        sol = sol + 1 * (10^i); % Asumiendo 101^i era un error tipográfico por 10^i
    end
    i = i + 1; % Incrementa la posición del bit
    co = fix(co / 2); % Divide el número por 2 para el siguiente bit
end
sol = sol + 10^i; % Esta línea maneja el último bit (cuando co se convierte en 1)

Validación Básica de Sudoku

Este fragmento de código realiza una validación muy básica para un tablero de Sudoku, comprobando si la suma de cada fila y cada columna es 45 (suma de números del 1 al 9).


% Asumiendo 'A' es una matriz 9x9 que representa el tablero de Sudoku.
% Esta validación es incompleta para un Sudoku real, ya que no verifica
% la unicidad de números en filas, columnas o subcuadrículas 3x3.
if length(find(sum(A) == 45)) == 9 && length(find(sum(A') == 45)) == 9
    s = 1; % Indica que las sumas de filas y columnas son correctas
else
    s = 0; % Indica que las sumas de filas o columnas no son correctas
end

Este documento proporciona una visión general de la implementación de diversas lógicas de programación, desde la simulación de juegos hasta algoritmos matemáticos básicos. Aunque algunas secciones requieren una lógica más robusta para una funcionalidad completa, sirven como punto de partida para el desarrollo de sistemas más complejos.

Entradas relacionadas: