Ruby 扫雷舰红宝石探测器阵列索引超出
所以我用ruby做了一个扫雷游戏,很好玩。我已经完成了大部分工作,但是我的探测器对象在处理电路板边缘时遇到了问题。board对象由一个size int和一个由row..col组成的3d数组组成。我的detector对象必须忽略我设置了一个除非条件来处理的超出范围的索引。问题是,当它检查周围是否有地雷时,它可以计算出顶部或底部阵列中的地雷总数。如果它在板的底部,它将从顶部开始计数,等等。另外,右边的一些地雷似乎没有探测到任何东西。中间板排列的矿井似乎运转良好。我一直在尝试许多不同的配置,我对想法感到茫然。以下是电路板和探测器对象:Ruby 扫雷舰红宝石探测器阵列索引超出,ruby,arrays,indexing,minesweeper,Ruby,Arrays,Indexing,Minesweeper,所以我用ruby做了一个扫雷游戏,很好玩。我已经完成了大部分工作,但是我的探测器对象在处理电路板边缘时遇到了问题。board对象由一个size int和一个由row..col组成的3d数组组成。我的detector对象必须忽略我设置了一个除非条件来处理的超出范围的索引。问题是,当它检查周围是否有地雷时,它可以计算出顶部或底部阵列中的地雷总数。如果它在板的底部,它将从顶部开始计数,等等。另外,右边的一些地雷似乎没有探测到任何东西。中间板排列的矿井似乎运转良好。我一直在尝试许多不同的配置,我对想法感
class Board
attr_accessor :size, :board
def initialize(size = gets.chomp.to_i)
@size = size
@board = (1..@size).map { |x| ["L"] * @size }
end
def print_board
@board.map { |row| puts row.join }
end
end
class Detector
attr_accessor :proxi, :row, :col, :value
def initialize(proxi)
@proxi = proxi
@row = 0
@col = 0
@value = 0
end
def mine?
if @proxi.board[@row - 1][@col - 1] == "*"
true
else
false
end
end
def detect
unless (@row < 0 || @row > @proxi.size - 1) || (@col < 0 || @col > @proxi.size - 1)
@value += 1 if @proxi.board[@row - 2][@col - 1] == "*"
@value += 1 if @proxi.board[@row - 2][@col - 2] == "*"
@value += 1 if @proxi.board[@row - 1][@col - 2] == "*"
@value += 1 if @proxi.board[@row][@col - 2] == "*"
@value += 1 if @proxi.board[@row][@col - 1] == "*"
@value += 1 if @proxi.board[@row][@col] == "*"
@value += 1 if @proxi.board[@row - 1][@col] == "*"
@value += 1 if @proxi.board[@row - 2][@col] == "*"
end
end
def map_position
@proxi.board[@row - 1][@col - 1] = @value
@row = 0
@col = 0
@value = 0
end
end
谢谢你的建议和帮助 你为什么不考虑让你的棋盘课更聪明一点呢 我建议首先创建一个函数来测试任何位置是否有效。例如:
def valid?(row,col)
!(row < 1 || row > @size - 1) || (col < 1 || col > @size - 1)
end
那你就不必再担心事情的发展了
您可以添加一个迭代器函数,让您查看一个点周围的所有单元格。
注意它是如何盲目地循环通过一系列单元格,并让有效的?函数担心边缘
例如:
然后,如果您想实现“检测”之类的功能,您只需担心如何处理每个单元,例如:
def detect(row,col)
around(row,col) do |r,c|
puts "boom at #{r},#{c}" if get(r,c) == '*'
end
end
您可以更改此逻辑以将分数相加或执行任何需要执行的操作。太长了。很少有人愿意免费阅读你的问题。别担心,抱歉让你分心了!
def get (row,col)
@board[row -1][col-1] if valid?(row,col)
end
def set (row,col,val)
@board[row -1][col -1] = val if valid?(row,col)
end
def around(row,col)
(row-1 .. row+1).each do |r|
(col-1 .. col+1).each do |c|
if valid?(r,c)
yield r,c
end
end
end
end
def detect(row,col)
around(row,col) do |r,c|
puts "boom at #{r},#{c}" if get(r,c) == '*'
end
end