턴 기반 거리 기반 전략 게임에서 가능한 이동 범위를 결정하는 방법은 무엇입니까?


11

c ++ 및 SFML-2.0을 사용하여 2 차원의 턴제 전략 게임을 만들고 있습니다. 움직임은 격자 기반이 아닌 거리 기반이며, 주어진 차례에 각각 제자리에서 회전하거나 앞으로 이동할 수있는 여러 개의 삼각형 모양 조각이 있습니다.

이동은 플레이어가 피스를 이동할 위치를 선택하여 피스의 잠재적 경로를 생성하는 방식으로 작동합니다. 플레이어가 자신의 결정을 확인하면 작품은 해당 경로를 따라 원하는 위치로 이동합니다. 경로는 거리, 조각이 얼마나 멀리 갈 수 있는지, 회전을 고려하여 두 가지 요소에 의해 제한됩니다. 및 조향각, 피스가 움직일 때 (예를 들어, -30 내지 30도) 임의의 (및 모든) 지점에서 회전 할 수있는 거리.

제 질문은 플레이어가 조각을 옮기도록 선택할 수있는 잠재적 위치 범위를 어떻게 결정해야합니까?

여기서 사용할 방정식 및 / 또는 알고리즘이 확실하지 않습니다. 내 원래 계획은 설명하기는 물론 구현하기가 거의 불가능한 시점까지 매우 복잡해졌으며,이 시점에서 프로젝트가 중단되면서 완전히 사라졌습니다.

회전 반경을 고려하여 유닛이 이동할 수있는 범위를 어떻게 확인할 수 있습니까?

예를 들어 아래 이미지에서. 빨강, 파랑 및 녹색 선은 모두 같은 길이입니다. 자주색 원은 유닛이 움직일 수있는 이동 범위를 나타냅니다. (모양이 부정확하고 선이 실제로 같은 길이 가 아닐 수도 있지만 아이디어를 얻습니다.)

여기에 이미지 설명을 입력하십시오


여전히 동일한 (총) 거리를 움직일 수 있습니다. 질문은 "어떻게 멀리 차례합니까?"알아내는 대해 정말 그래서 / "얼마나 그것을 설정해야합니까?"/ " 어디 가 설정해야합니까?". 규칙적인 경로를 결정하는 것부터 시작한 다음 특정 양을 초과하는 각도에 대해 회전 시작 단계를 다시 시작해야합니다. 최종 거리는 곡선보다 직선 경로 (최신 경로)에서 더 길어집니다.
Clockwork-Muse

예, 이동 거리가 주요 제한 요소입니다. 여기서 가장 큰 장애물은 거리가 남아있는 한 조각이 돌릴 수 있고 돌릴 수 있다는 점을 고려해야한다는 것입니다.
sfphilli

유닛이 움직일 수있는 범위는 무엇을 의미합니까? 당신은 그것이 이동할 수있는 지점을 의미합니까? 선형 대수 (벡터)에 어느 정도 익숙하십니까?
BlueRaja-대니 Pflughoeft

1
어떤 실제 시나리오를 모델링하려고합니까? 요구 사항에 대한 모호한 문제점으로 인해 너무 많은 솔루션 접근 방식이 제안되고 있습니다. 이 영역의 모든 특정 문제에 대해 (가상적으로) 잘 알려진 접근 방법이 있지만 모든 사람들이 당신이 실제로 다루고있는 이러한 많은 문제 중 어느 것을 추측하고 있습니다.
Pieter Geerkens

1
@PieterGeerkens OP가 코드를 요청하지 않기 때문에 알고리즘을 요청한다고 가정합니다. 알고리즘이 합리적으로 생각할 수있는 시나리오에 대한 충분한 세부 사항을 제공했습니다. 이것은 일반적이며 수용 가능합니다.
MichaelHouse

답변:


4

Dijsktra를 사용하여 흐름 또는 거리 필드를 생성하십시오.

기본적으로 대상이없는 Dijkstra 알고리즘을 사용하여 그리드를 채우십시오 (아마도 다른 이름입니다. 모름). 각 열린 노드를 가져 와서 도달 가능한 이웃을 계산하고, 열린 목록에서 푸시하고, 닫힌 목록에서 설정하고, 부모 노드의 "다음"경로를 적절하게 업데이트하십시오.

결과적으로 이제 시작으로 돌아가는 방법에 대한 모든 노드의 네트워크가 생깁니다. 도달 할 수없는 노드는 첫 번째 단계에서 건드리지 않았습니다. 도달 할 수있는 노드에는 "부모에 대한 최상의 경로를 따라 다음 노드"요소가 계산되므로 모든 노드를 강조 표시 한 다음이 정보를 사용하여 사용자가 강조 표시된 영역을 마우스로 가리 키거나 클릭 할 때 이동 경로를 표시하거나 실행할 수 있습니다.


개념을 설명하는 방법이나 구현 방법이 아니라 올바른 접근 방식입니다.
Pieter Geerkens

알고리즘에 대한 나의 이해는 노드 순회가 경로 독립적이어야한다는 것입니다. 따라서이 작업을 수행하려면 대면 전용의 다른 자유도 (노드를 작성하는 다른 축)를 추가해야합니다. 다시 말해, 서로 다른 X, Y, 잠재적으로 Z 및 페이싱의 각 조합에 대한 노드가 있습니다. 그렇지 않으면, 노드에 들어가기위한 최단 경로를 찾는 것이 노드를 떠날 때 다른면을 구별하지 않습니다. 그 맞습니까? 이 경우이 방법이 너무 집중적입니까?
TASagent

@ TASagent : 좋은 지적, 나는 그것을 통해 완전히 생각하지 않았습니다. 그러면 알고리즘이 약간 꺼져있을 수 있지만 접근 방식이 작동합니다.
Sean Middleditch

@PieterGeerkens : 나는 그것이 나쁜 설명이라는 데 동의합니다. 당신은 그것을 더 잘 설명하는 자신의 대답을해야합니다.
Sean Middleditch

이것은 내가 필요한 것에 아주 가깝게 보이지만, 그 알고리즘에 대해 들어 본 적이 없다는 것을 인정해야하므로 필요한 알고리즘을 일반화하는 방법을 모릅니다. 좋은 정보 나 튜토리얼로 연결되는 링크가 있습니까?
sfphilli

4

무차별 대입 솔루션은 다음과 같습니다.

  1. 단위를 중심으로하여 단위 주위에 꼭짓점을 만듭니다. 원의 반경은 최대 이동 거리입니다. 정점의 밀도는 최종 결과를 원하는 정도에 따라 달라질 수 있습니다.
  2. 각 정점 위치에 대해 해당 위치를 향한 유닛 스티어링의 움직임을 시뮬레이션합니다. 이 작업은 렌더링없이 타이트한 루프로 수행됩니다.
  3. 조향 시뮬레이션에서 최대 거리에 도달하면 정점을 시뮬레이션 된 장치의 지점으로 이동합니다. 이 지점은 현재 턴이 끝나기 전에 장치가 해당 정점에 가장 근접 할 수있는 지점입니다. 이는 실제 움직임의 크기로 원을 축소시키는 효과가 있습니다.
  4. 단위를 중심으로 한 정점과 함께 해당 정점을 사용하여 렌더링 가능한 원을 만들어 가능한 이동 거리를 그립니다.

여기에 이미지 설명을 입력하십시오

따라서 파란색 원으로 시작하여 경로를 처리하고 자주색 원으로 끝납니다. 그런 다음 해당 점을 장치의 중심점과 함께 사용하여 모양을 표시하는 데 필요한 빨간색 삼각형을 만들 수 있습니다. (그 이미지를 만들어서 그 모양이 정확하지 않다는 것을 알 수 있지만 실제로 무엇이 정확한지 보는 것은 흥미로울 것입니다)


3

Sean의 솔루션을 처음에 제안한 것과 다른 접근 방식을 나타내는 별도의 답변으로 확장하려고합니다.

이 솔루션은 아마도 가장 접근하기 쉬운 방법 일 것입니다. 환경을 노드로 분할해야합니다. 예, 이것은 그리드 기반 접근 방식을 다시 도입하고 있지만 비교적 정교하게 만들거나 노드 내에서보다 정밀한 위치 지정을 통해 광범위한 경로를 찾는 데 사용할 수 있습니다. 노드 구조가 거칠수록 경로 찾기가 더 빠릅니다.

여기서 가장 큰 문제는 실제로 선박을 처리하고 있기 때문에 많은 기존의 길 찾기 솔루션을 수정없이 사용할 수 없다는 것입니다. 이들은 일반적으로 경로에 상관없이 사용하는 노드에 어떻게 신경 쓰지 않기 때문에 가속, 감속 및 회전이 즉각적이고 자유로울 때 잘 작동합니다. 불행하게도 선회는 자유롭지 않습니다. 그러나이 단순화 과정에서 삭제되는 추가 정보가 실제로 있으므로 다른 변수로 인코딩 할 수 있습니다. 물리학에서는 이것을 위상 공간이라고합니다.

2 차원을 가정하면 3을 외삽 할 수 있습니다.

일반적으로 허용 가능한 개별 좌표 위치마다 하나의 노드가 필요합니다. 예를 들면 다음과 같습니다.

(0,0) - (1,0) - (2,0)
  | \  /  |  \  / |
(0,1) - (1,1) - (2,1)

기타 인접 지점의 노드 그래프를 구성하고 공간 인접성으로 연결합니다. 그런 다음 Dijkstra의 알고리즘을 사용하여 탐색되지 않은 살아있는 노드가 탐색 노드에 연결된 상태로 남아 있지 않을 때까지 턴에 허용 된 이동 값을 초과하는 노드를 제거합니다. 각 노드는 도달하는 데 필요한 최소 거리를 추적합니다.

회전과 함께 사용할 수 있도록이 방법을 확장하려면이 같은 노드 그래프를 3 차원으로 상상해보십시오. Z 방향은 회전 / 방향에 해당하며 주기적입니다. 즉, + Z 방향으로 계속 이동하면 시작 위치로 돌아갑니다. 이제 인접한 위치에 해당하는 노드는 해당 방향에 해당하는 대면을 통해서만 연결됩니다. 평소처럼 이미 탐색 된 노드에 연결된 노드를 반복합니다. 이 체계에서는 N, NE, E, SE, S, SW, W, NW로 제한하는 것이 좋습니다.

이 솔루션은 접근 가능한 모든 공간 영역뿐만 아니라 도달 할 수있는 최상의 경로, 도착할 때 회전 횟수 및 도착할 때 가질 수있는 모든 방향을 알려줍니다.

그런 다음 실제로 경로를 실행할 때 좀 더 정통하게 보이도록 보간 / 큐빅 스플라인을 자유롭게 수행 할 수 있습니다.


1
이것은 우수하다. 게임에서 알고리즘에 대해 약간의 연구를 수행하고 실험 해 볼 필요가 있지만, 특히 게임의 다른 중요한 부분으로 일반화 할 수 있기 때문에 이것이 완벽하게 맞습니다.
sfphilli

1

이동 중 작동을 정확히 원하는 방식을 먼저 결정해야 할 수도 있습니다. 다음과 같은 옵션 :

  • 원뿔 안에서 움직이면 먼저 회전 한 다음 움직이기 시작하십시오. 이는 구현 및 경로 지정이 더 쉬운 솔루션입니다. 또한 덜 흥미로워 서 사용하고 싶지 않습니다.

  • 최대 45도까지 움직이는 동안 연속 회전. 이것은 훨씬 까다 롭고 희망적으로 당신이 따르는 것입니다. 고정 된 타임 스텝을 사용하여 경로를 수치 적으로 통합하는 것이 아마도 가장 쉬운 방법 일 것입니다. 원뿔은 최대 (단계마다 + X도) 및 최소 (단계마다 -X도) 선회로 제한됩니다.

이러한 두 번째 요구 사항으로 공간을 통과하는 가장 좋은 방법은 주로 이동할 환경에 따라 다릅니다. 이동해야하는 장애물이 많으면 상황이 까다로워지고 비용이 많이들 수 있습니다. 그러나 그렇지 않은 경우 회전을 프런트로드 (및 테이퍼 오프)하여 원하는 위치로 끝날 수 있습니다.

귀하가 질문 한 주제에 대해서만 부분적으로 다루었을 수도 있으므로 의견에 자유롭게 추가하여 토론을 확장 할 수 있습니다.


가장 확실한 것은 두 번째 옵션을 사용하고 싶을 것입니다. 조각보다 큰 장애물도 있습니다 (거대한 바위를 생각하십시오). 내가 처음에 생각했던 방식은 가능한 끝점의 원뿔을 생성 한 다음 각 끝점에 대해 새로운 원뿔을 생성하는 것입니다. 가능한 최대 거리에 도달 할 때까지 가능한 모든 위치에 대해 계속 진행하십시오. 즉, 미친 복잡한 문제없이 이것을 구현하는 방법을 완전히 확신하지 못합니다.
sfphilli

흠, 일부 세부 사항에 대해 조금 불분명 한 것 같습니다. 질문을 되돌아 보면 '턴 기반 (turn-based)'을 지정하고 유닛이 턴에서 '회전하거나 이동할 수 있습니다'라는 것을 알 수 있습니다. 그렇다면 플레이어가 자신의 행동을 여러 차례 미리 플롯하고 이동 중에 길 찾기를 원한다는 것을 의미합니까? 움직임이 어떻게 작동해야하는지에 대한 추가 설명이 도움이 될 것입니다.
TASagent

아니, 내가 의미 한 바는 주어진 턴에 플레이어가 원하는만큼 제자리를 회전하거나 이미보고있는 방향으로 움직일 수 있다는 것이었다. 이동하면 경로를 따라 특정 거리를 이동할 수 있으며 이동하는 동안 특정 각도 (예 : -45 ~ 45도)까지 회전하거나 조향 할 수 있습니다. 따라서 선택한 경로가 왼쪽 또는 오른쪽으로 이동하기 위해 곡선을 포함한다고 상상해보십시오. 경로는 플레이어가 결정하기 어려운 가능한 포인트 범위 내에서 이동하려는 포인트를 선택함으로써 결정됩니다.
sfphilli

실제로 불행히도 원하는 특성은 위에서 언급 한 Dijkstra 알고리즘에 대해 너무 제한적일 수 있습니다. 혹시. 나중에 집에 도착했을 때 이것에 대해 몇 가지를 스케치하겠습니다.
TASagent

수집 한 정보 중 일부를 편집하여 문제를 원래 질문으로 명확히 할 수 있으므로 나중에 오는 사람들이 추가 정보로 시작할 수 있습니다.
TASagent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.