我有这段代码:
仓/移动:
#!/usr/bin/env ruby
require_relative '../lib/move.rb'
puts "Welcome to Tic Tac Toe!"
board = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
puts "Where would you like to go?"
index = gets.strip
input_to_index(index)
move(board, index, user_marker = "X")
display_board(board)
LIB / move.rb:
def display_board(board)
puts " #{board[0]} | #{board[1]} | #{board[2]} "
puts "-----------"
puts " #{board[3]} | #{board[4]} | #{board[5]} "
puts "-----------"
puts " #{board[6]} | #{board[7]} | #{board[8]} "
end
def input_to_index(input)
input = index.to_i - 1
end
def move(board, index, user_marker = "X")
board[index.to_i] = user_marker
end
我运行了代码,得到了以下结果:
>ruby bin/move
Welcome to Tic Tac Toe!
Where would you like to go?
>6
/home/Tolenno/ttt-5-move-rb-cb-gh-000/lib/move.rb:10:in `input_to_index': undefined local v
ariable or method `index' for main:Object (NameError)
from bin/move:10:in `<main>'
当我运行move
时,它会使用来自用户的gets
输入,而不是来自index
的新input_to_index
变量。我在某处做错了吗?
答案 0 :(得分:1)
是的,你错了。正如错误消息所示,在move.rb
第10行,input_to_index
的方法正文中,您使用的是index
,既未定义为方法,也未定义为变量。
索引是否未在'index = gets.strip'中定义?
没有。局部变量的范围永远不会超出单个文件。您不能在lib/move.rb
中使用bin/move
中定义的局部变量。
答案 1 :(得分:1)
你混淆了这些变量,但它很容易修复。
收集用户输入时,将其分配给名为input
的变量(而不是index
):
input = gets.strip
然后,将input
传递给input_to_index
并将结果分配给名为index
的新变量:
index = input_to_index(input)
此外,更改您的input_to_index
方法,以便转换给定的input
:
def input_to_index(string)
string.to_i - 1
end
我故意更改了参数名称,以表明这是一个不同的变量。
由于input
是一个临时变量而且从未再次使用,因此您也可以内联并写入:
index = input_to_index(gets.strip)
并且input_to_index
也没有做那么多。你可以考虑删除它,而不是写:
index = gets.to_i - 1
以上内容将读取用户的字符串,将其转换为整数(to_i
忽略无关字符,包括换行符),减去1并将结果分配给index
。
您的方法与Tic Tac Toe板有关。因此,您可以将它们与数组一起移动到Board
类中(作为实例变量)。变化很简单:
class Board
def initialize
@board = Array.new(9, ' ')
end
def display
puts " #{@board[0]} | #{@board[1]} | #{@board[2]} "
puts "---+---+---"
puts " #{@board[3]} | #{@board[4]} | #{@board[5]} "
puts "---+---+---"
puts " #{@board[6]} | #{@board[7]} | #{@board[8]} "
end
def move(index, user_marker = 'X')
@board[index] = user_marker
end
end
您可以使用这样的类:
puts "Welcome to Tic Tac Toe!"
board = Board.new
puts "Where would you like to go?"
index = gets.to_i - 1
board.move(index, 'x')
board.display
IMO,这比通过电路板更容易,代码看起来更清晰。