2010-04-30 1 views
0

먼저 무엇을 하려는지 설명해야합니다.Python - 2 질문 : 함수에서 변수를 편집하고 런타임 중에 else 문의 순서를 내부적으로 변경하면

나는 던전 크롤러와 같은 게임을 만들고 있는데, 컴퓨터 캐릭터/몬스터의 움직임을 맵에 프로그래밍하려고합니다. 지도는 기본적으로 데카르트 좌표계입니다. 문자의 위치는 x 및 y 값의 튜플 (x, y)로 나타냅니다. 게임은 차례대로 작동하며, 차례대로 캐릭터는 위, 아래, 왼쪽 또는 오른쪽으로 1 칸 이동할 수 있습니다. 저는 캐릭터가 단순히 턴 단위로 차례를 결정할 수있는 매우 간단한 이동 시스템을 만들고 있습니다. 본질적으로 '건망증'운동 시스템.

내가 뭘하려는거야 무엇의 기본 흐름도 :

  1. 찾기 방향을 대상
  2. 으로 운동의 우선 순위 목록을 만드는 방향 등을 사용하여 수행 할 수 있습니다 ('R', '. u ','d ','l ')은 먼저 오른쪽으로 이동 한 다음 위로 이동 한 다음 이동 한 다음 왼쪽으로 이동하려고합니다.
  3. 우선 순위에 따라 각각의 가능성을 시도하십시오. 첫 번째 이동이 실패하면 (장애물 등으로 막힘) 첫 번째 이동이 성공할 때까지 연속적으로 시도한 다음 중지합니다. 3 단계에서

, 내가 할 노력하고있어 방법은 다음과 같은 경우 : 경우/다른 블록에서

def move(direction,location): 
    try: 
     -snip- # Tries to move, raises the exception Movementerror if cannot move in the direction 
     return 1 # Indicates movement successful 
    except Movementerror: 
     return 0 # Indicates movement unsuccessful (thus character has not moved yet) 

prioritylist = ('r','u','d','l') 
if move('r',location): pass 
elif move('u',location): pass 
elif move('d',location): pass 
elif move('l',location): pass 
else: pass 

, 우선 순위 목록에서 우선 순위의 첫 번째 움직임을 시도 할 것이다 프로그램 . 이동 기능에서 캐릭터는 움직이려합니다. 문자가 막히지 않고 움직이지 않으면 1을 반환하고 멈출 곳으로갑니다. 문자가 차단되면 0을 반환하고 다음 동작을 시도합니다.

그러나, 이것은이 문제가 발생합니다

1.How 나는, 함수 자체 내부 함수에 전달 변수를 수정합니까 편집이 성공하면 반환 동안?

변수의 값을 실제로 변경하지 않으므로 함수 내부의 변수를 편집 할 수 없다는 말을 들었습니다. 원래 변수가 변경되지 않은 상태에서 함수 내부의 변수가 다른 것을 참조하게 만듭니다. . 따라서 해결 방법은 값을 반환 한 다음 반환 된 값에 변수를 할당하는 것입니다. 그러나이 편집이 성공했는지 여부를 나타내는 다른 값을 반환하려면이 변수를 함수 자체에서 편집하고 싶습니다. 어떻게해야합니까?

2. 우선 순위 목록의 순서를 따르기 위해 if/else 문의 순서를 변경하려면 어떻게해야합니까? 우선 순위 목록이 변경되어 시도 할 때 다른 순서의 동작이 발생할 수 있으므로 런타임 중에 변경할 수 있어야합니다.

답변

3

재 2. 나는 간단한 루프에 상대적으로 큰 경우/ELIF 트리를 변경합니다 :

prioritylist = ('r','u','d','l') 
for direction in prioritylist: 
    if move(direction, location): break 

당신이 대각선 단계 또는 무엇이든을 허용 할 경우 미래에 확장 할 쉽게, 적은 반복적 - 자동은 당신의 코드 자체를 변경할 필요없이,에서의 어떤 위해 "우선 순위 목록을 다음과".

def move(direction,location): 
    try: 
     -snip- 
     return True, newlocation 
    except Movementerror: 
     return False, location 

당신은 다음에 위의 루프, 예를 들면 바꿀 것 :

1. 다시, 당신은 함수에서 여러 값을 반환 할 수있는 다른

prioritylist = ('r','u','d','l') 
for direction in prioritylist: 
    success, newlocation = move(direction, location) 
    if success: break 

: 를 newLocation을 = 위치

forelse 브랜치를 사용하면에 break이 없으면 실행됩니다., 시도가 성공을 거두지 못한 경우를 처리합니다.

0

당신은에 대한 루프를 사용하고, 최초의 성공적인 선택에 따라 루프의 탈옥 수 있습니다 : 그것은을 만들면서, 대신 1 또는 0 (A)의,

for option in prioritylist: 
    if move(option,location): # succeeded 
     break 

또한 FalseTrue 반환하거나한다 의도가 명확하다.

매개 변수를 편집하지 않는다는 진술은 완전히 사실이 아닙니다 ... 매개 변수 자체는 편집 할 수 없지만 변경 가능한 개체라고 가정하면 매개 변수의 내용을 편집 할 수 있습니다.당신이 사용하는 튜플은 불변 때문에 수정할 수 없습니다 수 있지만 목록을 수정할 수 있습니다 :

positions = ['N','S','E','W'] 

def mutate_list(p): 
    p.reverse() 

print positions # prints ['N', 'S', 'E', 'W'] 
mutate_list(positions) 
print positions # prints ['w', 'E', 'S', 'N'] 
관련 문제