#ruby #multiple-choice
#ruby #множественный выбор
Вопрос:
Я только начинаю с ruby и попытался создать игру с множественным выбором. Кажется, я не вижу, где я что-то не так понял, из-за чего он либо повторяет общую строку для комнаты, либо показывает результирующую опцию.
просто для информации, варианты в зале: «север», «посмотреть» или «выйти», затем в кабинете варианты: «посмотреть», «посмотреть на стол», «юг», «выйти», «введите комбинацию 2451»
код ниже:
def hall_begin
#first line you see
puts "you can either look around or move north"
gets.chomp
end
def look_hall
# first option to look around in the hall
puts "You are standing in a hall with a marble floor. You see a door."
hall_begin
end
def onwards_study
# second option to go forwards into the next room from the hall
puts "You are in the study, you can either look around of move back south"
gets.chomp
end
def back_to_hall
# moving back into the hall from the study
puts "You are back in the hall, either look around or go north"
gets.chomp
end
def look_study
# looking around the study to find the desk and safe
puts "You are in a warm and cosy study. You see a safe. You see a desk."
onwards_study
end
def study_desk
# looking on the study desk to find the combination
puts "You see a piece of paper that reads, The combination is 2451."
onwards_study
end
def study_safe
# if you open the safe with combination
puts "You see some diamonds in the safe, pick them up and make your escape"
end
def first_choice
# all the choices whilst in the hall
while true
direction_1 = hall_begin
if direction_1 == "look"
look_hall
elsif direction_1 == "north"
onwards_study
elsif direction_1 == "quit"
break
end
end
end
while true
# start of the game
first_choice
while true
# all choices you face whilst in the study
direction_2 = onwards_study
if direction_2 == "look"
look_study
elsif direction_2 == "south"
back_to_hall
elsif direction_2 == "look at desk"
study_desk
elsif direction_2 == "enter combination 2451"
study_safe
break
elsif direction_2 == "quit"
break
end
break
end
end
Комментарии:
1. вы используете 2, в то время как цикл должен быть 1.
2. Теперь я понимаю, что вы имели в виду … мне потребовалось некоторое время … большое спасибо, что так быстро перезвонили мне! действительно полезно!
3. должен быть возвращен более четкий комментарий, пожалуйста, поддержите комментарий / ответ / вопрос, если они полезны
4. Настоятельно рекомендую вам прочитать книгу «99 бутылок» Сэнди Метц, в дополнение к предложенным ответам она поможет вам усовершенствовать некоторые ваши действия.
Ответ №1:
Как указал Чандан, в таком количестве циклов нет необходимости. Я думаю, что то, что вам нужно, может быть достигнуто с помощью одного основного цикла, который получает пользовательский ввод, а затем обрабатывает его.
Я не хочу делать слишком сложные предложения для начала, поскольку вы только начинаете, но я думаю, что полезно отслеживать переменную «current_room» (которая позже может перейти в координаты в массиве 2D room или что-то в этом роде).
Я также приведу вам несколько примеров, вот как можно достичь чего-то подобного.
def describe_room(current_room)
if current_room == "hall"
puts "You are standing in the hall, either look around or go north"
elsif current_room == "study"
puts "You are in the study, you can either look around of move back south"
end
end
def examine_room(current_room)
if current_room == "hall"
puts "You are standing in a hall with a marble floor. You see a door."
elsif current_room == "study"
puts "You are in a warm and cosy study. You see a safe. You see a desk."
end
end
def move(current_room, direction)
if current_room == "hall" and direction == "north"
"study"
elsif current_room == "study" and direction == "south"
"hall"
else
puts "You cannot go that way"
current_room
end
end
def hall_commands(command)
# No hall specific commands at this points
puts "Unknown command"
# Return "hall" since we are never moving anywhere else
"hall"
end
def study_commands(command)
if command == "look at desk"
puts "You see a piece of paper that reads, The combination is 2451."
elsif command == "enter combination 2451"
puts "You see some diamonds in the safe, pick them up and make your escape"
return nil # Use explicit return statement to avoid default return at the end of the method
else
puts "Unknown command"
end
# Return "study" as the default
"study"
end
# Starting position
current_room = "hall"
while true
break if current_room == nil
# Start each loop by a brief description of the current room.
describe_room(current_room)
# Get the user input in the main loop
command = gets.chomp
# Check for global commands (i.e. movements, look, etc.) first
# and then move on to check for room specific commands.
if command.in?(["north", "east", "south", "west"])
current_room = move(current_room, command)
elsif command == "look"
examine_room(current_room)
elsif command == "quit"
break
elsif current_room == "hall"
current_room = hall_commands(command)
elsif current_room == "study"
current_room = study_commands(command)
else
puts "Unknown command"
end
end
По сути, я упростил ее в один цикл, как упоминалось ранее, затем разделил «глобальные команды», которые можно использовать независимо от того, в какой комнате вы находитесь, и «команды, специфичные для комнаты», которые применяются только в определенных комнатах.
Я надеюсь, что это поможет вам разобраться в Ruby. Когда вы почувствуете себя более комфортно, я бы рекомендовал изучить операторы case / when в качестве альтернативы операторам if / elsif / else, а также массивы для отслеживания комнат и позиций.
Комментарии:
1. Большое спасибо, у меня действительно было слишком много циклов, и чтобы заставить его работать, я оставил методы позади и создал большой цикл if-elsif. не очень красиво, но это сработало. Я взял аргумент position из вашего примера, который действительно помогает разобраться.
2. Ах, конечно, спасибо @CarySwoveland за то, что указал на это. Внес некоторые изменения, чтобы передать его и вернуть любые обновления вместо этого.