如何使用Ruby存储和检索值?

我正试图在旧的video游戏“毒品战争”中松散地建立一个“火车游戏”。 我目前正在通过LRTHW工作,我相信我应该使用OOP,但我还没有那个教训。

前提是您的火车上有一定数量的汽车,您可以看到其他城市的待售产品(您可以购买或销售的数量没有限制,假设您可以在火车上安装它们)。 这段代码并不完整,但我想知道我是否在合理的方式创建和获取产品价格方面正在接近这一半。

#Initializing variables. Current_location should be changed to random #in the future. current_location = 'omaha' train = [] new_york = [] chicago = [] omaha = [] dallas = [] seattle = [] def prompt() print "> " end #Here is the selection menu. It is possible to exploit this and #buy, sell and move all within the same turn. #There needs to be a "safe selection" so that once you have moved you #can't move again, but you can get info, buy and sell #as many times as you would like. def selection() puts "Do you want to travel, buy, sell or get info?" prompt; selection = gets.chomp if selection.include? "travel" puts "Where would you like to travel?" prompt; city = gets.chomp return 'city', city elsif selection.include? "buy" puts "Current Prices Are:" puts "What would you like to Buy?" elsif selection.include? "sell" puts "Current Prices Are:" puts "What would you like to sell?" elsif selection.include? "info" puts "What city or train would you like info on?" else puts "Would you like to exit selection or start selection again?" end end #This generates a new cost for each good at the start of each turn. def generate_costs(new_york, chicago, omaha, dallas, seattle) new_york[0] = rand(10) new_york[1] = rand(10) + 25 new_york[2] = rand(5) + 10 omaha[0] = rand(10) omaha[1] = rand(10) + 25 omaha[2] = rand(5) + 10 chicago[0] = rand(25) + 5 chicago[1] = rand(5) + 10 chicago[2] = rand(4) dallas[0] = rand(6) + 11 dallas[1] = rand(3) + 10 dallas[2] = rand(8) seattle[0] = rand(6) seattle[1] = rand(10) + 24 seattle[2] = rand(14) + 13 return new_york, chicago, omaha, dallas, seattle end # This is my main() loop. It drives the game forward. for i in (0..5) new_york, chicago, omaha, dallas, seattle = generate_costs(new_york, chicago, omaha, dallas, seattle) turns = 5 - i puts "You are currently in #{current_location}. You have #{turns} remaining." puts "{ ___________________________ }" #Code Here evaluates and accesses pricing based on current_location. #Is this the correct way to do this? fish = eval("#{current_location}[0]") coal = eval("#{current_location}[1]") cattle = eval("#{current_location}[2]") puts "Fish is worth #{fish}" puts "Coal is worth #{coal}" puts "Cattle is worth #{cattle}" puts "{ ___________________________ }" change, value = selection() if change == 'city' current_location = value elsif change == 'buy' puts 'So you want to buy?' else puts "I don't understand what you want to do" end end 

eval是一种讨厌的访问数据的方式( Ruby中的`eval`何时合理? )。 你应该考虑把东西搬进一个物体。

我稍微改进了代码,将城市存储在哈希中,从而摆脱了祸害。 我已经删除了generate_costs逻辑,但您可以通过执行以下操作来分配它:

 cities[:new_york][0] = rand(10) 

理想情况下,应该使用面向对象的语法重写代码。 如果我有一些时间,那么我会为你敲一个例子。

这是代码:

 #Initializing variables. Current_location should be changed to random #in the future. current_location = :omaha train = [] cities = { :new_york => [], :chicago => [], :omaha => [], :dallas => [], :seattle => [] } def prompt() print "> " end #Here is the selection menu. It is possible to exploit this and #buy, sell and move all within the same turn. #There needs to be a "safe selection" so that once you have moved you #can't move again, but you can get info, buy and sell #as many times as you would like. def selection() puts "Do you want to travel, buy, sell or get info?" prompt; selection = gets.chomp if selection.include? "travel" puts "Where would you like to travel?" prompt; city = gets.chomp return 'city', city elsif selection.include? "buy" puts "Current Prices Are:" puts "What would you like to Buy?" elsif selection.include? "sell" puts "Current Prices Are:" puts "What would you like to sell?" elsif selection.include? "info" puts "What city or train would you like info on?" else puts "Would you like to exit selection or start selection again?" end end #This generates a new cost for each good at the start of each turn. def generate_costs(cities) cities.each do |key,city| 0.upto(2) do |i| city[i] = rand(10) end end end # This is my main() loop. It drives the game forward. for i in (0..5) generate_costs(cities) turns = 5 - i puts "You are currently in #{current_location}. You have #{turns} remaining." p cities puts "{ ___________________________ }" fish = cities[current_location][0] coal = cities[current_location][1] cattle = cities[current_location][2] puts "Fish is worth #{fish}" puts "Coal is worth #{coal}" puts "Cattle is worth #{cattle}" puts "{ ___________________________ }" change, value = selection() if change == 'city' current_location = value elsif change == 'buy' puts 'So you want to buy?' else puts "I don't understand what you want to do" end end