2017-05-09 3 views
1

Dungeons와 Dragons를위한 전투 조수 인 나 자신과 몇 명의 친구들을 만들고 있습니다. 대부분의 유지 트랙이 꽤 반복적이어서 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) 

는 그런 다음 thusly 히 party 전화를 partysetup을 정의 할 수 있습니다 :

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

n 선수 일 party를 작성하는 방법은 여러 가지가 있습니다. 그것은 최고의 솔루션이 아닐 수도 있지만 나는 즉시 재귀 알고리즘의 생각 :

$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

관련 문제