2017-02-09 1 views
1

Ich habe eine Game-Klasse erstellt, und ich habe eine Methode namens Board, die stdin von 2 Ganzzahlen akzeptieren muss, und 1 Integer wird der Spaltenvariable zugewiesen werden, und die andere Ganzzahl wird der Zeilenvariable zugewiesen werden. So zum Beispiel der Öffnung Transcript auf pharo und die Eingabe dieses in:Wie kann ich das Argument akzeptieren, nachdem ich eine Methode im Transkript auf Pharo Smalltalk aufgerufen habe?

'Game neue Board 2 3'

sollte column = 2 und Zeile = 3 machen, aber ich kann nicht herausfinden, wie dies zu tun.

Hier ist mein Code Versuch

board 

| col rows | 

col := stdin nextNumber 

rows := stdin nextNumber 

Transcript cr; show: col asString, rows asString 

dies nicht funktioniert. Ich muss ein Brettspiel erstellen und ich kann nicht einmal herausfinden, wie man Argumente aus dem Transkript/Arbeitsbereich akzeptiert, und ich bin aufgeschmissen, dass es nächsten Montag fällig ist !!

Antwort

3

Lassen Sie mich Ihnen den idiomatischen Weg zeigen. Wenn Sie in Ihrem Spielplatz

Spiel newBoardColumns: 2 Reihen: 3

und dann DoIt und gehen, wird ein Pop-up-Debugger Sie sagen, dass die #newBoardColumns:rows: Nachricht nicht durch das Spiel verstanden wird. In Ihrem Debugger haben Sie eine Schaltfläche zum Erstellen, mit der Sie diese Methode hinzufügen können. Wenn Sie wählen Sie es auf der Klassenseite Spiel hinzuzufügen, können Sie es als etwas implementieren wie

newBoardColumns: aColumns rows: aRows 
    ^self basicNew 
    initializeColumns: aColumns rows: aRows; 
    yourself 

, dass eine neue Instanz der Klasse Spiel zurück, und initialisieren es mit den Spalten und Zeilen-Methode. Wenn Sie das speichern und die Ausführung im Debugger neu starten, wird es sich beschweren, dass es #initializeColumns:rows: nicht weiß, also müssen Sie es auf die gleiche Weise erstellen, dieses Mal auf der Instanzseite des Spiels.

initializeColumns: aColumns rows: aRows 
    columns := aColumns. 
    rows := aRows. 
    self initialize. 

wenn zu retten versuchen, stellen Sie sicher, columns und rows als Instanzvariablen hinzuzufügen. Jetzt können Sie die Ausführung erneut starten und Ihr Spiel im Inspektorfenster überprüfen.

etwas im Transcript Um zu zeigen, können Sie Ihr Spielplatz

geben könnte (Game newBoardColumns: 2 Reihen: 3) zeigen

und DoIt.Dadurch wird wieder ein Debugger angezeigt, der Ihnen mitteilt, dass #show nicht verstanden wird. Sie können das im Spiel als

show 
    Transcript cr; show: columns asString,' ', rows asString 
implementieren
2

Das Transcript ist mehr wie ein Logging-Stream, kein interaktives Terminal, aber Sie können Smalltalk-Ausdrücke darin auswerten (Sie können dies auch in einem Workspace/Playground und vielen anderen "Textfeldern" tun). Das bedeutet, dass Ihr "Eingabe"/ausgewerteter Text ein gültiger Smalltalk-Ausdruck sein muss. Game new board 2 3 ist nicht.

Vielmehr sollte das Board Methode zwei Argumente, wie unten:

boardWithColumns: cols rows: rows 
    Transcript cr; show: cols asString, rows asString 

Beachten Sie die geänderte Methode Signatur. Anders als in Ihrem Code sind Spalten und Zeilen keine temporären Variablen mehr, sondern die Argumente der Nachricht senden.

Sie können dann Game new boardWithColumns: 2 rows: 3 auswerten, damit diese Dimensionen auf das Transcript gedruckt werden.

Verwandte Themen