2016-05-15 4 views
1

Я пытаюсь понять, почему мой цикл while не выходит, когда я этого хочу. В основном я делаю простую игру, в которой 2 игрока играют слова и получают очки в каждом раунде, если они играют разрешенное слово. Когда один игрок играет слово, которое заканчивается определенным персонажем, этот игрок теряет игру.Понимание Ruby While loops

Способ, которым я это сделал, задает значение false (перед циклом), а затем использует цикл while для продолжения игры до тех пор, пока игрок не войдет в проигрывающее слово, и в этот момент цикл должен немедленно выйти, без участия игрока 2 (который в данный момент он делает). Вот, по сути, что у меня есть сейчас (в данный момент я просто пытаюсь получить основную логику Собирается):

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 

Вопрос, который я имею, что я ожидал, что когда продолжать был установлен false, цикл немедленно прекратится, а вместо этого он продолжит до конца текущего прогона в цикле, получив вход игрока 2 (если проигрыватель 1 проиграл), чего я не хочу. Я предполагаю, что либо у меня было неправильное представление о том, как петли работают в Ruby, либо я испортил где-то пишущий цикл/использовал его неправильно.

Есть ли способ написать цикл while, в котором он будет продолжаться, до тех пор, пока переменная продолжит. Значение переменной равно false, и пусть он сразу же уйдет, как я надеюсь?

ответ

2

В Ruby (и всех языках C-стиля) условие цикла while проверяется только в начале итерации. Это по дизайну, иначе он должен будет проверить условие после запуска каждого оператора.

В этом случае вместо использования переменной continue вы должны позвонить break, который немедленно покинет цикл (самый внутренний). Итак, для вашего кода

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

Вы можете использовать более идиоматический 'цикл do' вместо' while true'. И я бы удалил 'else' и использовал модификатор - если вместо этого, то есть« break if player1_input [-1] == lose_char'. – Stefan

+0

Действительно, это было бы более идиоматично, но я хотел сохранить его простым, поскольку OP кажется новым для рубинов –