2012-11-08 1 views
1

타일 기반 게임을하고 있습니다. 내 캐릭터가 x, y 좌표 및 이동 한도를 기준으로 이동할 수있는 배열을 반환하는 메서드를 만들려고합니다. 예를 들어타일 이동 범위가 패턴을 생성합니까?

, 만약 입력 currentPosition (3,3) moveLimit : 1 다음

그것을()() ((3,4 3,2 3,2 내놔한다) (4,3))

하고 만약 입력 currentPosition (3,3) moveLimit 2

그때는()() ((3,2 2,2 3,1을 백업한다), (4,2), (1,3), (2,3), (4,3), (5,3), (2,4), (3,4), (4,4), (3 , 5))

x와 y 모두에서 -1과 +1을 모두 가능하게하여 재귀 적 방법을 사용할 계획입니다. +1과 -1, -1과 비교하여 -1과 같이 많은 반복 사례가 발생할 수 있기 때문에 매우 비효율적입니다.

누구에게도 좋은 패턴이 있는지 알고 있습니까?

고맙습니다.

답변

1

하자 먼저 공식적으로 찾고있는 질문 무엇을 정의합니다. 이 의미

f((x,y),k) = { (a,b) | abs(x-a) + abs(y-b) <= k } 

, 모든 점 세트 (A, B) 등이 :

: 당신이 할 수있는

이제

은, 모든 관련 요소를 얻기 위해 (거리 제한이있다) abs(x-a) + abs(y-b) <= k

moves((x,y),k): 
    for i=0 to k+1: //number of steps in the x axis, some number between 0 to k inclusive 
    //number of steps in the y axis, some number between 0 to k-i inclusive: 
    for j=0 to k-i+1: 
     if (x-i,y-j) is in range: output (x-i,y-j) 
     if (x+i,y-j) is in range: output (x+i,y-j) 
     if (x-i,y+j) is in range: output (x-i,y+j) 
     if (x+i,y+j) is in range: output (x+i,y+j) 

참고 : 모두 승 axises에 가능한 모든 단계를 확인하기 때문에이 조건을 보장

  1. ith 한계점 abs(a-x) + abs(b-x) <= k
  2. 여기에 "범위 내에 있습니다"는 온 전성 검사입니다. 바운드가되지 않도록하십시오 (예 : 양수 값을 얻으려는 경우 -1의 x 값 가져 오기). 만.
+0

고맙습니다 ^^ 이제는 계속 진행할 수 있습니다 : D –

+0

이것은 ((3,2), (2,3), (3,4), (4,3) * 및 (3,3) *). – Vortexfive

+0

@Vortexfive : 예상대로. 가능한 이동의 최대 개수로 "이동 제한"을 읽고 0은 포함합니다. 'i = j = 0'을 "건너 뛰는"경우가 아니면 쉽게 풀 수 있습니다. 그러나 -이 특정 사례를 특별히 점검해야하는 문제 인 경우'(3,3)'을 여러 번 (정확하게는 4 개) 출력합니다. – amit

0

(UP, LEFT, DOWN, RIGHT) 요소에서 길이가 "moveLimit"인 모든 조합을 계산 해보십시오.

예.

UUU 
UUL 
UUD 
UUR 

ULL 
ULD 
ULR 

UDD 
UDR 

URR 

LLL 
... 

이렇게하면 계산 수가 훨씬 줄어들 것입니다. 당신은 여전히 ​​동일한 위치를 초래하는 다양한 동작의 조합으로 끝날 수도 있습니다. 원점 (소스)로

넣어야의 거리 k(x,y) :