2010-12-20 5 views
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)))) 

EDITは:明確にするために、posは、10×10の2Dアレイのセルを意味する、1と100の間の数です。

答えて

1

まず、私はあなたと私の両方が必要ではないと思います。彼らはお互いにステップで0からlenまで行く。 (未テスト)あなたを与える

(+ (/ 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))) 
      '#)))) 

はその後、1つの文に<または> = 50のための+/-例を折りたたむには、このような何かを行うことができます

にはまだいくつかの冗長性があります。しかし、それは私が今まで持っているものです。

注、私はCommon Lispのについてほとんど知らないので、私は他の誰かがより良い行うことができます確信している:)私が正しくあなたのニーズを理解なっ

+0

を、私はあなたのソリューションビットを微調整し、これで終わったします。http://paste.lisp .org/display/117875#3ありがとう! – Andy

+0

私は助けてくれると嬉しいです – Wodin

0

: あなたは方向を扱うならば-1、 - 1,10は、-10あなたは簡単にこのような何か行うことができます:#lispで罰金人々からいくつかの助けを借りて

(defun place (pos len dir) 
    (loop for i from pos to (+ pos (* len dir)) by dir do 
     (setf (aref board i) '\#))) 
+0

それはうまくいくでしょうが、扱われる配列は2次元です。 :/ – Andy

関連する問題