2013-02-13 3 views
2

파이썬에서 모노 폴리을 쓰기로 결정했지만 플레이어 위치를 업데이트하는 데 문제가 있습니다. 나는 for 루프를 작성하여 플레이어를 반복하고 각 주사위를 굴린 다음 위치를 업데이트합니다. 문제는 위치 변수가 최신 위치를 유지하지 못하고 for 루프가 시작될 때 0으로 재설정을 계속 유지한다는 것입니다. 여기에 내 코드입니다 : 필요한 경우파이썬 - For 루프에서 변수 업데이트

player1location = 0 

def turn(numberPlayers, player, player1location, Board): 
    for player in range(numberPlayers): 
     player = 'Player'+str(player+1) 
     print 'It\'s', player, 'turn!' 
     print player1location 
     rollDice = raw_input('Press Enter to roll the dice!') 
     diceRoll = random.randint(1,6) 
     print player, 'rolled a', diceRoll 
     player1location = player1location + diceRoll 
     print 'You landed on', player1location 
     print '\n' 

while True: 
    turn(numberPlayers, player, player1location, Board) 

내가 코드의 자세한 내용을 제공 할 수 있습니다,하지만 난이 선수의 위치를 ​​제어 모든 생각합니다. 감사!

EDIT : 그래서 분명히 전역 변수 대신 로컬 변수가 변경됩니다. 대신 전역 변수를 어떻게 변경합니까?

+0

루프 내에서 전역 'player1location'을 사용하고있는 동안 함수를 변경하면 범위를 종료 할 때 버려지는 로컬 변수가 변경됩니다. – geoffspear

+0

전역 변수를 사용할 때'global' 키워드를 사용해야할까요? – gustavodidomenico

+0

(왜, 플레이어 1 명을 추적하고 게임에서 각 플레이어를 이동시키는 것입니까?) – geoffspear

답변

8

업데이트 할 대상 변수와 동일한 이름의 함수 매개 변수가 있습니다. 이로 인해 모든 변경 사항이 전역 변수가 아닌 function 매개 변수에 적용됩니다. function이 함수에 전달할 매개 변수의 로컬 범위를 만들기 때문입니다. 따라서, 전역 적으로 동일한 이름으로 정의 된 변수를 능가합니다.

따라서 함수 매개 변수의 이름을 player1location 또는 전역 변수의 이름으로 변경하십시오. player1location = 0, 그리고 두 번째는 당신이 당신의 함수를 호출 로컬마다 만들어집니다 : - 당신이 player1location라는 두 변수를 가질

+0

나는 당신이 의미하는 것을 정말로 이해하지 못합니다. 변수의 이름을 변경하려고 시도했지만 여전히 작동하지 않습니다. 변수가 지역 변수이고 전역 변수라는 것을 알려줍니다. – emagdnim

+0

@emagdnim. 그 오류는 어디서 났니? 아! 전역 변수를 사용하려면'global lplayer1location'을 사용해야합니다. –

+0

@emagdnim. 글로벌 변수를 전혀 사용하지 않는 것이 좋습니다.변경된 부분을 로컬 변수에 반환하고 while 루프의 반환 값을 외부에 정의 된 변수에 저장합니다. –

1

참고 하나 (모든 기능 이외의) 첫 번째 줄에 전 세계적으로 을 정의 def turn(numberPlayers, player, player1location, Board)을. 같은 이름을 가지고 있긴하지만, 이들은 파이썬에서 두 개의 별개의 변수입니다. 왜냐하면 그것들은 different scopes에 정의되어 있기 때문입니다.

이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

함수 정의에서 player1location을 제거하면 항상 전역 유효 변수가 변경됩니다. 그러나 네이밍 규칙에서 다른 플레이어의 기능을 재사용하고 싶다고 생각합니다. (여전히해볼 수는 없지만 어떻게 작동하는지 이해하는 데 도움이됩니다.)

더 좋은 방법은 함수 끝에 새로운 플레이어 위치 (return player1location)를 반환 한 다음 반환 할 때 전역 범위의 위치에 할당하는 것입니다 (player1location = turn(numberPlayers, player, player1location, Board)).

+0

"함수 정의에서 player1location을 제거 할 수 있습니까?" – emagdnim

+0

이렇게 :'def turn (numberPlayers, player, Board)'. 그런 다음 함수를 다음과 같이 호출합니다 :'turn (numberPlayers, player, Board)'. 그러면 파이썬은 전역 범위에서'player1location'을 가져올 수 있어야합니다. – Hannele

+0

아, 알겠습니다! 감사! – emagdnim

관련 문제