;; ------------------- BOARD 10X10 ---------------------------------
(defun board ()
  "T in position x=0 and y=0"
  '(
    (T 25 54 89 21 8 36 14 41 96) 
    (78 47 56 23 5 NIL 13 12 26 60) 
    (0 27 17 83 34 93 74 52 45 80) 
    (69 9 77 95 55 39 91 73 57 30) 
    (24 15 22 86 1 11 68 79 76 72) 
    (81 48 32 2 64 16 50 37 29 71) 
    (99 51 6 18 53 28 7 63 10 88) 
    (59 42 46 85 90 75 87 43 20 31) 
    (3 61 58 44 65 82 19 4 35 62) 
    (33 70 84 40 66 38 92 67 98 97)
    )
)

(defun print-board (board)
   (format T "~%")
   (mapcar (lambda (x) (format T " ~A ~%" x)) board)
   (format nil ""))

;; ------------------- MOVEMENTS -----------------------------------
(defun UP-LEFT (x y board)
  "Function that receives 2 indexes and board, validate movement and move piece up and left"
    (cond
        ((equal (validate-movements (- x 1) (- y 2) board) 0) 
         (move-piece x y -1 -2 board))
        (T nil)))

(defun UP-RIGHT (x y board)
  "receive 2 indexes and board, validate movement and move piece up and right"
    (cond
        ((equal (validate-movements (+ x 1) (- y 2) board) 0) 
         (move-piece x y 1 -2 board))
        (T nil)))

(defun LEFT-DOWN (x y board)
   "Function that receives 2 indexes and board, validate movement and move piece left and down"
    (cond
        ((equal (validate-movements (- x 2) (+ y 1) board) 0)
         (move-piece x y -2 1 board))
        (T nil)))

(defun LEFT-UP (x y board)
   "Function that receives 2 indexes and board, validate movement and move piece left and up"
    (cond
        ((equal (validate-movements (- x 2) (- y 1) board) 0) 
         (move-piece x y -2 -1 board))
        (T nil)))
       
(defun DOWN-RIGHT (x y board)
   "Function that receives 2 indexes and board, validate movement and move piece down and right"
    (cond
        ((equal (validate-movements (+ x 1) (+ y 2) board) 0)
         (move-piece x y 1 2 board))
        (T nil)))
;; ------------------------- FUNCTIONS THAT VALIDATE MOVEMENTS AND MOVE PIECE
(defun move-piece (x y dx dy board)
 "Function that receives two indexes and board to move the pxece on the board"
  (mapcar 
    (lambda (L) 
      (cond
          ((atom L) L)
          ((and 
               (equal (nth 0 L) x) 
               (equal (nth 1 L) y)) 
               (list (+ (nth 0 L) dx) (+ (nth 1 L) dy) (nth 2 L) 
                     (nth 3 L) (nth 4 L) (nth 5 L) (nth 6 L) 
                     (nth 7 L) (nth 8 L) (nth 9 L)))
    (T L))) board))

(defun validate-movements (x y board)   
 "Function that receives two indexes and board to validate movement"
  (cond 
      ((and 
           (>= x 0) 
           (>= y 0) 
           (<= x (nth 9 board)) 
           (<= y (nth 9 board)) 
           (= (apply '+ (mapcar (lambda (L) 
                                       (cond 
                                           ((atom L) 0)
                                           ((or (not(equal (nth 0 L ) x)) (not (equal (nth 1 L) y))) 0) 
                                           (T 1))) board)) 0)) 0)
    (T nil )))
    
;; ---------------------------- TEST MOVEMENTS ------------------
    
;;print board
(print-board (board))
    
    ;; test movements
(print-board (DOWN-RIGHT 0 0 (board)))

    