Ruby 扫雷舰红宝石探测器阵列索引超出

Ruby 扫雷舰红宝石探测器阵列索引超出,ruby,arrays,indexing,minesweeper,Ruby,Arrays,Indexing,Minesweeper,所以我用ruby做了一个扫雷游戏,很好玩。我已经完成了大部分工作,但是我的探测器对象在处理电路板边缘时遇到了问题。board对象由一个size int和一个由row..col组成的3d数组组成。我的detector对象必须忽略我设置了一个除非条件来处理的超出范围的索引。问题是,当它检查周围是否有地雷时,它可以计算出顶部或底部阵列中的地雷总数。如果它在板的底部,它将从顶部开始计数,等等。另外,右边的一些地雷似乎没有探测到任何东西。中间板排列的矿井似乎运转良好。我一直在尝试许多不同的配置,我对想法感

所以我用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