2013-04-09 2 views
2
def getMove(win,playerX,playerY): 

    #Define variables. 
    movePos = 75 
    moveNeg = -75 
    running = 1 

    #Run while loop constantly to update mouse's coordinates. 
    while(running): 

     mouseCoord = win.getMouse() 
     mouseX = mouseCoord.getX() 
     mouseY = mouseCoord.getY() 
     print "Mouse X = ", mouseX 
     print "Mouse Y = ", mouseY 

     if mouseX >= playerX: 
      playerX = movePos + playerX 
      running = 0 
     elif mouseX <= playerX: 
      playerX = moveNeg + playerX   
      running = 0 
     elif mouseY >= playerY: 
      playerY = movePos + playerY    
      running = 0 
     elif mouseY <= playerY: 
      playerY = moveNeg + playerY    
      running = 0 
    return playerX,playerY 

def main(): 

    #Create game window. 
    win = GraphWin("Python Game", 500, 500) 
    drawBoard(win) 

    #Define variables. 
    playerX = 75 
    playerY = 125 
    keyX = 325 
    keyY = 375 
    running = 1 


    #Create Key and Player objects, draw the key, but don't draw the player yet. 
    key = Text(Point(keyX,keyY),"KEY") 
    key.draw(win) 

    while(running): 
     print "player X = ", playerX 
     print "Player Y = ", playerY 
     drawBoard(win) 
     getMove(win,playerX,playerY) 
     player = Circle(Point(playerX,playerY),22) 
     player.setFill('yellow') 
     player.draw(win) 
main() 

Я использую графическую библиотеку для создания игры. Мой игрок и ключ отображаются в правильных местах. Однако при вызове функции getMove мой проигрывательX и playerY не обновляются. Я добавил отладочные заявления печати, чтобы найти их значения во время игры, и это всегда 75 и 125. Помогите!Моя функция python не вернет или не обновит значение

ответ

8

В python целые числа являются неизменяемыми - когда вы назначаете новое целочисленное значение переменной, вы просто указываете переменную на новое целое число, не изменяя значение старого целого, на которое оно указывало значение.

(Пример изменяемого объекта в Python список, который вы можете изменить и все переменные, указывающие на этот список заметит изменения. - так как список изменился)

Точно так же, когда вы передаете переменную в метод в python, а затем изменить то, что указывает переменная в этом методе, вы не изменяете то, что переменная указывает на внешний вид этого метода, потому что это новая переменная.

Чтобы это исправить, присвоенный возвращаемый PlayerX, playerY ваших переменных за пределами метода:

playerX, playerY = getMove(win,playerX,playerY)

1

Вы должны явно передать эти переменные при вызове getMove():

playerX, playerY = getMove(win, playerX, playerY) 

Надеется, что это помогает!

0

Как уже упоминалось выше, решение в том, что вы не используете возвращаемые значения для обновления вашего playerX, playerY, которая может быть установлена ​​с упомянутой

playerX, playerY = getMove(win,playerX,playerY) 

То, что я хочу обратиться логика в ваших if заявления. То, как вы построили свои операторы if, приведет только к обновлению X OR Y, а не к обоим. Например, если mouseX, mouseY были больше, чем , то вы попали бы в первую строку своего оператора if и оценивали бы как True и обновили playerX соответственно, НО, поскольку первый оператор был выполнен, ни один из остальных elif будут выполняться операторы, что приведет к обновлению только переменной playerX.

Что вы хотите сделать, так это разделить оператор if на два отдельных оператора (один для X и один для Y), так что регулировки X, Y не зависят друг от друга. Нечто похожее на

if mouseX >= playerX: 
     playerX = movePos + playerX 
     running = 0 
    elif mouseX <= playerX: 
     playerX = moveNeg + playerX   
     running = 0 

    #By having the second if, it allows you to check Y even if X has changed 
    if mouseY >= playerY: 
     playerY = movePos + playerY    
     running = 0 
    elif mouseY <= playerY: 
     playerY = moveNeg + playerY    
     running = 0