Andeski
Andeski

Reputation: 33

how to use .include? in Ruby with a hash statement

How do I get the .include? to work? When the user chooses a character, I want the console to print the puts ok statement and then go to the if statement.

  name = {"1" => "Mario",
            "2" => "Luigi",
            "3" => "Kirby",
            }
        puts "Peach's apocalypse, will you survive?"

    def character (prompt, options)
        puts = "who will you be?"
        options = name[1] || name[2] || name[3]
        character = gets.chomp.downcase
    until character.include? name
    end


    puts "ok #{name} all three of you run out of peach's castle which has been overrun"

    if character = name[1] || name[2] || name[3]
        puts ("zombies are in the castle grounds, there are weapons over the bridge")
        puts "What do you do, charge through or sneak?"
        x = gets.chomp.downcase
                if x == "sneak"
                    puts "oh you died"
                if x == "charge through"
                    puts "the zombies tumbled over the bridge's edge, you made it safe and sound"
                else
                    puts "you did nothing and were eaten alive by Princess Peach"
    end
    end
    end
    end

Upvotes: 0

Views: 110

Answers (2)

Eupatoria
Eupatoria

Reputation: 130

The answer above is great and features awesome refactoring, but I would use

character = gets.strip.downcase

instead as it also gets rid of any potential whitespace.

To elaborate on the string thing, 'gets' stands for 'get string' (or at least so I was taught), so everything you get via 'gets' will be a string until you convert it further. Consider this:

2.2.1 :001 > puts "put in your input"
put in your input
=> nil 
2.2.1 :002 > input = gets.strip
5
=> "5" 
2.2.1 :003 > input.class
=> String 

You would have to use .to_i to convert your input back to integer.

Upvotes: 1

williamcodes
williamcodes

Reputation: 7216

It looks like you're calling include? on a string. This will only return true if you pass it a substring of itself. For example:

"Mario".include?("Mar") #=> true

You want to call include? on the array of keys in the name hash. You could do:

name.values.include?(character)

or more concisely

name.has_value?(character)

Here's some documentation on the include? method of the Array class and the include? method of the string class, as well as the has_value? method of the Hash class.

There's considerably more that needs modifying for this program to run as you're expecting it to though. Here's one working implementation:

puts "Peach's apocalypse, will you survive?"

names = {
  "1" => "Mario",
  "2" => "Luigi",
  "3" => "Kirby"
}

def choose_character(character = "", options)
  puts = "who will you be?"
  options.each do |num, name|
    puts "#{num}: #{name}"
  end

  until options.has_key? character or options.has_value? character
    character = gets.chomp.capitalize
  end

  return options[character] || character
end

name = choose_character(names)

puts "ok #{name} all three of you run out of peach's castle which has been overrun"
puts "zombies are in the castle grounds, there are weapons over the bridge"
puts "What do you do, charge through or sneak?"

case gets.chomp.downcase
when "sneak"
  puts "oh you died"
when "charge through"
  puts "the zombies tumbled over the bridge's edge, you made it safe and sound"
else
  puts "you did nothing and were eaten alive by Princess Peach"
end

Upvotes: 1

Related Questions