2016-10-19 2 views
0

Я пытаюсь сделать игру с tic tac toe. У меня есть хорошая идея, куда идти, и я знаю, в чем проблема, но я не знаю, как это исправить. Когда я создаю функцию, я устанавливаю переменные для этой функции. i = 0, row1 = [], но когда я повторяю через функции, каждый раз, когда функция снова вызывается, строка 1 возвращается в пустую из-за начальной строки1 = [], а счетчик, который я хочу использовать, i = 0, возвращается к 0 каждый раз, потому что начало функции я устанавливаю мои переменные. Я думаю, что решение может состоять в том, чтобы сделать переменную global и установить ее из функции, но я не уверен, как это сделать. Но если у кого-то есть какие-то предложения, мы будем очень благодарны. Вот код проблемы.Ruby пытается сохранить элементы массива при повторении через функции

def row1(player) 
    row1 = [] 
    row1[player - 1] = "X" 

    puts "#{row1}" 

end 

def choosespot_x 

    puts "X -- Choose a spot" 
    move = gets.chomp.to_i 
    if move <= 3 
     row1(move) 
    end 

choosespot_x 

end 
+0

Не использовать рекурсию здесь, петля на самом деле то, что вы хотите: 'петли делать ... end' – tadman

+1

Я думаю, что это будет лучше пояснить * почему * вы рекомендуете против Tail Recursion, потому что Tail Recursion на самом деле является совершенно естественным интуитивным способом петлирования. (О чем свидетельствует тот факт, что кто-то, кто, похоже, является новичком в программировании, добился для него самого легкого и наиболее очевидного решения). Проблема в том, что Ruby не имеет правильных хвостовых вызовов (на самом деле правильная регенерация хвоста будет достаточно в этом случае), и, таким образом, Tail Recursion потенциально ударит стек. (Вероятно, не в этом случае, хотя, в конце концов, редко будет более 9 «итераций» в «петле».) –

ответ

2

Глобальные переменные предваряются $ и, как правило, плохая идея в Ruby.

Переменные экземпляра, префикс @, также могут делать то, что вы хотите; на верхнем уровне они ведут себя почти так же, как и глобальные, но в классах или модулях они прекрасно изолированы.

Таким образом, лучший способ - создать класс; создайте свою переменную (скажем, @row1) в методе initialize, а затем вы сможете просто использовать ее в методе choosespot_x.

EDIT: Как я хотел бы сделать это ...

module TicTacToe 
    class Board 
    def initialize 
     @board = Array.new(9) 
    end 

    def [](y, x) 
     @board[x + y * 3 - 4] 
    end 

    def []=(y, x, value) 
     @board[x + y * 3 - 4] = value 
    end 
    end 
end 

board = TicTacToe::Board.new 
board[1, 3] = :white 
board[3, 2] = :black 
board[1, 3] 
# => :white 
board[1, 1] 
# => nil 
+0

Я действительно недавно познакомился с классами. Все еще пытаются их изучить. Не могли бы вы привести мне пример того, как я буду использовать это в классе? class Board/attr_accessor: row1/def initialize/@ row1 = row1 – Mike

+0

Не означает, что ударить пост в комментарии выше. Но что-то вроде этой последней строки выше? Но как бы включить его в мой код выше и как это поможет сохранить данные в массиве? – Mike