0

1Dバージョンが完成したので、(ゆっくりと)戦艦の2Dバージョンを作成しています。ボートの長さ、ボートの位置、およびボートが向いている方向を考慮して、ボートをボードに配置するために次の関数を作成しました。ただし、機能は醜いです。とても醜い。つまり、コードの複製には多くの方法があります。このコードの重複を減らすことができるいくつかの方法を誰かが指摘できますか?

(defun place-boat (len pos dir)
  (let ((offset 0))
    (dotimes (i len)
      (if (= dir 0)
        (if (< pos 50)
          (setf (aref *ans-board*
              (+ (/ pos 10) offset)
              (mod pos 10))
            '#)
          (setf (aref *ans-board*
              (- (/ pos 10) offset)
              (mod pos 10))
            '#))
        (if (< pos 50)
          (setf (aref *ans-board*
              (/ pos 10)
              (+ (mod pos 10) offset))
            '#)
          (setf (aref *ans-board*
              (/ pos 10)
              (- (mod pos 10) offset))
            '#)))
      (incf offset))))

編集:明確にするために、posは1から100までの数字で、10x102D配列のセルを示します。

4

2 に答える 2

1

さて、初心者にとっては、iとoffsetの両方は必要ないと思います。それらは両方とも互いに歩調を合わせて0からlenまで進みます。

次に、次のようにして、<または>=50の+/-ケースを1つのステートメントにまとめることができます。

(+ (/ pos 10) (* (if (< pos 50) 1 -1) offset))

それはあなたに(テストされていない)与える:

(defun place-boat (len pos dir)
  (dotimes (offset len)
    (if (= dir 0)
      (setf (aref *ans-board*
                  (+ (/ pos 10) (* (if (< pos 50) 1 -1) offset))
                  (mod pos 10))
            '#)
      (setf (aref *ans-board*
                  (/ pos 10)
                  (+ (mod pos 10) (* (if (< pos 50) 1 -1) offset)))
            '#))))

まだある程度の冗長性があります。しかし、それは私がこれまでに得たものです。

注意してください、私はCommon Lispについてほとんど知らないので、他の誰かがもっとうまくやれると確信しています:)

于 2010-12-20T06:59:38.503 に答える
0

私があなたのニーズを正しく理解していると仮定します:あなたが方向-1、-1、10、-10を扱うならば、あなたはこのようなことを簡単に行うことができます:

(defun place (pos len dir) 
    (loop for i from pos to (+ pos (* len dir)) by dir do 
       (setf (aref board i) '\#)))
于 2010-12-21T14:26:27.423 に答える