我试图生成两个包含随机内容的数组。代码如下:
[@board1, @board2].each do |board|
15.times { board.place_random_ship }
end
在Board
课程中,我有以下两种方法:
def place_random_ship
self.full? ? (raise puts "error") : self.populate_grid
end
def populate_grid
position = [rand(@grid.length), rand(@grid.length)]
self.empty?(position) ? self[position] = :s : self.populate_grid
end
我确保我通过的电路板不同:
#<Board:0x007fc8e58641f0>
#<Board:0x007fc8e58641a0>
每次运行我的代码时,内容都会改变,但两个数组总是相同的,我希望它们不同。我尝试将srand
放在populate_grid
方法的开头,但那并没有做任何事情。如何让我的阵列拥有不同的内容?
类定义和一些可能相关的方法如下:
class Board
attr_accessor :grid, :default_grid
@default_grid = Array.new(10) { Array.new(10) }
def initialize(grid = self.class.default_grid)
@grid = grid
end
def self.default_grid
Board.new(@default_grid)
@default_grid
end
def [](position)
@grid[position[1]][position[0]]
end
def []=(position, arg)
@grid[position[1]][position[0]] = arg
end
一些类方法来自于我必须通过spec文件传递的较旧的,愚蠢的版本。我加载这些文件并将这个ruby代码运行到&#34; play&#34;游戏:
players = { player1: ComputerPlayer.new("rafi"), player2: ComputerPlayer.new("other") }
boards = { board1: Board.new, board2: Board.new }
game = BattleshipGame.new(players, boards)
game.play
这就是网格的样子(空10x10):
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
这是我运行15次代码后网格的样子:
[:s, :s, nil, :s, nil, :s, nil, nil, nil, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, :s, nil]
[nil, nil, :s, nil, nil, nil, :s, :s, nil, nil]
[nil, nil, nil, nil, nil, nil, :s, nil, nil, nil]
[:s, nil, :s, nil, nil, :s, nil, :s, :s, nil]
[nil, nil, :s, nil, nil, nil, nil, :s, nil, :s]
[:s, nil, nil, nil, nil, :s, :s, nil, :s, nil]
[nil, nil, nil, nil, nil, nil, nil, nil, nil, :s]
[nil, :s, nil, nil, :s, nil, :s, :s, nil, nil]
[nil, nil, :s, nil, :s, :s, nil, nil, :s, nil]
问题是,自代码使用rand
以来,两个董事会应该有不同的出货地点,不知何故最终会有完全相同的船位。
答案 0 :(得分:2)
这是事情开始出错的地方:
@default_grid = Array.new(10) { Array.new(10) }
def initialize(grid = self.class.default_grid)
问题是您重新使用 @default_grid
对象,因此使用默认值实例化的所有Board实例将共享相同的Array
。
您应该修改default_grid
方法,以便每次都生成新的Array
,而不是使用类变量:
def self.default_grid
Array.new(10) { Array.new(10) }
end
你可以摆脱类变量。