1

チェスのゲームでポーンの有効な動きを計算する関数に取り組んでいます。機能white-pawn-moveは動作します。どちらかのプレイヤーのポーン ( ) に対して一般化しようとするとpawn-move、不正な関数呼び出しに遭遇します。私はreplでファンコールをテストしましたが、それが問題だとは思いません。

私は何を間違っていますか?

http://pastebin.com/fEiQTwi5

(defun white-pawn-move (file rank)       
  (let ((movelist '()))
    (if (and (within-boardp file (+ rank 1))
             (eql #\s (aref *board* (+ rank 1) file)))
        (push (cons file (+ rank 1)) movelist))
    (if (= rank 1) 
        (push (cons file (+ rank 2)) movelist))
    (if (and (within-boardp (- file 1) (+ rank 1))
             (belongs-to-opponent (aref *board*  (+ rank 1) (- file 1))))
        (push (cons (- file 1) (+ rank 1)) movelist))
    (if (and (within-boardp (+ file 1) (+ rank 1))
             (belongs-to-opponent (aref *board* (+ rank 1) (+ file 1))))
        (push (cons (+ file 1) (+ rank 1)) movelist))
    movelist))      

;refactor:
;file / rank numeric      
(defun pawn-move (direction)
  (let ((startrank (if (eql direction #'+)
                       1
                       6)))
    (lambda (file rank)
      (let ((movelist '()))
        (if (and (within-boardp file (funcall direction rank 1))
                 (eql #\s (aref *board* (funcall direction rank 1) file)))
            (push (cons file (funcall direction rank 1)) movelist))
        (if (= rank startrank) 
            (push (cons file (funcall direction rank 2)) movelist))
        (if (and (within-boardp (- file 1) (funcall direction rank 1))
                 (belongs-to-opponent (aref *board* 
                                            (funcall direction rank 1)
                                            (- file 1))))
            (push (cons (- file 1) (funcall direction rank 1)) movelist))
        (if (and (within-boardp (+ file 1) (funcall direction rank 1))
                 (belongs-to-opponent (aref *board*
                                            (funcall direction rank 1)
                                            (+ file 1))))
            (push (cons (+ file 1) (funcall direction rank 1)) movelist))
        movelist))))
;desired usage
(setf (gethash #\P *move-table*) (pawn-move #'+))    
(setf (gethash #\p *move-table*) (pawn-move #'-))
4

2 に答える 2

0

発生したエラーを表示できますか?

Emacs Lisp (文字表現を Emacs-Lisp に変更) を使用してコードを試したところ、sexp(pawn-move #'+)(pawn-move #'-). 彼らはあなたにエラーを引き起こしたのですか?(pawn-move #'+)たとえば、次のように取得します。

     (ラムダ (ファイルランク)
       (let ((movelist 'nil))
         (if (and (within-boardp
                   ファイル
                   (ファンコールディレクションランク1))
                  (115等量
                       (参照*ボード*
                             (ファンコール演出ランク1)
                             ファイル)))
             (push (cons ファイル (funcall 方向ランク 1))
                   ムーブリスト))
         (if (= ランク startrank)
             (push (cons ファイル (funcall 方向ランク 2))
                   ムーブリスト))
         (if (and (within-boardp
                   (- ファイル 1)
                   (ファンコールディレクションランク1))
                  (相手に属します
                   (aref *board* (funcall ディレクション ランク 1)
                         (- ファイル 1))))
             (push (cons (- file 1) (funcall 方向ランク 1))
                   ムーブリスト))
         (if (and (within-boardp
                   (+ファイル1)
                   (ファンコールディレクションランク1))
                  (相手に属します
                   (参照*ボード*
                         (ファンコール演出ランク1)
                         (+ ファイル 1))))
             (push (cons (+ file 1) (funcall 方向ランク 1))
                   ムーブリスト))
         ムーブリスト))


要するに、あなたが見ているものについてもう少し詳しく教えてください。

于 2013-08-20T04:29:04.473 に答える