网格格式的Ruby打印哈希

时间:2014-07-09 23:26:19

标签: ruby hash

我正在编写国际象棋棋盘。我的董事会结构将是这样的:

#   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

2 个答案:

答案 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