Ruby 在数组用户游戏中插入随机数有问题吗

Ruby 在数组用户游戏中插入随机数有问题吗,ruby,Ruby,我正在尝试用ruby为控制台创建一个宾果游戏,我有一个板,可以为每个用户随机生成数字。但是,对于每个用户,它都会生成相同的随机板。有效地@places,放入数组@bingo_卡。但它们不是两个不同的数字散列,而是以相同的结果结束。我下面的方法有问题 第一种方法设置电路板,第二种方法为其选择数字 def start_game(user_goes_first) #bingo slots @places = { a1:" ",a2:" ",a3:" ", a4:" ", a5:" ", b1

我正在尝试用ruby为控制台创建一个宾果游戏,我有一个板,可以为每个用户随机生成数字。但是,对于每个用户,它都会生成相同的随机板。有效地@places,放入数组@bingo_卡。但它们不是两个不同的数字散列,而是以相同的结果结束。我下面的方法有问题

第一种方法设置电路板,第二种方法为其选择数字

def start_game(user_goes_first)
#bingo slots
@places = { 
  a1:" ",a2:" ",a3:" ", a4:" ", a5:" ",
  b1:" ",b2:" ",b3:" ", b4:" ", b5:" ",
  c1:" ",c2:" ",c3:" ", c4:" ", c5:" ",
  d1:" ",d2:" ",d3:" ", d4:" ", d5:" ",
  e1:" ",e2:" ",e3:" ", e4:" ", e5:" "
}
@places_keys = [
  :a1,:a2,:a3,:a4,:a5,
  :b1,:b2,:b3,:b4,:b5,
  :c1,:c2,:c3,:c4,:c5,
  :d1,:d2,:d3,:d4,:d5,
  :e1,:e2,:e3,:e4,:e5
]

@bingo_cards = []



@user_name.each do |numbers|

  @places_keys.each_with_index do |n,i| 
    @places[n] = pick_number(i)

  end
   @bingo_cards << @places
   p @bingo_cards
 end
 user_turn
end

def pick_number(num)
 #generates random numbers that make up the bingo board(s)
      case num
      when 0..5
        rand(1..15)
      when 6..10
        rand(16..30)
      when 11..12
        rand(16..30)
      when 13
        "X"
      when 14..15
        rand(16..30)
      when 16..20
        rand(31..45)
      when 21..25
        rand(46..60)
      else
        0 
      end
end

 def draw_game
   puts ""
   puts ""
   puts "     B   I   N  G  O".gray
   puts ""
@bingo_cards.each do |bingo|
  puts " 1   #{@places[:a1]} | #{@places[:b1]} | #{@places[:c1]} | #{@places[:d1]} | #{@places[:e1]}".green
  puts "    --- --- --- --- ---"
  puts " 2   #{@places[:a2]} | #{@places[:b2]} | #{@places[:c2]} | #{@places[:d2]} | #{@places[:e2]}".green
  puts "    --- --- --- --- ---"
  puts " 3   #{@places[:a3]} | #{@places[:b3]} | #{@places[:c3]} | #{@places[:d3]} | #{@places[:e3]}".green
  puts "    --- --- --- --- ---"
  puts " 4   #{@places[:a4]} | #{@places[:b4]} | #{@places[:c4]} | #{@places[:d4]} | #{@places[:e4]}".green
  puts "    --- --- --- --- ---"
  puts " 5   #{@places[:a5]} | #{@places[:b5]} | #{@places[:c5]} | #{@places[:d5]} | #{@places[:e5]}".green
  put_line
end
肖恩 迈克尔

我不认为我是如何生成随机数的问题:这是数字的数组。由于某种原因,存在一个随机数数组,一个是随机数,另一个不是随机数

这是打印的@bingo_卡,这是出现问题的地方:

  [{:a1=>7, :a2=>3, :a3=>8, :a4=>2, :a5=>11, :b1=>1, :b2=>22, :b3=>29, :b4=>25, :b5=>28,   :c1=>29, :c2=>17, :c3=>17, :c4=>"X", :c5=>25, :d1=>16, :d2=>43, :d3=>31, :d4=>35, :d5=>34, :e1=>44, :e2=>57, :e3=>52, :e4=>59, :e5=>51}]
   [{:a1=>8, :a2=>3, :a3=>7, :a4=>14, :a5=>7, :b1=>13, :b2=>29, :b3=>28, :b4=>28, :b5=>25, :c1=>17, :c2=>25, :c3=>30, :c4=>"X", :c5=>27, :d1=>18, :d2=>40, :d3=>38, :d4=>41, :d5=>33, :e1=>31, :e2=>47, :e3=>49, :e4=>57, :e5=>59}, {:a1=>8, :a2=>3, :a3=>7, :a4=>14, :a5=>7, :b1=>13, :b2=>29, :b3=>28, :b4=>28, :b5=>25, :c1=>17, :c2=>25, :c3=>30, :c4=>"X", :c5=>27, :d1=>18, :d2=>40, :d3=>38, :d4=>41, :d5=>33, :e1=>31, :e2=>47, :e3=>49, :e4=>57, :e5=>59}]

当您将散列对象放入数组中,然后更改原始散列对象时,这些更改将反映在数组中,因为数组中的对象是相同的对象

:001 > h = {}
 => {} 
:002 > h[:a1] = 1
 => 1 
:003 > h[:a2] = 2
 => 2 
:004 > arr = []
 => [] 
:005 > arr << h
 => [{:a1=>1, :a2=>2}] 
:006 > h[:a2] = 4
 => 4 
:007 > arr
 => [{:a1=>1, :a2=>4}] 

当您将散列对象放入数组中,然后更改原始散列对象时,这些更改将反映在数组中,因为数组中的对象是相同的对象

:001 > h = {}
 => {} 
:002 > h[:a1] = 1
 => 1 
:003 > h[:a2] = 2
 => 2 
:004 > arr = []
 => [] 
:005 > arr << h
 => [{:a1=>1, :a2=>2}] 
:006 > h[:a2] = 4
 => 4 
:007 > arr
 => [{:a1=>1, :a2=>4}] 
1) 您发布的代码如何产生您发布的输出

2) 您的start_game方法从不使用其参数变量。摆脱它

3) 我认为以下几点没有任何效果:

@places = { 
  a1:" ",a2:" ",a3:" ", a4:" ", a5:" ",
  b1:" ",b2:" ",b3:" ", b4:" ", b5:" ",
  c1:" ",c2:" ",c3:" ", c4:" ", c5:" ",
  d1:" ",d2:" ",d3:" ", d4:" ", d5:" ",
  e1:" ",e2:" ",e3:" ", e4:" ", e5:" "
}
…所以删除它。如果出于某种原因需要这样的散列,只需执行以下操作:

@places = Hash.new {|hash, key| hash[key] = " "}
3) 我甚至不知道你为什么要在你的棋盘上使用散列。如果您使用一组数组,似乎会使事情变得更简单:

[
   [......],   #each row is an array
   [......],
   [......],
   [......],
   [......],
]
要创建5x5随机数数组,可以执行以下操作:

cols = 5
rows = 5

places = []
count = 0

rows.times do |i|
  row = []

  cols.times do |j|
    row << pick_number(count)
    count += 1
  end

  places << row
end
然后所有这些行:

 puts " 1   #{@places[:a1]} | #{@places[:b1]} | #{@places[:c1]} | #{@places[:d1]} | #{@places[:e1]}".green
  puts "    --- --- --- --- ---"
  puts " 2   #{@places[:a2]} | #{@places[:b2]} | #{@places[:c2]} | #{@places[:d2]} | #{@places[:e2]}".green
  puts "    --- --- --- --- ---"
  puts " 3   #{@places[:a3]} | #{@places[:b3]} | #{@places[:c3]} | #{@places[:d3]} | #{@places[:e3]}".green
  puts "    --- --- --- --- ---"
  puts " 4   #{@places[:a4]} | #{@places[:b4]} | #{@places[:c4]} | #{@places[:d4]} | #{@places[:e4]}".green
  puts "    --- --- --- --- ---"
  puts " 5   #{@places[:a5]} | #{@places[:b5]} | #{@places[:c5]} | #{@places[:d5]} | #{@places[:e5]}".green
  put_line
end
可简化为:

output.each_with_index do |row, i|
  row.unshift i+1

  strs = row.map do |num|
    num.to_s.center(4)
  end

  puts strs.join("|") 
  puts "---  " * (cols+1)

end
…这会让你得到这样的东西:

 1  | 1  | 1  | 28 | 27 | 44 
---  ---  ---  ---  ---  ---  
 2  | 1  | 16 | 16 | 31 | 53 
---  ---  ---  ---  ---  ---  
 3  | 8  | 29 | 17 | 35 | 56 
---  ---  ---  ---  ---  ---  
 4  | 15 | 24 | X  | 37 | 49 
---  ---  ---  ---  ---  ---  
 5  | 10 | 17 | 24 | 37 | 55 
---  ---  ---  ---  ---  ---  
1) 您发布的代码如何产生您发布的输出

2) 您的start_game方法从不使用其参数变量。摆脱它

3) 我认为以下几点没有任何效果:

@places = { 
  a1:" ",a2:" ",a3:" ", a4:" ", a5:" ",
  b1:" ",b2:" ",b3:" ", b4:" ", b5:" ",
  c1:" ",c2:" ",c3:" ", c4:" ", c5:" ",
  d1:" ",d2:" ",d3:" ", d4:" ", d5:" ",
  e1:" ",e2:" ",e3:" ", e4:" ", e5:" "
}
…所以删除它。如果出于某种原因需要这样的散列,只需执行以下操作:

@places = Hash.new {|hash, key| hash[key] = " "}
3) 我甚至不知道你为什么要在你的棋盘上使用散列。如果您使用一组数组,似乎会使事情变得更简单:

[
   [......],   #each row is an array
   [......],
   [......],
   [......],
   [......],
]
要创建5x5随机数数组,可以执行以下操作:

cols = 5
rows = 5

places = []
count = 0

rows.times do |i|
  row = []

  cols.times do |j|
    row << pick_number(count)
    count += 1
  end

  places << row
end
然后所有这些行:

 puts " 1   #{@places[:a1]} | #{@places[:b1]} | #{@places[:c1]} | #{@places[:d1]} | #{@places[:e1]}".green
  puts "    --- --- --- --- ---"
  puts " 2   #{@places[:a2]} | #{@places[:b2]} | #{@places[:c2]} | #{@places[:d2]} | #{@places[:e2]}".green
  puts "    --- --- --- --- ---"
  puts " 3   #{@places[:a3]} | #{@places[:b3]} | #{@places[:c3]} | #{@places[:d3]} | #{@places[:e3]}".green
  puts "    --- --- --- --- ---"
  puts " 4   #{@places[:a4]} | #{@places[:b4]} | #{@places[:c4]} | #{@places[:d4]} | #{@places[:e4]}".green
  puts "    --- --- --- --- ---"
  puts " 5   #{@places[:a5]} | #{@places[:b5]} | #{@places[:c5]} | #{@places[:d5]} | #{@places[:e5]}".green
  put_line
end
可简化为:

output.each_with_index do |row, i|
  row.unshift i+1

  strs = row.map do |num|
    num.to_s.center(4)
  end

  puts strs.join("|") 
  puts "---  " * (cols+1)

end
…这会让你得到这样的东西:

 1  | 1  | 1  | 28 | 27 | 44 
---  ---  ---  ---  ---  ---  
 2  | 1  | 16 | 16 | 31 | 53 
---  ---  ---  ---  ---  ---  
 3  | 8  | 29 | 17 | 35 | 56 
---  ---  ---  ---  ---  ---  
 4  | 15 | 24 | X  | 37 | 49 
---  ---  ---  ---  ---  ---  
 5  | 10 | 17 | 24 | 37 | 55 
---  ---  ---  ---  ---  ---  

@user\u name是什么,它是如何设置的?没关系,我看到了问题。作为散列,places已经有了一个名为keys的方法。不需要手工制作。可以说,
@places\u keys=@places.keys
什么是@user\u name,它是如何设置的?没关系,我看到了问题。作为散列,places已经有了一个名为keys的方法。不需要手工制作。可能只是说
@places\u keys=@places.keys