2017-05-09 118 views
1

我正在让自己和一些我的朋友成为龙与地下城的战斗助理,因为大部分保持轨道都是重复的,所以我认为我可以做些Ruby。它进展顺利,但现在我遇到了障碍。未定义的方法:变量?

这是我的代码

def party8 
    party7 
    puts "Last one! What's your eighth player's name?" 
    player8name = gets.chomp 
    puts "What's their AC?" 
    player8ac = gets.chomp.to_i 
    puts "Got it. What's their max HP?" 
    player8maxhp = gets.chomp.to_i 
end 

def partysetup 
    puts "hi" 
    if 8 == playercount 
    party8 
    else 
    party1 
    end 

end 

#intro---------------------------------------------------------------------- 


puts "-Hello. I am l1fecount, the DM's combat assistant." 
puts "-Before we begin, would you like to see in-depth information about me?" 
infoq = gets.chomp 
infoq.downcase! 

if infoq == "yes" 
    puts "-Very well, I'm glad to explain. I am l1fecount, a program designed to keep track of up to 5 types of mobs, with up to 10 
    of each. I can also keep track of up to 8 players. I keep track of turn order, current HP vs max HP, CR, and armor 
    class. I am still very young, so please be patient with me. ^^; " 
else 
    puts "-Right then." 

end 

puts "-So, let's begin." 

#intro end---------------------------------------------------------------- 


#party--------------------------------------------------------------------- 

loop do 
    puts "How many players today?" 
    playercount = gets.chomp.to_i 
    if 0 >= playercount 
     puts "You can't have no players in a party. That's not D&D, that's you having no friends." 
     redo 
    elsif 8 < playercount 
    puts "Hey now, that's a huge party. I can only handle eight players at once." 
    redo 
    elsif 8 >= playercount 
     break  
    else 
    puts "A number between 1 and 8, please." 
    redo 
    end 
end 

partysetup 

`

(party1-7存在,但等同于派对8,所以我不包括它简洁的缘故。)

它运行得很好,直到我尝试运行partysetup。我加了把语句,这样我可以看到,如果正被调用的方法,它是,但我不断收到这样的:

-Hello. I am l1fecount, the DM's combat assistant. 
-Before we begin, would you like to see in-depth information about me? 
no 
-Right then. 
-So, let's begin. 
How many players today? 
8 
hi 
Error: undefined method `playercount' for main:Object 

我试图寻找简单的拼写错误,转换playercount为字符串或符号,但没有解决这个问题。请帮助?

+0

尝试在循环之前放置'playercount = nil'。否则,当您在循环内定义变量时,引用将仅在循环中局部。 –

+0

请阅读“[mcve]”,包括链接的页面。您的代码无法运行以证明问题,为了帮助您,我们必须对其进行修改。您需要帮助我们通过将代码剥离到最低程度来帮助您。 http://ericlippert.com/2014/03/05/how-to-debug-small-programs/有助于解释它。 –

+0

请参阅[差异之间的各种变量范围在红宝石](http://stackoverflow.com/questions/11495098/difference-between-various-variables-scopes-in-ruby)以及 –

回答

2

playercount在循环内定义。由于它没有前缀,因此它是一个局部变量。在这种情况下,它只能在循环内部看到。它在您在文件顶部定义的方法不可见。

几乎可以肯定你不想用几乎相同的代码来定义8(或更多!)方法。一个解决方案是把党的计数方法参数:

def party(n) 

然后你就可以定义partysetup调用party正是如此:

def partysetup(playercount) 
    # Setup stuff 
    party(playercount) 
end 

有几种方法来写partyn球员的工作。它可能不是最好的解决办法,但我马上想到了一个递归算法:

$players = [] 
def party(n) 
    return if n == 0 
    party(n-1) 

    player = {} 
    puts "What's player #{n}'s name?" 
    player[:name] = gets.chomp 
    puts "What's their AC?" 
    player[:ac] = gets.chomp.to_i 
    puts "Got it. What's their max HP?" 
    player[:maxhp] = gets.chomp.to_i 
    $players[n] = player 
end 

注意我用了一个美元符号($)为$players数组中的前缀。这意味着它是一个全局变量,可用于程序的所有部分。通常你想避免全局变量,但是访问代码中任何地方的玩家数据都是非常方便的。

但Ruby提供全局和本地范围之间的选项。更好的解决方案是创建一个类来管理你的游戏并将玩家数据存储在一个实例变量中(@players)。这给你更多的灵活性(可能一次运行多个游戏?),并让你养成管理范围的习惯。

+0

使用数组的好主意,但使用全局的笨手笨脚的方法真的不符合要求并且不被推荐,这是一个非常不好的习惯。这可以封装在一个简单的类中,而不会造成混乱,然后使用一个简单的实例变量,例如'@ players',并且整洁,整齐,不言自明。 – tadman

+1

@tadman:好点。我已经添加了另一段解释该建议。那看起来更好? – Kathryn

+0

是的,到达那里。我对此进行了重构,但很快就失控了,所以我放弃了这一努力。不过,一个合适的'Player'和'Party'类确实有助于简化这些代码。 – tadman