Python начинающий, текстовая игра
Я довольно новичок в программировании игры; Я 3/4 пути через Learn Python the Hard Way
и у меня возник вопрос о небольшой текстовой игре, которую я сделал... Так что в этой игре мой guy
находится на необитаемом острове, и у вас есть возможность (необработанный ввод) left
right
или же into the jungle
, После выбора направления вы можете выбрать, сколько миль пройти пешком. Предполагается, что каждое направление имеет различный конечный результат (и расстояние в милю).
Если вы введете число, которое меньше количества миль до места назначения, вам будет предложено выбрать либо "развернуться, либо" продолжать движение ". turn around
, вы вернетесь в начало, где вас снова попросят выбрать направление. Если вы введете keep going
программа вернется в мили (), где вы можете выбрать новое количество миль для ходьбы.
def miles():
print "How many miles do you walk?"
miles_choice = raw_input("> ")
how_much = int(miles_choice)
if how_much >= 10:
right_dest()
elif how_much < 10:
turn()
else:
print "You can't just stand here..."
miles()
Итак, вот два вопроса:
Как бы мне было сделать так, чтобы, если пользователь изначально вводил число миль меньше, чем расстояние до пункта назначения, и ввод второй мили + ввод первой мили == количество миль до пункта назначения, он будет добавлять входы и запускать мой функция назначения, а не просто повторение миль ().
Поскольку все три конечных пункта назначения будут иметь разные расстояния, я должен написать три отдельные функции мили? Есть ли способ сделать так, чтобы в зависимости от выбранного направления мили () пробегали разные конечные точки?
Извините, если это не имеет смысла... Я все еще учусь, и я не знаю, как полностью объяснить, что я пытаюсь донести.
3 ответа
Вы можете сохранить количество миль, которое нужно пройти в каждом направлении, и затем проверить его, чтобы узнать, прошел ли пользователь достаточно далеко:
distances = {
'right': 7,
'left': 17,
'forward': 4
}
direction_choice = raw_input("> ")
miles_choice = raw_input("> ")
if how_much >= distances['direction_choice']:
right_dest()
elif how_much < distances['direction_choice']:
turn()
else:
print "You can't just stand here..."
miles()
Обязательно правильно проверите и приведите пользовательский ввод, который я не рассмотрел. Удачи!
@ Вопрос #1: Я использовал переменные-интерны класса. Возможно, они понадобятся вам для дальнейших частей программирования, и вы должны обнулить их, когда закончите в одном направлении, чтобы начать с нуля для следующего шага / уровня.
@ Вопрос #2: словари - лучший способ сделать это,self.dest
, параметр pos
используется в качестве ключа для получения значения из словаря.
class MyGame:
def __init__(self):
self.current_miles = 0
self.dest = {'Left' : 10, 'Into the jungle' : 7, 'Right' : 22}
def miles(self,pos):
print "How many miles do you walk?"
miles_choice = raw_input("> ")
self.current_miles += int(miles_choice)
if self.current_miles >= self.dest.get(pos):
self.miles("Right")
elif self.current_miles < self.dest.get(pos):
print "you went "+ str(self.current_miles) + " miles"
else:
print "You can't just stand here..."
self.miles(pos)
mg = MyGame()
mg.miles('Into the jungle')
Я не полностью понимаю требования (предполагаемое поведение и ограничения). Тем не менее, вы можете рассмотреть возможность передачи параметра в вашу функцию (через и аргумент), чтобы передать максимальное количество миль, которое может пройти игра в этом направлении).
Например:
#!/usr/bin/env python
# ...
def miles(max_miles=10):
print "How many miles do you walk?"
while True:
miles_choice = raw_input("> ")
try:
how_much = int(miles_choice)
except ValueError, e:
print >> sys.stderr, "That wasn't a valid entry: %s" % e
continue
if max_miles > how_much > 0:
break
else:
print "That's either too far or makes no sense"
return how_much
... в этом случае вы передаете максимальное допустимое количество миль в функцию через аргумент "max_miles" и возвращаете верное целое число (от 1 до max_miles).
Это будет обязанность вызывающей стороны этой функции, чтобы затем вызвать right_dest()
или же turn()
по мере необходимости.
Обратите внимание, что я удалил ваш рекурсивный вызов miles()
и заменить его на while True:
петля, вокруг try: ... except ValueError: ...
цикл проверки. Это более уместно, чем рекурсия в этом случае. Код делает break
вне цикла, когда значение how_much является действительным.
(Кстати, если вы позвоните miles()
без параметра тогда аргумент будет установлен в 10 согласно функции "аргумента по умолчанию". Это необычно для Python (и Ruby) ... но в основном делает аргумент необязательным для случаев, когда есть разумное значение по умолчанию).