나는 팩맨에서 귀신의 인공 지능에 대한 많은 언급을 찾았지만, 팩맨이 귀신을 먹은 후 어떻게 눈이 어떻게 중심 귀신 구멍으로 돌아가는지 언급하지 않았습니다.
내 구현에서 간단하지만 끔찍한 솔루션을 구현했습니다. 나는 어느 방향으로 가야할지 구석 구석에 하드 코딩했다.
더 나은 / 또는 최고의 솔루션이 있습니까? 다른 수준의 디자인에서 작동하는 일반적인 것일 수도 있습니다.
나는 팩맨에서 귀신의 인공 지능에 대한 많은 언급을 찾았지만, 팩맨이 귀신을 먹은 후 어떻게 눈이 어떻게 중심 귀신 구멍으로 돌아가는지 언급하지 않았습니다.
내 구현에서 간단하지만 끔찍한 솔루션을 구현했습니다. 나는 어느 방향으로 가야할지 구석 구석에 하드 코딩했다.
더 나은 / 또는 최고의 솔루션이 있습니까? 다른 수준의 디자인에서 작동하는 일반적인 것일 수도 있습니다.
답변:
실제로, 나는 당신의 접근 방식이 어떤 길 찾기와 비교하여 거의 제로 실행 시간 비용을 가진 매우 멋진 솔루션이라고 말하고 싶습니다.
임의의 맵으로 일반화 해야하는 경우 경로 탐색 알고리즘을 사용할 수 있습니다-예를 들어 너비 우선 검색은 구현하기 간단합니다.이를 사용하여 게임을 실행하기 전에 각 모서리에서 인코딩 할 방향을 계산하십시오.
편집 (2010 년 8 월 11 일) : 나는 Pacman 시스템 : Pac-Man Dossier 에 대한 매우 자세한 페이지를 방금 언급했으며 여기에 허용 된 답변이 있으므로 업데이트해야한다고 생각했습니다. 이 기사는 괴물 집으로 돌아가는 행위를 명시 적으로 다루지 않는 것으로 보이지만 Pac-Man의 직접적인 길 찾기는 다음과 같은 경우입니다.
나는 이런 식으로 일반적인 레벨에 대해이 문제를 해결했다. 레벨이 시작되기 전에 몬스터 홀에서 일종의 "홍수 채우기"를한다. 벽이 아닌 미로의 모든 타일은 구멍에서 얼마나 멀리 떨어져 있는지를 나타내는 숫자를 얻습니다. 따라서 눈이 68 거리 인 타일 위에있을 때, 이웃 타일 중 67 거리가있는 타일을 찾습니다. 그렇게하는 방법입니다.
보다 전통적인 경로 찾기 알고리즘에 대한 대안으로 Pac-Man Scent Antiobject 패턴을 살펴볼 수 있습니다 (적절하게 명명 된!) .
스타트 업시 미로 주변의 괴물 구멍 냄새를 확산시켜 눈으로 집을 따라갈 수 있습니다.
냄새가 설정되면 런타임 비용이 매우 낮습니다.
편집 : 슬프게도 wikipedia 기사가 삭제되었으므로 WayBack Machine이 구조되었습니다 ...
Dijsktra 's Algorithm 또는 A * algorithm 과 같은 경로 찾기 알고리즘을 살펴보십시오 . 이것이 당신의 문제입니다 : 그래프 / 경로 문제.
작동하는 간단한 솔루션은 유지 관리 가능하고 신뢰할 수 있으며 성능이 우수합니다. 이미 좋은 해결책을 찾은 것처럼 들립니다 ...
경로 찾기 솔루션은 현재 솔루션보다 복잡 할 가능성이 높으므로 디버깅이 필요할 수 있습니다. 아마 느려질 것입니다.
IMO가 고장 나지 않았다면 고치지 마십시오.
편집하다
IMO, 미로가 고정되면 현재 솔루션 은 훌륭하고 우아한 코드입니다. "좋은"또는 "우아한"을 "영리한"과 동일시하는 실수를하지 마십시오. 간단한 코드는 "좋고"우아 할 수 있습니다.
구성 가능한 미로 레벨이있는 경우 처음 미로를 구성 할 때 경로 찾기 만 수행하면됩니다. 가장 간단한 방법은 미로 디자이너가 직접 할 수 있도록하는 것입니다. 나는 당신이 bazillion 미로를 가지고 있거나 사용자가 디자인 할 수 있다면 이것을 자동화하는 것을 귀찮게 할 것입니다.
(외부 : 경로가 수동으로 구성되면 미로 디자이너는 차선의 경로를 사용하여 레벨을 더 흥미롭게 만들 수 있습니다 ...)
원래 팩맨에서 유령은 자신의 "냄새"에 의해 노란 알약 먹는 사람을 발견했습니다. 그는지도에 흔적을 남길 것입니다. 유령은 냄새를 발견 할 때까지 무작위로 돌아 다니다가 냄새 경로를 따라 가서 플레이어. 팩맨이 움직일 때마다 "냄새 값"이 1 씩 감소합니다.
이제 전체 과정을 뒤집는 간단한 방법은지도 중앙에 가장 높은 지점을 가진 "유령 냄새의 피라미드"를 갖는 것입니다. 그러면 유령은이 냄새의 방향으로 움직입니다.
팩맨을 쫓는 데 필요한 논리가 이미 있다고 가정하면 왜 재사용하지 않습니까? 대상을 변경하십시오. 동일한 논리를 사용하여 완전히 새로운 루틴을 작성하는 것보다 훨씬 적은 작업 인 것 같습니다.
길 찾기 문제입니다. 널리 사용되는 알고리즘은 http://wiki.gamedev.net/index.php/A*를 참조 하십시오 .
각 정사각형은 중심까지의 거리 값을 가지고 있습니까? 이 방법으로 주어진 각 사각형에 대해 가능한 모든 방향으로 인접한 이웃 사각형의 값을 얻을 수 있습니다. 가장 낮은 값을 가진 사각형을 선택하고 해당 사각형으로 이동하십시오.
사용 가능한 알고리즘을 사용하여 값을 미리 계산합니다.
이것이 실제로 어떻게 작동했는지 찾을 수있는 최고의 출처였습니다.
http://gameai.com/wiki/index.php?title=Pac-Man#Respawn 유령이 죽으면 눈에 보이지 않는 눈이 시작 위치로 돌아갑니다. 이것은 유령의 대상 타일을 해당 위치로 설정하여 간단히 수행 할 수 있습니다. 탐색에는 동일한 규칙이 사용됩니다.
실제로 의미가 있습니다. 어쩌면 세계에서 가장 효율적이지는 않지만 다른 주 또는 목표를 변경하는 선을 따라 다른 것에 대해 걱정할 필요가없는 아주 좋은 방법 일 수 있습니다.
참고 사항 : 저는 그 팩맨 프로그래머가 기본적으로 메모리가 매우 작은 매우 작은 공간에서 전체 메시지 시스템을 만드는 것이 얼마나 멋진 지 알지 못했습니다.
나는 당신의 해결책이 그 문제보다 더 간단하다고 생각합니다. 유령의 눈이 벽을 통과 할 수있는 새로운 버전을보다 "현실적인"것으로 만드는 것입니다 =)
다음은 ammoQ의 플러드 필 아이디어에 대한 아날로그 및 의사 코드입니다.
queue q
enqueue q, ghost_origin
set visited
while q has squares
p <= dequeue q
for each square s adjacent to p
if ( s not in visited ) then
add s to visited
s.returndirection <= direction from s to p
enqueue q, s
end if
next
next
아이디어는 너비가 가장 넓은 검색이므로 인접한 새로운 사각형이 나타날 때마다 가장 좋은 경로는 p입니다. 내가 믿는 O (N)입니다.
게임 구현 방법에 대해서는 잘 모르지만 다음을 수행 할 수 있습니다.
일부 의사 코드 :
x = getRelativeOppositeLatitudinalCoord()
y
origX = x
while(eyesNotInPen())
x = getRelativeOppositeLatitudinalCoordofGate()
y = getRelativeOppositeLongitudinalCoordofGate()
if (getRelativeOppositeLatitudinalCoordofGate() == 0 && move(y) == false/*assume zero is neither left or right of the the gate and false means wall is in the way */)
while (move(y) == false)
move(origX)
x = getRelativeOppositeLatitudinalCoordofGate()
else if (move(x) == false) {
move(y)
endWhile
dtb23의 각 구석에서 임의의 방향을 고르라는 제안은 결국 괴물 구멍 소리가 끔찍하게 부족하다는 것을 알게 될 것입니다.
그러나 비효율적 인 리턴 투 홈 알고리즘을 사용하여 게임 난이도에 더 많은 변형을 도입하여 게임을 더 재미있게 만들 수 있습니다. 웨이 포인트 나 플러드 필과 같은 위의 접근 방식 중 하나를 적용하지만 결정적이지 않게 수행하면됩니다. 따라서 모든 구석에서 임의의 숫자를 생성하여 최적의 방법을 취할지 또는 임의의 방향을 취할지 결정할 수 있습니다.
플레이어가 레벨을 진행함에 따라 임의의 방향을 취할 가능성이 줄어 듭니다. 레벨 속도, 고스트 속도, 약 먹는 일시 정지 등 전반적인 난이도에 다른 레버가 추가됩니다. 귀신이 무해한 눈을 가진 동안 휴식을 취할 시간이 더 있지만, 진행하면서 시간이 점점 짧아집니다.
귀신이 홀에서 팩맨으로 향한 길을 저장한다고 제안합니다. 유령이 죽 자마자, 그는이 저장된 길을 반대 방향으로 따라갈 수 있습니다.
내 접근 방식은 약간의 메모리 집약적이지만 (Pacman 시대의 관점에서) 한 번만 계산하면되며 모든 레벨 디자인 (점프 포함)에서 작동합니다.
레벨을 처음로드 할 때는 모든 몬스터 레이어 노드 0 (레이어와의 거리를 나타냄)에 레이블을 지정하십시오. 모든 노드에 레이블이 지정 될 때까지 연결된 노드 1, 노드 2에 연결된 노드 등으로 외부 레이블링을 진행하십시오. (주 : 이것은 층이 여러 개의 입구를 가지고있는 경우에도 작동합니다)
각 노드를 나타내는 객체와 이웃에 대한 연결이 이미 있다고 가정합니다. 의사 코드는 다음과 같습니다.
public void fillMap(List<Node> nodes) { // call passing lairNodes
int i = 0;
while(nodes.count > 0) {
// Label with distance from lair
nodes.labelAll(i++);
// Find connected unlabelled nodes
nodes = nodes
.flatMap(n -> n.neighbours)
.filter(!n.isDistanceAssigned());
}
}
모든 노드에 레이블이 지정되면 눈을 라우팅하는 것이 쉽지 않습니다. 거리 레이블이 가장 낮은 이웃 노드를 선택하기 만하면됩니다 (참고 : 여러 노드의 거리가 같은 경우 어떤 노드를 선택해도 상관 없습니다). 의사 코드 :
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
내 팩맨 게임을 shortest multiple path home
위해 나는 내가 제공하는 미로에 대해 약간의 " "알고리즘을 만들었다 . 또한 터널을 가로 질러 작동합니다.
레벨이로드되면 모든 항목 path home data in every crossroad
이 비어 있고 (기본값) 유령이 미로를 탐색하기 시작 crossroad path home information
하면 "새"교차로가 나갈 때마다 또는 알려진 교차로에서 다시 다른 경로에서 넘어 질 때마다 계속 업데이트됩니다.
원래 팩맨은 길 찾기 나 멋진 AI를 사용하지 않았습니다. 게이머는 실제보다 깊이가 더 크다고 믿었지만 실제로는 무작위였습니다. 게임 / Ian Millington, John Funge의 인공 지능에 명시된 바와 같이.
그것이 사실인지 확실하지 않지만 나에게는 많은 의미가 있습니다. 솔직히, 나는 사람들이 말하는 이러한 행동을 보지 못했습니다. ex의 빨간색 / 깜박임은 플레이어가 항상 말한 것처럼 플레이어를 따르지 않습니다. 의도적으로 플레이어를 지속적으로 따르는 사람은 없습니다. 그들이 당신을 따를 확률은 나에게 무작위로 보입니다. 그리고 좁은 공간에서 적 4 명과 회전 옵션이 제한되어있어 추격 당할 확률이 매우 높을 때 무작위로 행동하는 것을 보는 것은 매우 유혹적입니다. 적어도 초기 구현에서 게임은 매우 간단했습니다. 책을 확인하십시오. 첫 장 중 하나에 있습니다.