我理解课程的工作原理以及如何制作课程,但是练习的第二个额外功劳是用2个不同的文件创建一个两级版本。
我尝试了不同的东西,但我无法弄清楚如何让它发挥作用......
我不知道我是不是在正确的地方寻找,但我找不到任何帮助,也找不到任何解决方案......
如果有人可以帮助我,我将不胜感激:)
这是exercice:http://ruby.learncodethehardway.org/book/ex42.html
到目前为止我尝试过:
map.rb
class Map
with all the methods in here (death(), central_corridor(), etc.)
然后
engine.rb
class Engine
require './map.rb'
def initialize(start)
@quips = [
"You died. You kinda suck at this.",
"Nice job, you died... jackass.",
"Suck a luser."
]
@start = start
puts "in init @start = " + @start.inspect
end
def prompt()
print "> "
end
def play()
puts "@start => " + @start.inspect
@next_room = @start
while true
puts "\n--------"
room = method(@next_room)
@next_room = room.call()
end
end
end
a_game = Engine.new(:central_corridor)
a_game.play()
所以基本上我所做的就是在游戏中获取用于“动作”的方法(房间,死亡等等)并将它们放在map.rb中的类Map中,然后在engine.rb中调用让我的类引擎使用“常规”方法/变量,如提示,播放,开始。
我得到的错误是
engine.rb:24:in `method': undefined method `central_corridor' for class `Engine'
我理解这意味着ruby试图在类引擎中找到一个方法“central_corridor”,但它位于map.rb中的类映射中,我无法弄清楚要做什么,要么是一些变量修改,要么只是一些要添加的东西...... :(
答案 0 :(得分:2)
问题是您没有类Map
的实例,这是您需要能够调用central_corridor
的实例。将其添加到initialize
:
@map=Map.new
将room = method(@next_room)
更改为room=@map.method(@next_room)
。
虽然这不是你的问题,但我有一种感觉,如果Map
永远不会改变(你在地图中有所有方法),你就可以使用所有方法类方法并只使用类{ {1}}用于您的地图。但是,通过良好的设计原则,您可能应该使地图具有代表区域的Map
lambda。这样,您可以拥有多个地图