在Lisp中实现车队移动和可能移动的最佳方法

问题描述 投票:0回答:1

我有木板[8,8],我正在尝试根据棋盘上车子的上,下,左,右运动来实现水平运动和垂直运动,但是我在如何用一块要移动的正方形数将块移动到正方形。

(defun board ()
 '((64 35 74 26 21 57 12 28) 
   (43 15 47 53 24 56 42 29) 
   (51 41 71 31 17 45 55 30) 
   (67 66 22 T 54 75 32 38) 
   (13 11 16 23 25 27 33 20) 
   (34 36 37 44 46 52 61 48) 
   (10 49 59 69 68 70 50 40) 
   (62 63 65 72 73 76 77 58)))

The Rook在水平和垂直方向上移动任意数量的正方形,向前或向后移动。在图中,“白嘴鸦”可以移动到任何突出显示的正方形。

enter image description here

检查坐标是否有效的功能

(defun position-valid (x y)
  (and (>= x 0) (>= y 0) (< x 8) (< y 8)))

根据坐标(x,y)移动塔架的功能

(defun move-piece (x y dx dy board)
  (let ((new-board (copy-tree board))
        (new-x (+ x dx))
        (new-y (+ y dy))
        (piece (nth x (nth y board))))
    (setf (nth x (nth y new-board)) nil
          (nth new-x (nth new-y new-board)) piece)
    new-board))

向下移动片段的功能

 (defun DOWN (x y board) 
   (cond
    ((equal (position-valid (+ x 1) (+ y 0)) 'T)
     (move-piece x y 1 0 board))
    (T NIL)))

将作品向上移动的功能

(defun UP (x y board) 
  (cond
    ((equal (position-valid (- x 1) (+ y 0)) 'T)
     (move-piece x y -1 0 board))
    (T NIL)))

将作品向左移动的功能

(defun LEFT (x y board) 
  (cond
    ((equal (position-valid (+ x 0) (- y 1)) 'T)
     (move-piece x y 0 -1 board))
    (T NIL)))

将作品向右移动的功能

(defun RIGHT (x y board) 
  (cond
    ((equal (position-valid (+ x 0) (+ y 1)) 'T)
     (move-piece x y 0 1 board))
   (T NIL)))

现在的目标是根据上述运动实现垂直和水平运动,以使棋子运动。在这种情况下,我认为我们仍然需要根据运动的类型以及执行多少次运动来实现可能的运动。方块移动

我实现了用于水平和垂直移动的操作员列表,但不起作用

水平移动塔的功能

(defun HORIZONTAL (x y n mov board) ;;n is number of square to move
  (cond
    ((and (equal (position-valid (+ x 0) (- y 1)) 'T) ;;left
          (equal (position-valid (+ x 0) (+ y 1)) 'T));;right     
          (cond
               ((equal mov 'LEFT)  (LEFT x y board))
               ((equal mov 'RIGHT) (RIGTH x y board))
               (T (HORIZONTAL x y (1- n) mov board))))
   (T NIL)))

使塔架沿垂直方向移动的功能,

(defun VERTICAL(x y n mov board) ;;n is number of square to move
  (cond
    ((and (equal (position-valid (- x 1) (+ y 0)) 'T) ;;up
          (equal (position-valid (+ x 1) (+ y 0)) 'T));;down
          (cond
               ((equal mov 'DOWN)  (DOWN x y board))     
               ((equal mov 'UP)    (UP x y board))
               (T (VERTICAL x y (1- n) mov board))))
   (T NIL)))

以及如何根据移动类型获得塔在板上的可能移动

安妮的建议?

lisp common-lisp
1个回答
0
投票

在我看来,您正在构建太多不必要的功能。我要做的是基于移动件具有MOVE功能,该功能可同时进行水平和垂直位移。由于您具有参数mov(可以是UP,DOWN,LEFT或RIGHT),因此水平和垂直运动已经隐含,因此无需为每个方向分别设置功能。所以这就是我要做的:

© www.soinside.com 2019 - 2024. All rights reserved.