2013-11-29 4 views
0

Так я работаю над игрой, а вот мой текущий код, который работает отлично:Как обновить 'x' правильно?

print("Type directions() to see commands") 

def directions() : 

    print("Type North, East, South or West to move") 
    move = input("North, East, South or West? ") 
    if move == "North": 
    north() 
    elif move == "East": 
    east() 
    elif move == "South": 
    south() 
    elif move == "West": 
    west() 


def north(): 
    print("You moved North") 
    x=0 
    x=(x+1) 
    print("You are at co-ordinates", x, "x:0 y") 

Однако, я знаю, что позже будет проблема, так как х будет сброшена для каждого направления. При вводе x=0 в верхней части кода и его удаления из def north() части, при выполнении кода, Python дает мне ошибку:

'UnboundLocalError: local variable 'x' referenced before assignment'

Как я могу закодировать это так, что «х» 0, чтобы начать с , но могут быть изменены def функциями?

+0

Вы можете сделать '' 'x''' global. – turnt

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-created-them) для одного способа сделать используя глобальные переменные. –

ответ

1

Вы можете сделать одну из двух вещей: либо использовать глобальную переменную (которую следует избегать в большинстве случаев), либо использовать возвращаемые значения. Глобальный метод:

x=0 
. 
. 
def directions(): 
    . 
    . 
def north(): 
    global x 
    x=x+1 
    print("moved north...") 

или возвращаемое значение:

def directions(): 
    current_location = 0 
    . 
    . 
    if move == "North": 
     current_location = North(current_location) 
    . 
    . 
def North(location): 
    print("moved north...") 
    return location+1 

Судя по вашему вопросу и существовании y, вы можете сделать следующее:

def directions(): 
. 
. 
    if move == "North": 
     (x,y) = North(x,y) 
. 
. 
def North(x,y): 
    return (x+1,y) 
def East(x,y): 
    return (x,y+1) 
def South(x,y): 
    return (x-1,y) 
+0

Работал отлично, спасибо большое! – user2990213

0

вдоль линий из того, что предложил Cygwinnian, делая x, глобальная переменная устранит проблему. Это означает, что одна и та же переменная x доступна из всех функций, которые объявляют global x, прежде чем они используют x.

Чтобы исправить ошибку:

x = 0 

print("Type directions() to see commands") 

def directions() : 
    print("Type North, East, South or West to move") 
    move = input("North, East, South or West? ") 
    if move == "North": 
    north() 
    elif move == "East": 
    east() 
    elif move == "South": 
    south() 
    elif move == "West": 
    west() 


def north(): 
    global x 
    print("You moved North") 
    x=(x+1) 
    print("You are at co-ordinates", x, "x:0 y") 
+0

Мне удалось заставить его работать с комментарием Micromoses, но спасибо за помощь :) – user2990213

1

Некоторые советы (не исчерпывающий, но достаточно для начала):

Во-первых, использовать глобальный словарь для направлений:

def north(x): 
    return x+1 

directions = {'North': north, 'East': east, 'South': south, 'West': west} 
def move(x) : 
    global directions 
    print("Type North, East, South or West to move") 
    move_choice = input("North, East, South or West? ") 
    # modify lambda to your logic to handle incorrect inputs 
    x = directions.get(move, lambda y:y)(x) 
    repr(x) 
    return x 

и если вам нужен функциональный подход (в отличие от ООП), ваши функции должны принимать некоторые аргументы:

def north(x): 
    return x+1 

Не смешивать логику и представление, таким образом, вы должны будете скопировать много кода:

def repr(x): 
    print("You are at co-ordinates {} x:0 y".format(x)) 

и объединить их в main рутина:

def main(): 
    x = 0 
    while True: # modify to be able to terminate this loop 
     x = move(x) 
+0

Мне удалось заставить его работать с комментарием Micromoses, но спасибо за помощь :) – user2990213