2017-05-09 47 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