2010-12-20 9 views
0

Ich arbeite (langsam) eine 2D Version von Battleship aus, jetzt wo meine 1D Version fertig ist. Ich habe die folgende Funktion geschrieben, um ein Boot auf dem Brett zu platzieren, vorausgesetzt, die Länge des Bootes, die Position des Bootes und die Richtung, in die das Boot zeigt. Die Funktion ist jedoch hässlich. Sehr hässlich. Damit meine ich, dass die Code-Duplikation sehr viel weiter geht. Kann jemand auf einige Möglichkeiten hinweisen, wie ich die Duplizierung in diesem Code reduzieren könnte?Boote im Schlachtschiff platzieren (Codevervielfältigung wird entfernt)

(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: Zur Verdeutlichung ist pos eine Zahl zwischen 1 und 100, einer Zelle in einer 2D-Array 10x10 bedeutet.

Antwort

1

Nun, für den Anfang, ich glaube nicht, dass Sie beide ich und Offset benötigen. Sie gehen beide von 0 bis zu len im Gleichschritt.

Dann könnten Sie so etwas wie dies tun, um die +/- Fälle für < oder> = 50 in einer Erklärung zum Einsturz:

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

, die Ihnen (ungetestet):

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

, die immer noch einige Redundanz hat. Aber das ist es, was ich bisher habe.

Hinweis, ich weiß sehr wenig über Common Lisp, so dass ich bin sicher, dass jemand anderes viel besser machen könnte :)

+0

mit etwas Hilfe von den netten Leuten in #lisp, ich Ihre Lösung ein bisschen gezwickt und damit endete: http: //paste.lisp .org/display/117875 # 3 Danke! – Andy

+0

Froh, dass ich helfen könnte :) – Wodin

0

Vermeintliche ich Ihre Bedürfnisse richtig verstehen: wenn Sie mit den Richtungen -1 beschäftigen würde - 1,10, -10 Sie leicht etwas tun könnte:

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

Das würde funktionieren, aber das Array, das behandelt wird, ist 2-dimensional. : / – Andy