我正在编写国际象棋棋盘。我的董事会结构将是这样的:
# a b c d e f g h
# 1 * * * * * * * * # <= Black pieces on top
# 2 * * * * * * * *
# 3 * * * * * * * *
# 4 * * * * * * * *
# 5 * * * * * * * *
# 6 * * * * * * * *
# 7 * * * * * * * *
# 8 * * * * * * * * # <= White pieces on bottom
我创建了一个@board
哈希,它存储网格中任何项目的值(即片段或空格)。
如何获取我的哈希值,它将网格位置映射到当前的"*"
(即@board['a8']=> '*'
等),并以网格状格式输出该哈希值?
这是我的@board
变量:
def drawBoard
@board = Hash.new
letter='a'
while letter <= 'h'
i=1
while i<9
@board["#{letter}#{i}"] = "*"
i+=1
end
letter=letter.next
end
@board
end
当前输出只是哈希本身。即,
{"a1"=>"*", "a2"=>"*", "a3"=>"*", "a4"=>"*", "a5"=>"*", "a6"=>"*", "a7"=>"*", "a8"=>"*", "b1"=>"*", "b2"=>"*", "b3"=>"*", "b4"=>"*", "b5"=>"*", "b6"=>"*", "b7"=>"*", "b8"=>"*", "c1"=>"*", "c2"=>"*", "c3"=>"*", "c4"=>"*", "c5"=>"*", "c6"=>"*", "c7"=>"*", "c8"=>"*", "d1"=>"*", "d2"=>"*", "d3"=>"*", "d4"=>"*", "d5"=>"*", "d6"=>"*", "d7"=>"*", "d8"=>"*", "e1"=>"*", "e2"=>"*", "e3"=>"*", "e4"=>"*", "e5"=>"*", "e6"=>"*", "e7"=>"*", "e8"=>"*", "f1"=>"*", "f2"=>"*", "f3"=>"*", "f4"=>"*", "f5"=>"*", "f6"=>"*", "f7"=>"*", "f8"=>"*", "g1"=>"*", "g2"=>"*", "g3"=>"*", "g4"=>"*", "g5"=>"*", "g6"=>"*", "g7"=>"*", "g8"=>"*", "h1"=>"*", "h2"=>"*", "h3"=>"*", "h4"=>"*", "h5"=>"*", "h6"=>"*", "h7"=>"*", "h8"=>"*"}
修改 感谢大卫的回答,他带领我走向更紧凑的哈希生成方法。更新(和工作)代码:
def drawBoard
@board = Hash.new
('a'..'h').each do |letter|
(1..9).each do |i|
@board["#{letter}#{i}"] = "*"
print @board["#{letter}#{i}"]
end
puts
end
end
答案 0 :(得分:3)
前提是您可以在@board
中使用符号代替字符串:
@board = {:"a1" => "*", ...}
我认为最简单的方法是准备一个固定的模板字符串,并使用字符串格式重写网格。
Template = <<_
a b c d e f g h
1 %{a1} %{b1} %{c1} %{d1} %{e1} %{f1} %{g1} %{h1}
2 %{a2} %{b2} %{c2} %{d2} %{e2} %{f2} %{g2} %{h2}
3 %{a3} %{b3} %{c3} %{d3} %{e3} %{f3} %{g3} %{h3}
4 %{a4} %{b4} %{c4} %{d4} %{e4} %{f4} %{g4} %{h4}
5 %{a5} %{b5} %{c5} %{d5} %{e5} %{f5} %{g5} %{h5}
6 %{a6} %{b6} %{c6} %{d6} %{e6} %{f6} %{g6} %{h6}
7 %{a7} %{b7} %{c7} %{d7} %{e7} %{f7} %{g7} %{h7}
8 %{a8} %{b8} %{c8} %{d8} %{e8} %{f8} %{g8} %{h8}
_
Template % @board
如果你让@board
成为一个平面数组(可以使用模运算处理),那么将上面的%{..}
替换为%s
,它将以相同的方式工作
答案 1 :(得分:1)
这是您可以使用的起点。您需要自己添加行标签和列标签,并添加空格,但这样可以让您朝着正确的方向前进:
('a'..'h').each do |letter|
(1..8).each do |i|
print @board["#{letter}#{i}"]
end
puts # end the line
end