Я новичок в языке ruby и пытаюсь создать текстовую приключенческую игру, я хочу включить две строки

#ruby #if-statement

#ruby #if-statement

Вопрос:

Я хочу, чтобы пользователь вводил что угодно, но это должно включать две строки, такие как «look» и «right», если обе включены в предложение, тогда программа перейдет к следующей строке. Я новичок в ruby, просто знакомлюсь с языком.

Я пробовал amp;amp; и || , но это не работает

 puts " in which direction do you want to look"  
input = gets.chomp.to_s 

if input.include? == "look" amp;amp; "right"  
    puts " There is a dead end on the right"  
  elsif input.include? "look" amp;amp; "left"  
     puts "there is a narrow way , going towards the woods"  
  else   

    puts "i dont understand what you are trying to say"  

 end  
  

Комментарии:

1. Это совсем не так include? работает. Вот документы: Строка#включить? . Вот что вам нужно было написать: input.include?("look") amp;amp; input.include?("right")

2. Спасибо, чувак, действительно ценю твою помощь, попробую и дам тебе знать, работает ли это.

3. «это не работает» — недостаточно точное описание ошибки, чтобы мы могли вам помочь. Что не работает? Как это не работает? Какие проблемы у вас с вашим кодом? Вы получаете сообщение об ошибке? Что это за сообщение об ошибке? Результат, который вы получаете, не тот, который вы ожидаете? Какого результата вы ожидаете и почему, какой результат вы получаете и чем они отличаются? Поведение, которое вы наблюдаете, не является желаемым поведением? Каково желаемое поведение и почему, каково наблюдаемое поведение и чем они отличаются?

4. да, конечно, сделаю это

Ответ №1:

Вместо input.include? "look" amp;amp; "right" вам нужно сравнить операторы один за другим.

 if input.include?("look") amp;amp; input.include?("right")
    puts " There is a dead end on the right"  
  elsif input.include?("look") amp;amp; input.include?("left")
     puts "there is a narrow way , going towards the woods"  
  else   
    puts "i dont understand what you are trying to say"  
 end  
  

Логически, input.include? "look" это либо вернет true, либо false, и input.include? "right" также вернет true или false. Для того, чтобы это сработало, оба оператора должны быть true!

Комментарии:

1. спасибо за помощь, действительно помогла мне понять .. теперь все работает нормально.

2. Рад помочь !! 🙂

Ответ №2:

Я бы предложил определить метод, который обрабатывает входные данные и возвращает direction для использования в if/then/else :

 def get_direction(input)
  keywords = ['look', 'left', 'right']
  directions = {101 => :right, 110 => :left}
  directions.default = :none
  input = input.scan(/w /).map(amp;:downcase).uniq
  key = keywords.map { |k| input.include? k }.map{ |e| e ? 1 : 0 }.join().to_i
  directions[key]
end
  


Это несколько примеров вызовов методов:

 get_direction("Yes. Look at your right now! Right now! Look!") #=> :right
get_direction("Yes. Look at your left now!") #=> :left
get_direction("Look right. Left them there!") #=> :none
get_direction("Stay right here!") #=> :none
  


Внутри метода вы можете найти строку#scan для разделения входных данных на слова. Кроме того, есть .map(amp;:downcase) способ обеспечить нечувствительность к регистру, используя Array#map. Для выбора выходных данных используется хэш.

Добавьте p , чтобы распечатать эту строку, чтобы понять, как она работает:

 p key = keywords.map { |k| input.include? k }.map{ |e| e ? 1 : 0 }.join().to_i
  


Теперь вы можете использовать метод таким образом:

 direction = get_direction(gets.chomp.to_s)

if  direction == :right
  p 'right'
elsif direction == :left
  p 'left'
else
  p 'none'
end
  

Комментарии:

1. о да, спасибо, я обязательно проверю этот set class , выглядит великолепно. Спасибо