2016-11-30 2 views
1

Ich versuche, einen Spieler zu schaffen, der das Spiel Mastermind in LISP lösen würde. Ich habe versucht, die folgende verschachtelte Schleife in einer HilfsfunktionVerschachtelte Schleife in gemeinsamen LISP

(defparameter *counter* 0) 

;analyze the score to determine whether points need to be added to counter 
(defun analyze (last-response) 
    (if (> (first last-response) 0) 
     (setf *counter* (+ (first last-response) *counter*)))) 

;helper function for finding correct color 
(defun guessColor (length colors last-response) 
    (loop while (< *counter* 4) do 
     (loop for i from 1 to length 
      collect (first colors) 
      (setf colors (rest colors))) 
    (analyze (last-reponse)))) 

;baseline Holyguacamole player will guess all colors before trying all combinations of correct color 
(defun HolyGuacamole (board colors SCSA last-response) 
    (declare (ignore SCSA)) 
    ;(print last-response) 
    (guessColor board colors last-response) 
    (print *counter*) 
    ;(sortColor) 
) 

Die Verwendung von while-Schleife laufen soll, während die globale Variable *counter* weniger als 4. Die innere Schleife soll Farben erraten, bezogen auf die Länge der Zapfen erforderlich (variable Länge). Ich habe in den Zusammenstellungsfehler läuft

während macroexpansion von (LOOP WHILE (< COUNTER 4) ...). Benutzen ;
BREAK-ON-SIGNALS abzufangen.

Ich bin nicht vertraut mit LISP, also bin ich nicht sicher, was dieser Fehlercode bedeutet und wie man es beheben kann. Ich hatte das Gefühl, dass ich es korrekt mit den richtigen Klammern verschachtelte, aber ich bin mir nicht sicher, was daran falsch ist.

Link zu Mastermind-Umgebung.

+0

Wie groß ist das ganze Programm? Können Sie es einfügen oder zu einem eigenständigen Beispiel zusammenfassen? Ich sehe keine Definition von "Score" oder "Analyse" oder die Erklärung von "* counter *" –

+0

@GregoryNisbet der Code für das Spiel selbst ist sehr groß. Ich habe bearbeitet, um meine Hilfsfunktionen sowie die Deklaration von * counter * zu haben. Bewertung wird in letzte Antwort geändert – trungnt

+0

Ich denke '(analysieren (last-Antwort)))) sollte' (analysieren Last-Antwort))) '... Es scheint auch einige andere Fehler zu sein ... Ich habe Ich konnte diesen genauen Compilerfehler nicht mit 'clisp' oder' sbcl' reproduzieren. –

Antwort

1

Es gibt prinzipiell kein Hindernis, eine Schleife in eine andere Schleife zu verschachteln. Eine COLLECT oder COLLECTING Klausel kann jedoch nur einen einzigen Ausdruck annehmen, wie @jkiiski darauf hingewiesen hat.

Zum Beispiel kann das folgende Programm

(defun nested-loop() 
    (loop for i from 1 to 10 doing 
     (loop for j from 1 to 10 collecting 
       (print "some string") 
       (print (list 'nested-loop i j))))) 

(nested-loop) 

erzeugt einen Syntaxfehler unter CLISP.

*** - LOOP: illegal syntax near (PRINT (LIST 'NESTED-LOOP I J)) in 
     (LOOP FOR J FROM 1 TO 10 COLLECTING (PRINT "some string") 
     (PRINT (LIST 'NESTED-LOOP I J))) 

ein do oder doing Klausel Werke verwenden, wie sich die Gruppierung der mehrere Ausdrücke im Zusammenhang mit einer collecting Klausel mit progn.

(defun nested-loop() 
    (loop for i from 1 to 10 doing 
     (loop for j from 1 to 10 collecting 
       (progn 
       (print "some string") 
       (print (list 'nested-loop i j)))))) 

(nested-loop) 
+0

Danke für Ihre Antwort. Nach reiflicher Überlegung glaube ich nicht, dass die Verwendung von Nested Loop so funktionieren würde, wie ich es für dieses Spiel möchte. Ich habe meinen Code unten umgeschrieben. Es kompiliert, aber beim Testen mit der letzten Druckantwort druckt es alle NILs – trungnt

Verwandte Themen