2010-12-20 6 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는 : 설명을 위해, 10 × pos는 2 차원 어레이의 셀을 의미하는 1과 100 사이의 값이다.

답변

1

글쎄, 우선, 나는 당신에게 i와 오프셋이 둘 다 필요하다고 생각하지 않는다. 그것들은 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))) 
      '#)))) 

은 그럼 당신은 하나 개의 문장으로 < 또는> = 50의 +/- 사건을 축소하려면 다음과 같이 뭔가를 할 수

에는 여전히 중복성이 있습니다. 그러나 그것은 내가 지금까지 가지고있는 것이다.

주, 나는 커먼 리스프에 대해 거의 알고, 그래서 다른 사람이

+0

#lisp에있는 훌륭한 사람들의 도움을 받아 약간 솔루션을 수정하여 다음과 같이 끝 냈습니다. http : //paste.lisp .org/display/117875 # 3 감사합니다! – Andy

+0

다행스럽게도 도움이 될 것입니다. – Wodin

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) '\#))) 
+0

처리 할 수 ​​있지만 배열은 2 차원입니다. : / – Andy