Python начинающий, текстовая игра

Я довольно новичок в программировании игры; Я 3/4 пути через Learn Python the Hard Way и у меня возник вопрос о небольшой текстовой игре, которую я сделал... Так что в этой игре мой guy находится на необитаемом острове, и у вас есть возможность (необработанный ввод) leftright или же 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() 

Итак, вот два вопроса:

  1. Как бы мне было сделать так, чтобы, если пользователь изначально вводил число миль меньше, чем расстояние до пункта назначения, и ввод второй мили + ввод первой мили == количество миль до пункта назначения, он будет добавлять входы и запускать мой функция назначения, а не просто повторение миль ().

  2. Поскольку все три конечных пункта назначения будут иметь разные расстояния, я должен написать три отдельные функции мили? Есть ли способ сделать так, чтобы в зависимости от выбранного направления мили () пробегали разные конечные точки?

Извините, если это не имеет смысла... Я все еще учусь, и я не знаю, как полностью объяснить, что я пытаюсь донести.

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) ... но в основном делает аргумент необязательным для случаев, когда есть разумное значение по умолчанию).

Другие вопросы по тегам