#ruby
#ruby
Вопрос:
Я создаю текстовую приключенческую игру. Мой код выглядит следующим образом:
case move
when "go north"
puts "you hurl yourself at the now weakened door".
when "attack"
puts "You break the weakened door!"
Я хочу "attack"
puts
сообщение о взломанной двери, только если пользователь вводит "go north"
перед этим. Если они напечатают "attack"
раньше "go north"
, я хочу, чтобы в нем было сказано что-то еще. Как я могу заставить ruby проверить, была ли введена конкретная команда в оператор case?
Редактировать:
Это мой обновленный код:
состояния = []
case move
when "help"
help
when "quit"
quit
when "inventory"
@inventory
when "go north"
puts "You hurl your shackled self toward the door. The chains cut into your wrists and ankles, but you seem to be making progress."
states << :north # add the state to the pile
when 'attack chains'
if states.include? :north # does our pile of state contains :in_north
puts "You slam your shackled fists against the wall. You broke the chains!"
else
puts "You smash your shackled fists on the ground. Nothing happens."
end
when "go south"
puts "Your back shivers against the cold surface of the stone wall."
when "go east"
puts "You tug to your right, but the chains hold fast."
when "go west"
puts "You tug to your left, but the chains hold fast."
else
puts "Unknown command."
end
end
Это не работает, я не думаю, что добавляется state : north .
Есть идеи?
Комментарии:
1. Это в бэкэнде или во внешнем интерфейсе?
2. Он был помечен как Ruby-On-Rails; я хотел знать, была ли это серверная или фронтальная работа. Если у вас есть входные данные в ROR, они должны быть обработаны на сервере, вот и все
3. Я не понимаю, что вы имеете в виду.
4. это для ruby, а не для rails. Моя вина в том, что я на бирке.
Ответ №1:
Вы этого не делаете. Вместо этого вы хотите иметь либо состояния (какой-то конечный автомат) :
states = [] # list of states or "flags"
loop do
case gets.chomp
when 'go north'
if states.include? :in_north
puts "You're already north !"
else
puts "<You go north ...>"
states << :in_north # add the state to the pile
end
when 'attack'
if states.include? :in_north # does our pile of state contains :in_north
puts "You attack the wolf before you !"
else
puts "You need to be north to attack !"
end
end
Ответ №2:
у вас был дополнительный «конец» в вашем коде. исправлено. Кстати, оператор «<<» работает не во всех версиях ruby. попробуйте вместо этого использовать «states.push(:north) и посмотрите, как это работает.
states = []
case move
when "help"
help
when "quit"
quit
when "inventory"
@inventory
when "go north"
puts "You hurl your shackled self toward the door. The chains cut into your wrists and ankles, but you seem to be making progress."
states << :north # add the state to the pile
when "attack chains"
if states.include? :north # does our pile of state contains :in_north
puts "You slam your shackled fists against the wall. You broke the chains!"
else
puts "You smash your shackled fists on the ground. Nothing happens."
end
when "go south"
puts "Your back shivers against the cold surface of the stone wall."
when "go east"
puts "You tug to your right, but the chains hold fast."
when "go west"
puts "You tug to your left, but the chains hold fast."
else
puts "Unknown command."
end
Ответ №3:
case [gets.chomp, gets.chomp]
when ["go north", "attack"] then puts "You break the weakened door!"
when ["attack", "go north"] then puts "something else"
end
Комментарии:
1. Это не будет работать более чем для 5-строчного скрипта. Пожалуйста, никогда не пишите такой код.
2. Не могли бы вы объяснить, почему это хорошее решение вопроса.
3. Перед обработкой требуется два ввода, что может быть нежелательным.
4. @LIUFA, Дэвид Унрик Пока что это единственный ответ, который делает именно то, что описал OP. Если OP хотел сделать что-то еще, то ответственность за то, что OP не прояснил это, лежит на OP. Это ответ на вопрос OP, а не что-либо еще.
5. @sawa Прошу прощения за неясность, я должен просмотреть этот ответ, и в нем есть только код без объяснения того, что есть, что и почему — отсюда и комментарий. Пожалуйста, не обижайтесь.