2015-07-16 6 views
14

Ich schreibe ein Hangman-Spiel in Ruby und ich wollte eine case-Anweisung verwenden, um zu bestimmen, welcher Körperteil entsprechend einer Anzahl von falschen Schätzungen platziert werden soll. Ich habe dieses Spiel mit einer Board-Klasse gemacht, die ich für andere Spiele wie Schach und Connect-4 verwende, weil ich eine Methode habe, die die Board-Klasse serialisiert, sodass ich das Spiel ohne zusätzlichen Code speichern und laden kann. Um das Spiel zu speichern, brauchte ich einen Weg, um die Anzahl der falschen Schätzungen für den Henker zu bestimmen, ohne zusätzliche Variablen in die Board-Klasse aufzunehmen. Um dies zu lösen, habe ich eine Instanzvariable in der Board-Klasse namens history verwendet, die verwendet werden kann, um Züge aus dem Spiel in den Boards-Verlauf zu schieben. Wenn das Board serialisiert wird, wird auch der Verlauf gespeichert, der vom Spiel gelesen und verwendet werden kann, um falsche Annahmen zu bestimmen.Fällt die Case-Anweisung von Ruby durch?

Im Hangman-Spiel habe ich eine Methode namens read history (die ich für alle Spiele benutze, da sie das oben beschriebene Serialisierungsproblem löst). Die read_history-Methode ist dafür verantwortlich, die vergangenen Annahmen zu lesen, sie anzuzeigen und die Anzahl der falschen Annahmen zu bestimmen. Diese Nummer wird dann an eine Hang-Methode übergeben, die festlegt, welche Körperteile des Hangman hinzugefügt werden sollen.

def hang(incorrect) 
    case incorrect 
    when 0 
     @hangman = [" ", " ", " "] 
     break 
    when 7 
     @hangman[2][2] = '\\' 
    when 6 
     @hangman[2][0] = '/' 
    when 5 
     @hangman[2][1] = '*' 
    when 4 
     @hangman[1][2] = '\\' 
    when 3 
     @hangman[1][0] = '/' 
    when 2 
     @hangman[1][1] = '|' 
    when 1 
     @hangman[0][1] = 'o' 
    end 
end 

Wenn ich das in Java, und ein Wert von 5 wurde das obige Verfahren bestanden schreibe, würde es die Erklärung lesen, bis es „wenn 5“ oder in Java-Bedingungen Hit „5 Falles:“. Es würde bemerken, dass es keine Unterbrechung in der Anweisung gibt, und wird die Liste, die den Code ausführt, in "Fall 4:" nach unten bewegen und wiederholen, bis eine Pause gefunden wird. Wenn 0 übergeben würde, würde es jedoch den Code ausführen, den Break sehen und würde keine anderen Anweisungen ausführen.

Ich frage mich, ob Ruby in der Lage ist, Fallanweisungen so zu verwenden, wie Java es tut, wenn sie zur nächsten Anweisung durchgehen. Für mein spezielles Problem ist mir bewusst, dass ich eine 0.upto (inkorrekte) Schleife verwenden und die Fälle auf diese Weise ausführen kann, aber ich würde gern die Ähnlichkeiten und Unterschiede in der in ruby ​​verwendeten Fallanweisung im Gegensatz zum switch-case kennen verwendet in Java

+0

Der Begriff, den Sie suchen, ist "durchfallen", wie in "Fall fällt durch den nächsten Fall". – Kenster

Antwort

8

Es fällt nicht durch.

Ruby just doesn't have the same behavior as Java for this type of statement.

Wenn Sie den Fall durch Verhalten simulieren möchten, können Sie etwas tun:

def hang(incorrect) 
    @hangman = [" ", " ", " "] 
    @hangman[2][2] = '\\' if incorrect > 6 
    @hangman[2][0] = '/' if incorrect > 5 
    @hangman[2][1] = '*' if incorrect > 4 
    @hangman[1][2] = '\\' if incorrect > 3 
    @hangman[1][0] = '/' if incorrect > 2 
    @hangman[1][1] = '|' if incorrect > 1 
    @hangman[0][1] = 'o' if incorrect > 0 

    @hangman 
    end 
+0

Danke, das war genau das, was ich gesucht habe –

+0

Die Ruby-Docs-Informationen, die Sie verlinkt haben, bestätigen/bestätigen nicht direkt, wenn die Case-Anweisung von Ruby durchfällt. – Magne

30

Nein, Rubys case-Anweisung nicht wie Java fällt durch. Nur ein Abschnitt wird tatsächlich ausgeführt (oder der Else). Sie können jedoch mehrere Werte in einer einzelnen Übereinstimmung auflisten, z. wie this site shows.

print "Enter your grade: " 
grade = gets.chomp 
case grade 
when "A", "B" 
    puts 'You pretty smart!' 
when "C", "D" 
    puts 'You pretty dumb!!' 
else 
    puts "You can't even use a computer!" 
end 

Es ist funktional gleichbedeutend mit einem riesigen if-sonst. Code Academy's page on it empfiehlt, Kommas zu verwenden, um mehrere Optionen anzubieten. Sie können jedoch immer noch nicht mehr als einen Logikzweig ausführen.

+6

Nicht sicher, warum * das * nicht die akzeptierte Antwort ist. : -/ – jeffdill2

+0

Dies ist nicht die akzeptierte Antwort, weil es für den Anwendungsfall des OP nicht gut funktioniert. Es ist immer noch eine gute Information – richbai90

Verwandte Themen