我有一个任务,使用Ruby类构建井字游戏。
到目前为止,我是编程新手和自学成才,但被一个程序录取,需要完善一些概念才能领先于游戏。
我理解大多数概念,并让大多数规范文件适用于我的游戏,但我确实需要多次引用解决方案代码来帮助解决最后一点问题。
-
在创建板类时,创建了两个使用空数组定义的方法。我以前从未见过这种情况,想知道发生了什么。当我进入 IDE 并创建一个名为 [](空数组)和两个参数的方法时,我会收到一个错误(语法错误,预期输入结束)试图运行它。看来这一定是你只能在开课时做的事情?
我假设这些是getter和setter方法?
def [](pos) row, col = pos grid[row][col] end def []=(pos, value) row, col = pos grid[row][col] = value end
-
在上面的代码中,grid 是板类的实例变量。为什么您可以在方法中使用实例变量而不在其前面放置"@"符号 - (@grid,而不是网格)。这有点令人困惑,因为对于普通方法,如果在方法外部定义变量,则该方法无法识别它。为什么课堂内部不同?
#example x = 6 def add(b) x + b end => will return an error - local variable x is undefined.
下面是全板课程,以防更好地理解和回答问题。谢谢!
class Board
attr_reader :grid, :marks
def initialize(grid = [])
if grid.empty?
@grid = Array.new(3) { Array.new(3) }
else
@grid = grid
end
@marks = [:X, :O]
end
def place_mark(pos, mark)
grid[pos[0]][pos[1]] = mark
end
def [](pos)
row, col = pos
grid[row][col]
end
def []=(pos, value)
row, col = pos
grid[row][col] = value
end
def empty?(pos)
grid[pos[0]][pos[1]].nil? ? true : false
end
def winner
(grid + grid.transpose + diagnol).each do |win|
return :X if win == [:X,:X,:X]
return :O if win == [:O,:O,:O]
end
nil
end
def diagnol
diag1 = [[0, 0], [1, 1], [2, 2]]
diag2 = [[0, 2], [1, 1], [2, 0]]
[diag1, diag2].map do |diag|
diag.map {|row, col| grid[row][col]}
end
end
def over?
return true if grid.flatten.compact.size == 9 || winner
return false if grid.flatten.compact.size == 0 || winner.nil?
end
end
- 是的,这是
Board
上数组对象的获取器和设置器。(FWIW 我认为这样做是糟糕的 Ruby 风格,所以我将来不会在您自己的代码中使用它。我认为这就是为什么您的 IDE 在此方法上也遇到问题的原因。 -
您可以使用不带 @ 的
grid
,因为类顶部有attr_reader
声明。这将为类上公共的实例变量创建一个只读变量。它有效地创建了一个名为:def grid @grid end
您将无法执行
grid = []
,因为attr_reader
仅创建只读方法。要创建读写访问器,请使用attr_accessor
。请记住,使用attr_
方法会使有问题的变量在类上公开,因此如果您想在内部保留某些内容,则不会使用它们。
有点晚了,但我也在研究这个,并在网上找到了这个。显然,它是具有网格状实例变量的类的语法糖。
句法糖
这些都是获取左下角方块的等效方法:
board.grid[2][0] board.[](2, 0) board[2, 0] # syntactic sugar
语法糖允许我们使用我们的 方括号内而不是方括号内的参数 方括号后面的括号。
同样,以下是设置右上角的等效方法 广场:
board.grid[0][2] = :x board.[]=(0, 2, :x) board[0, 2] = :x # syntactic sugar
当然,如果我们费心设置特殊的 [] 和 []= 方法, 我们将使用句法糖的方式。:)
更多信息可以从此链接中找到:
https://github.com/emgreen33/Practice/blob/master/W2D4/bracket-methods.md