在红宝石中制作战舰游戏

时间:2014-08-06 14:29:08

标签: ruby

我倾向于编写Ruby并尝试制作战舰游戏。现在我遇到了一些困难(在Github上发现了很多实现,但是无法理解它们)。

我有一个10 * 10的板,现在我正在尝试实现在场上行走的算法。例如:我在场上的x位置,如何检查A1单元的可用性?所以这是一个变体......但是如何制作通用方法呢? (当我选择一个位置时,我需要检查周围的8个单元格以获得下一个单元格的空闲空间。)

def test(postition)
letter = position[0]

#   1 2 3
# A O . .
# B x . .
# C . . .

keys = board.keys
index = keys.find_index(letter)
prev_key = keys[index - 1] #up-down
unless prev_key.nil?
    is_ship_placed = board[prev_key][postition[1]] #left-right
end

#   1 2 3
# A O . .
# B . . .
# C . . .

end

All my code for now is in ideone.com

如果有人帮助我,我将非常感激!

P.S。请原谅我的英文,请。

1 个答案:

答案 0 :(得分:2)

我已经将@ JustinWood的建议扩展到了这个答案。您会发现将电路板表示为数组而不是哈希更容易。

所以改变

board = { a: [false, false, false, false, false, false, false, false, false, false], \
          b: [false, false, false, false, false, false, false, false, false, false], etc.

这样的二维数组。 (列表清单。)

board = [[false, false, false, false, false, false, false, false, false, false],
         [false, false, false, false, false, false, false, false, false, false],
                                     ..........                               ]]

当然,您可以自动填充它,而不是将10行false复制粘贴到源代码中。这有效:

blank_row = Array.new(10,false)
board = Array.new(10) { blank_row.clone }

然后你可以用算术导航板,检查周围的8个方块。 你会做这样的事情:

def test (position)
  x, y = position 
  return true if board[y][x]
  return true if board[y-1][x-1]
  return true if board[y-1][x]
  ....
  false
end

添加适当的防护来处理边缘,并自动化它而不是输入所有9个案例。

正如您所注意到的,当您将哈希更改为阵列时,这意味着您必须更改使用该棋盘的游戏的其他部分。例如,您已经知道如何遍历Hash(例如更改它)

board.each do |key, row|
  row.each do |v|
    # do something with cell v and build a new row
  end
  # insert the new row at board[key] 
end

您可以像这个例子一样迭代2D数组

board.each.with_index do |row, y|
  row.each.with_index do |v, x|
    # change a true cell to 'S' and false to '.'
    if v
      board[y][x] = 'S'
    else
      board[y][x] = '.'
    end
  end
end