Yo veo más interesante que una función devuelve un valor indicando cuales de las 8 posibles movimientos del caballo son válidas.
Se pasa a la función las cordenadas del caballo y el estado del tablero.
Con estado del tablero, se indica que contiene uno de estos 3 tipos de valores (en cada casilla del array que lo mantiene):
---: =0; Casilla no ocupada.
---: >0; Casillas ocupadas por el contrincante (el valor define que figura es).
---: <0; Casillas ocupadas por tus propias figuras (el valor define que figura es).
Luego, como el caballo tiene 8 posibles movimientos, usaremos un byte como respuesta:
- Cada bit a 1 indica movimiento posible (casilla vacía o figura del enemigo que se puede comer).
- Cada bit a 0, movimiento no posible (esto es, fuera del tablero u ocupada por tus propias figuras)
// Esta funcion devuelve un byte indicando en cada bit si la casilla correspondiente a dicho bit puede o no saltar el caballo a ella.
// Si el movimiento es posible y la casilla está vacía u ocupada por el enemigo, se pone el bit correspondiente a 1.
byte = funcion PosicionesValidas(entero x, entero y, array tablero() )
    byte n
    
    ' bit 0 y 5 (porque ambos comparten el x-1)
    Si (x-1) >= 0) luego
        Si (y-2) >= 0) luego // bit 0            
            Si Tablero(x-1, y-2) >= 0 luego n = 1 //previamente valía 0.
        fin si
        Si (y+2) >=0) luego //bit 5
            Si Tablero(x-1, y+2) >= 0 luego n= (n or 32) 
        Fin si
    Fin si
    ' bit 1 y 4 (porque ambos comparten el x+1)
    Si (x+1) >= 0) luego
        Si (y-2) >= 0) luego // bit 1            
            Si Tablero(x+1, y-2) >= 0 luego n=(n or 2)
        fin si
        Si (y+2) >=0) luego //bit 4
            Si Tablero(x+1, y+2) >= 0 luego n= (n or 16)
        Fin si
    Fin si
// -----------------------------
     ' bit 6 y 7 (porque ambos comparten el x-2)
    Si (x-2) >= 0) luego
        Si (y-1) >= 0) luego // bit 6            
            Si Tablero(x-2, y-1) >= 0 luego n=(n or 64)
        fin si
        Si (y+1) >=0) luego //bit 7
            Si Tablero(x-2, y+1) >= 0 luego n= (n or 128)
        Fin si
    Fin si
    ' bit 2 y 3 (porque ambos comparten el x+2)
    Si (x+2) >= 0) luego
        Si (y-1) >= 0) luego // bit 2            
            Si Tablero(x+2, y-1) >= 0 luego n= (n or 4)
        fin si
        Si (y+1) >=0) luego //bit 3
            Si Tablero(x+2, y+1) >= 0 luego n= (n or 8) 
        Fin si
    Fin si
    devolver n
fin funcion
- Otra función debiera admitir a qué cordenadas refiere un bit 'n' del byte (que devuelve la función anterior) dada la posición actual del caballo.
- Se añade además  a la función otro parámetro; el array del tablero, y así la función retorna un byte, que es indicadtivo de si se mueve a dicha casilla y si además 'se come' una ficha del enemigo, ó si no es posible moverse a ella...  
// Una enumeración para la devolución de la función así resulta útil saber que pasó.
//  igualmente bastaría un sByte y acordar que este
enumeracion PosibilidadesDeMovimiento
     Movimiento_No_Mueve = -1 //No se puede mover a esa posición (están tus figuras o apunta fuera del tablero)
     Movimiento_Vacio = 0 //se posiciona en OTRA casilla vacía, no pasa nada más.
     // Al comer se podría prescindir de qué figura come (y en todos estos casos devolver simplemente 1) aunque resulta más interesante así...
     // Estos valores deberían coincidir con los valores asignados a las figuras (en otra enumeración, para el tablero) 
     Movimiento_Come1 = 1  // come a un peón
     Movimiento_Come2 = 2  //come a una torre
     Movimiento_Come3 = 3  //come a un caballo
     Movimiento_Come4 = 4  //come a un alfil
     Movimiento_Come5 = 5  // Come a la reina.
     Movimiento_Come6 = 6  //  Mata al rey, fin de partida (el rey no tiene movimientos)
fin enumeracion
Y ahora que queda claramente definida lo que tiene que hace rla función su pseudocódigo resultante:
- Posibles es el byte que se devolvió en la función anterior, y bitposición la elección de movimiento del jugador.
- 'x' e 'y' son las cordenadas actuales y a la devolución contendrán las cordenadas de destino del caballo (solo si fue posible moverse).
PosibilidadesDeMovimiento = funcion PosicionarCaballoSobre(byte x, byte y, byte Posibles, byte BitPosicion, array sByte Tablero() ) 
    sbyte dx, dy
    PosibilidadesDeMovimiento n
    Si ((2^BitPosicion) and posibles) luego  // ¿realmente ese bit está a uno (casilla aceptable donde mover el caballo) ?
        Seleccionar BitPosicion
            caso 0
                dx = x-1
                dy = y-2           
            caso 1
                dx = x+1
                dy = y-2
            caso 2
                ...  // a rellenar por ti...
            caso 3
                ...
            caso 4
                ...
            caso 5
                ...
            caso 6
                ...
            caso 7
                ...
        Fin seleccionar
  
        // no hace falta comprobar dx y dy dentro del tablero, ya que eso se comprobó en la función anterior y se garantiza al inicio de esta función... 
        n = Tablero(dx, dy)
        Si (n>0) luego
            x = dx
            y = dy
            devolver n
        Osi (n=0)
            devolver n
        fin si
    Fin si
    devolver -1
fin funcion
Luego el código de las llamadas sería algo como:
array sByte tablero(0 a 7, 0 a 7)  //el array del estado del tablero está definidio a nivel del módulo/clase
Funcion JugarCaballo(byte x, byte y)  //x, y son las cordenadas actuales del caballo.
    sByte n, p
    posibilidadesDeMovimiento j
    byte dx, dy
    n = PosicionesValidas(x, y, tablero() ) 
    Si (n> 0) luego //hay posiciones válidas para el caballo desde donde está actualmente
        dx= x
        dy = y
        Hacer
            mensajeAlJugador ""Elige una de los 8 posibles movimeintos del caballo (un valor en el rango: (0/7)" con imagen adjunta de las psoiciones que son 0-7)
            p = JugadorEligePosicion // para el caballo (en el rango 0-7
            j = PosicionarCaballoSobre(x, y, n, p, tablero() )
        Repetir mientras (j<0)
        Si (j>0)
            ComerFichaEnemiga(x, y, j) // allí se ve si la ficha comida es el rey en cuyo caso acaba la partida.
        Fin si
        MoverCaballoA(x, y)
        // Actualizar estado del tablero:
        tablero(dx, dy) = 0 // casilla libre, caballo retirado de ahí.
        tablero(x, y) = -3 // 'nuestro' caballo en dicha posición (hbiera o no una ficha del enemigo en ella).
    fin si
fin funcion
Los bits que definen la posición del movimiento serían así:
