2016-05-15 16 views
1

Ich versuche herauszufinden, warum meine While-Schleife nicht beendet wird, wenn ich es will. Grundsätzlich mache ich ein einfaches Spiel, bei dem 2 Spieler Wörter spielen und in jeder Runde Punkte bekommen, wenn sie ein erlaubtes Wort spielen. Sobald ein Spieler ein Wort spielt, das mit einem bestimmten Charakter endet, verliert dieser Spieler das Spiel.Verstehen Ruby While-Loops

Die Art, wie ich es gemacht habe, ist ein Wert auf false (vor der Schleife), und verwenden Sie dann eine while-Schleife, um das Spiel so lange laufen zu lassen, bis ein Spieler ein verlierendes Wort eingibt. ohne zu Spieler 2 zu gehen (was es im Moment tut). Hier ist im Wesentlichen, was ich habe jetzt (an dieser Stelle ich gerade versucht, die grundlegende Logik in Gang zu bringen):

player1_count = 0 
player2_count = 0 

continue = true 

while continue 
## get input 
    if player1_input[-1] == losing_char 
    continue = false 
    else 
    player1_count += 1 
    end 
##do the same for player 2 
## get input 
    if player2_input[-1] == losing_char 
    continue = false 
    else 
    player2_count += 1 
    end 
end 

Das Problem, das ich habe, ist, dass ich erwartet, dass, wenn weiterhin wurde auf false, die Schleife würde sofort beendet werden, während sie stattdessen bis zum Ende des aktuellen Durchlaufs durch die Schleife weiterläuft und Spieler 2 ebenfalls eingibt (wenn Spieler 1 verloren hat), was ich nicht will. Ich vermute, dass ich entweder eine falsche Vorstellung davon hatte, wie Loops in Ruby funktionieren, oder ob ich irgendwo den Loop falsch geschrieben habe.

Gibt es eine Möglichkeit, die While-Schleife zu schreiben, wo es weitergehen wird, bis meine Variable auf false gesetzt ist, und habe es sofort verlassen, wie ich hoffe?

Antwort

2

In Ruby (und allen Sprachen im C-Stil) wird die while-Schleife nur am Anfang einer Iteration überprüft. Dies ist beabsichtigt, oder andernfalls müsste die Bedingung nach dem Ausführen jeder Anweisung überprüft werden.

In diesem Fall sollten Sie statt einer Continue-Variablen break aufrufen, wodurch die (innerste) Schleife sofort beendet wird. Also für Ihren Code

player1_count = 0 
player2_count = 0 

while true 
## get input 
    if player1_input[-1] == losing_char 
    break 
    else 
    player1_count += 1 
    end 
##do the same for player 2 
## get input 
    if player2_input[-1] == losing_char 
    break 
    else 
    player2_count += 1 
    end 
end 
+0

Sie könnten die mehr idiomatische 'loop do' anstelle von' wahr 'verwenden. Und ich würde "else" entfernen und einen Modifikator verwenden - wenn stattdessen, d. H. 'Break if player1_input [-1] == loose_char'. – Stefan

+0

In der Tat würden diese beide idiomatischer sein, aber ich wollte es einfach halten, da OP neu zu Rubin erscheint –