即使已满足条件,仍卡在while循环中

时间:2018-07-11 06:47:19

标签: ruby

我正在编写此脚本来构建井字游戏。这仅仅是开始(尚未转弯)。如果先前的输入无效,我想让用户再次输入。

def display_board(board)
    first_row = " #{board[0]} | #{board[1]} | #{board[2]} "
    second_row = " #{board[3]} | #{board[4]} | #{board[5]} "
    third_row = " #{board[6]} | #{board[7]} | #{board[8]} "
    row_divider = "-----------"
    puts first_row
    puts row_divider
    puts second_row
    puts row_divider
    puts third_row
end  

def valid_move?(board,index)
    if (index >= 0) && (index <= board.length - 1) && (position_taken?(board,index) != FALSE)
        return TRUE
    else
        return FALSE
    end
end

def input_to_index(user_input)
    index = user_input.to_i - 1
    return index
end

def move(board, index, character = "X")
    board[index] = character
end

def position_taken?(board,index)
    if (board[index] == "X") || (board[index]=="O")
      return FALSE
    end
end

def turn(board)
    puts "Please enter 1-9:"
    user_input = gets.strip
    index = input_to_index(user_input)
    while valid_move?(board,index) == FALSE
        puts "invalid"
        turn(board)
    end
    move(board, index, character = "X")
    display_board(board)
end

我陷入了while循环中。如果我输入了一个无效的输入,然后输入了一个有效的输入,则它将通过while循环运行,而不是结束程序。应该是真的如果我使用if语句而不是while循环,则此问题已解决,但我想学习更好地使用while循环。

1 个答案:

答案 0 :(得分:0)

因为您从“ turn”(外部)调用“ turn”(内部),然后调用的内部“ turn”有效,但外部的boardindex “转弯”没有变化。

尝试一下:

def turn(board)
    loop do
        puts "Please enter 1-9:"
        user_input = gets.strip
        index = input_to_index(user_input)
        if valid_move?(board,index) == TRUE
            break
        end
        puts "invalid"
    end
    move(board, index, character = "X")
    display_board(board)
end