我倾向于编写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。请原谅我的英文,请。
答案 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