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配列のセルを示します。