์ง๋๋ฒ์ ๊ธธ ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ ๋ค ๊ทธ๋ฌ๊ณ ๊ฐ์๊ธฐ ์ ์ํด ๋ฒ๋ ธ๋๋ฐ
์๋ง์ ์ฝ์ง๊ณผ ๋ป์ง๊ณผ ๊ทธ๋ฆฌ๊ณ ๊ฒ์ํ๋ค๊ณ ๋ญ๋นํ ์๊ฐ ๋์ ๊ฒฐ๊ตญ ๋ง๋ค๊ธด ๋ง๋ค์๋ค.
๋จ์ ์ฝ๋ย ๊ทธ๋ฅ ๊ฐ์ ธ์์ ๋ง๋ค์์ผ๋ฉด ํจ์ฌ ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ ธ์ ๊ฒ์... ์์ฒญ ์๊ฐ ์ก์ ๋จน์๋ค.
๊ทผ๋ฐ ๋ ๋ณด๋ฉด ๋จ ์ฝ๋๊ฐ ์๊ทผํ ๋ง์์ ์ ๋๋ ๋ถ๋ถ์ด ๊ผญ ํ๋์ฉ ๋์ค์์?
๊ทธ๊ฑธ ๊ณ ์น๋ ค๋ฉด ๋ด๊ฐ ์ดํด๋ฅผ ๋ชป ํ ์ํ์์๋ ๋ชป ๊ณ ์น๊ณ .
์ด์ฐจํผ ๋์ค์ ๋ ์์ ํ ์ผ์ด ์๊ฒผ์ ๋ ์์ ํ ๋ ค๋ฉด ์๊ณ ๋ ๊ฐ์ผ ํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์์,
๋ฐ๋ฅ๋ถํฐ ์ฝ๋๋ฅผ ํ๋ํ๋ ๋ค ์ง ๋ค๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค.
์ฐ์ ์ A star ์๊ณ ๋ฆฌ์ฆ์ ๋ํด์ ์ข ์ด์ผ๊ธฐ๋ฅผ ํด์ผ ํ ๊ฑฐ ๊ฐ์๋ฐ,ย
http://egloos.zum.com/cozycoz/v/9748811
์๊ณ ๋ฆฌ์ฆ ์ค๋ช ์ด ํ์ํ ์ฌ๋์ ์ฌ๊ธฐ ๊ฐ๋ผ.
๋ด๊ฐ ์ง ์ฝ๋๋ ์ฌ๊ธฐ ์ค๋ช ์ ๊ธฐ์ค์ผ๋ก ์ง ๊ฑฐ๋ผ์ ์ ๊ธ์ ์ฝ๊ณ ์จ ๋์ ๊ธฐ์ค์ผ๋ก ํด์ ์ด์ผ๊ธฐํ ๊ฑฐ๋ค.
0. ์๋ฃ๊ตฌ์กฐ
ย - ๊ฒ์๋งค๋์ ์ ๋งต ๊ตฌ์กฐ.
์ผ๋จ ๊ฒ์ ๋งค๋์ ์์๋ ๋ณ ๊ฑฐ ์์ด.ย
๋๋ Grid์๋ค๊ฐ ๊ฒ์๋ฉ๋์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํด ๋์๊ณ , public tilemap์๋ค๊ฐ ์ ๊ธฐ ๋ณด์ด๋ Tilemap์ ๊ทธ๋ฅ ๋๋๊ทธ ํด์ ๋ถ์์ด.
๊ทธ ๋ค์์ TileNode ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์ ํ๋ฒ ๋ณต์ฌํด ์ฃผ๋ ๋ฐฉ๋ฒ์ ์ผ์ง.
์ต๋ํ ์ฌํํ๊ฒ.
๋๋จธ์ง๋ ์ ๋ถ Astar์ ๋๋ ค๋ฐ์๋๋ฐ, ๊ฑฐ๊ธฐ ์ฝ๋๊ฐ ์กด๋ ๋ง์.
์๋ฃ๊ตฌ์กฐ - Astar ์๊ณ ๋ฆฌ์ฆ
์ ์ง ๋ฑ ๋ณด๋ฉด ์ฐ์ ์์ ํ ์ฒ๋ผ ์๊ธด ๋ฌด์์ธ๊ฐ๋, ๋งต์ ๊ทธ๋ฆฐ ๊ฒ ์ฒ๋ผ ์๊ธด ๋ฌด์์ธ๊ฐ๊ฐ ๋ณด์ด์ง?
AStar ์๊ณ ๋ฆฌ์ฆ์ ๊น๋จน๊ณ ์จ ์ฌ๋์ ์ ์๋ก ์ฌ๋ผ๊ฐ์ ์ฐ๊ฒฐ๋ ํ์ด์ง์์ opened list์ closed list๊ฐ ๋ฌด์จ ๋ป์ธ์ง๋ฅผ ๋ค์ ๋ณด๊ณ ์ค์๊ณ ...
opened list์ ์ฐ์ ์์ํ๋ฅผ ์ฌ์ฉํ ์ด์ ๋ F๋น์ฉ(์์์ ~ย ํ์ฌ์ง์ ๊น์ง์ ์ด๋๊ฑฐ๋ฆฌ + ํ์ฌ์ง์ ~์ข
๋ฃ์ ๊น์ง ์ด๋๊ฑฐ๋ฆฌ)์ ๋ฐ๋ผ์ ์ ๋ ฌํ๊ธฐ ์ํด์์ผ.
๊ฒฐ๋ก ์ ์ผ๋ก F ๋น์ฉ์ด ๊ฐ์ฅ ๋ฎ์ ๊ฒฝ๋ก๋ฅผ ์ ํํ๊ฒ ๋๋๊น, ์ ์ ์ถ๊ฐํ ๋๋ง๋ค F ๋น์ฉ์ ๋ฐ๋ผ์ ์ ๋ ฌํด ๋๋ฉด ํธํ๊ฒ ์ง.
๊ทธ ๋ค์์ closed list์ OpenCloseMap์ย ๋ฐฐ์ด์ด์ผ.
์ ์ฌ๊ธฐ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ํ๋ฉด, ๋ค์ ์๊น ๋ณธ ํ์ด์ง(ย http://egloos.zum.com/cozycoz/v/9748811 )๋ก ๋์๊ฐ์
5,6๋ฒ ํญ๋ชฉ์ ๋ณด๋ฉด "์ธ์ ์ฌ๊ฐํ"์ด๋ผ๋ ๋ง์ด ๋ณด์ด์ง?
๊ดํ ์ฐ์ ์์ ํ๋ ๋ฆฌ์คํธ๊ฐ์ ๊ดด๋ํ ๊ฑฐ ์ฐ๋ ๊ฒ ๋ณด๋ค๋, ๋น ๋ฅด๊ณ ์์๋ฅผ ๋ช ํํ ์ ์ ์๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉดย
์ธ์ ํ ์ฌ๊ฐํ์ ์ฐพ๊ธด ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ย ๋ฐฐ์ด์ ์ฌ์ฉํ์ด.ย
X,Y๊ฐ์ +- 1 ํ๋ฉด ๊ทธ๋ง์ด์์?
์ ๊ธฐ ๋ณด์ด๋ NodeInfo๋ ์๋ ํฅ์์ ์ํด์ class๋์ ์ struct๋ฅผ ์ผ์ด.
ย ย public struct NodeInfo
ย ย {
ย ย ย ย public bool isClosed;
ย ย ย ย public bool isOpened;
ย ย ย ย public PathNode node;
ย ย }
node์ PathNode์ ref๋ฅผ ๋ฃ๊ธฐ ์ํด์๋ ์ด์ฉ์ ์์ด PathNode๋ class๋ฅผ ์จ์ผ ํ์ง.ย
์กด๋ ์ธ๋ชจ์์ด ์ ํ๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์ ์ฌ์ฉ๋ ๊ตฌ์กฐ๊ฐ 4๊ฐ๋ ๋๋๋ฐ,
๊ทธ ์ค์ PathNode์ NodeInfo๋ AStar ๋ด๋ถ์์๋ง ์ฐ์ฐ์ ์ํด์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ๊ณ ,
์ค์ ํ์ผ๋งต๊ณผ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด์๋ Point์ TileNode๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ค์์ด.
1. ๊ธธ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ
์๊น๋ถํฐ ๊ณ์ ์ฐธ๊ณ ํ ํ์ด์ง์ธ (ย http://egloos.zum.com/cozycoz/v/9748811 )์์๋ ๋ญ๊ฐ ์ด๋ ต๊ฒ ์ค๋ช ํด ๋จ์ด.
ํนํ 5,6๋ฒ ๋จ๊ณ์ ๊ฐ๋ฉด ์ฃผ์ ์ฌ๊ฐ ์ ์ณ๋จน๊ณ ์ฃผ์ ์ฐ๋ ๊ฒ ๋ง๋ฅ ๋ฌธ์ฅ์ ์ฃผ์ ๊ด๊ณ๊ฐ ์ข๊ฐ์ด ๊ผฌ์ด๋ฉด์ ์ค๋ช ์ด ๊ฐํ์ด ๋จ.
๊ทธ๋์ ๋ด๊ฐ ์ดํดํ ๊ฑฐ ํ ๋๋ก ์กด๋ ์ฝ๊ฒ ์ค๋ช ํด ์ค๋ค.
๋ณด๋ฉด 2,3๋ฒ ์์ง? ์ ๋์๊ฐ.
์ฐ์ ์ ์ผ๋ก ์์์ผ ํ ๊ฑด opened list์ closed list์ ๊ฐ๋ ์ด์ผ.
opened list๋ ๋ด๊ฐ ํ์ํด์ผ ํ ๊ฐ ์ ๋ค.
closed list๋ ํ์์ด ๋๋์ ๋ ์ด์ ํ์ํ ํ์๊ฐ ์๋ ์ ๋ค์.
AStar ๊ธธ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ต์ ์ธ ๊ตฌ์กฐ๋ย ๋ค์๊ณผ ๊ฐ์.
1. ์์ ์ง์ ์ย ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์ ๋ฃ์.
2. ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์์ F๋ฅผ ๊ธฐ์ค์ผ๋ก, ๊ฐ์ฅ ๋ฎ์ F๋ฅผ ๊ฐ์ง ์ (โก)์ ์ ํํ ์ ๊ฑฐ(pop).
ย (์ด ์์ ์์ opened list == null ์ด๋ฉด ํ์ ์คํจ, break)
3.ย โก๋ ์ ํ๋์์ผ๋ ๋ ์ด์ ํ์ํ ํ์์๋ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(closed list)์ ๋ฃ์.
4.ย โก์ ์ธ์ ํ ์ ๋ค(์,ํ,์ข,์ฐ,(+๋๊ฐ์ 4๋ฐฉํฅ)) ์ค์์,ย
ย ย ๋ฒฝ์ด ์๋(์ด๋ ๊ฐ๋ฅํ) && ์ด๋ ค ์์ง ์์ && ๋ซํ ์์ง ์์ ์ (โ )๋ค์ opened list์ ๋ฃ์.
ย ย ์ด ์ (โ ) ๋ค์ย โก๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ์ง.
5.ย โ ์ ์ธ์ ํ ์ ๋ค(์,ํ,์ข,์ฐ,(+๋๊ฐ์ 4๋ฐฉํฅ)) ์ค์์,ย
ย ย opened list์ ์๋ &&ย โก๋ณด๋ค G ๊ฐ์ด ์์ ์ (โ)์ด ์๋ค๋ฉด,ย โ ์ย ๋ถ๋ชจ๋ฅผย โ๋ก ๋ฐ๊ฟ.
6.ย ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์ ์ต์ข ์ง์ ์ด ํฌํจ๋์๋์ง ํ์ธํ, ํฌํจ๋์๋ค๋ฉด ํ์ ์ฑ๊ณต-์ข ๋ฃ / ์๋๋ผ๋ฉด 2๋ฒ๋ถํฐ ๋ฐ๋ณต.
๋ค์๋ถํฐ๋ ํ๋ํ๋ ์ค๋ช ๋ค์ด๊ฐ๋ค?
1.ย ์์ ์ง์ ์ย ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์ ๋ฃ์.
ย ์ฌ๊ธฐ์ opened list์๋ง ๋ฃ๋๊ฒ ์๋๋ผ openclosemap์๋ ๋ฃ์ ์ด์ ๋,
ย priority queue์์ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํ์(์์์์ 5๋ฒ ๊ณผ์ )์ ํ๊ธฐ์๋ ์ฐ์ฐ ์๋๊ฐ ํจ์ฌ ์ปค์ง๊ธฐ ๋๋ฌธ์.
๋ฌผ๋ก , G ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ์ํ ์๋ ์์ง๋ง ๊ทธ๋ฌ๊ธฐ์๋ ๋ค์ ์ ๋ ฌํด ์ค์ผ ํ๋ ๊ณผ์ ์ด ๋ ํ์ํด ์ง๋ฏ๋ก
๊ทธ๋ฅ ์ขํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๋งต์๋ค ๋๋ ค๋ฐ๋ ์ชฝ์ด ๋ซ๋๋ผ๊ณ .
2. ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์์ F๋ฅผ ๊ธฐ์ค์ผ๋ก, ๊ฐ์ฅ ๋ฎ์ F๋ฅผ ๊ฐ์ง ์ (โก)์ ์ ํํ ์ ๊ฑฐ(pop).
ย (์ด ์์ ์์ opened list == null ์ด๋ฉด ํ์ ์คํจ, break)
์ฌ์ค push๋จ๊ณ์์ ์ด๋ฏธ sort๋์๋ค๊ณ ํ๋ค...
3.ย โก๋ ์ ํ๋์์ผ๋ ๋ ์ด์ ํ์ํ ํ์์๋ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(closed list)์ ๋ฃ์.
ํจ์ค.
4.ย โก์ ์ธ์ ํ ์ ๋ค(์,ํ,์ข,์ฐ,(+๋๊ฐ์ 4๋ฐฉํฅ)) ์ค์์,ย
ย ย ๋ฒฝ์ด ์๋(์ด๋ ๊ฐ๋ฅํ) && ์ด๋ ค ์์ง ์์ && ๋ซํ ์์ง ์์ ์ (โ )๋ค์ opened list์ ๋ฃ์.
ย ย ์ด ์ (โ ) ๋ค์ย โก๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ์ง.
์ด๊ฑด ์ข ์ฝ๋๊ฐ ๊ธธ๋ค. ์ค์ท์ ํจ์คํ๊ณ ...
public void SetChildren(LinkedList<PathNode> children, Point target, OpenCloseMap mapSpace)
ย ย ย ย {
ย ย ย ย ย ย if (CanBeChild(X - 1, Y, mapSpace))
ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย children.AddLast(new PathNode(X - 1, Y, this, target));
ย ย ย ย ย ย ย ย mapSpace.Open(children.Last.Value);
ย ย ย ย ย ย }
ย ย ย ย ย ย if (CanBeChild(X + 1, Y, mapSpace))
ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย children.AddLast(new PathNode(X + 1, Y, this, target));
ย ย ย ย ย ย ย ย mapSpace.Open(children.Last.Value);
ย ย ย ย ย ย }
....
๋์ถฉ ์ด๋ฐ ์ฝ๋๋ฅผ ์ผ๋๋ฐ, for๋ฌธ์ ์ ์ฐ๊ณ ํ๋์ฝ๋ฉ์ผ๋ก ์ฒ๋ฆฌํ ์ด์ ๋ ์/ํ/์ข/์ฐ ๋ง ํ ๊ฒ์ธ๊ฐ, ๋๊ฐ์ ๊น์ง ํ ๊ฒ์ธ๊ฐ์ ์ฃผ์์ฒ๋ฆฌ๊ฐ ํธํด์์ผ.
ย ย ย ย private bool CanBeChild(int posX, int posY, OpenCloseMap mapSpace)
ย ย ย ย {
ย ย ย ย ย ย if (mapSpace.IsInMap(posX, posY) && !mapSpace.IsClosed(posX, posY) && !mapSpace.IsOpened(posX, posY)) return true;
ย ย ย ย ย ย else return false;
ย ย ย ย }
์ข๋ ๋ณ๊ฑฐ ์์.ย
5.ย โ ์ ์ธ์ ํ ์ ๋ค(์,ํ,์ข,์ฐ,(+๋๊ฐ์ 4๋ฐฉํฅ)) ์ค์์,ย
ย ย opened list์ ์๋ &&ย โก๋ณด๋ค G ๊ฐ์ด ์์ ์ (โ)์ด ์๋ค๋ฉด,ย โ ์ย ๋ถ๋ชจ๋ฅผย โ๋ก ๋ฐ๊ฟ.
์ด ๋ถ๋ถ์ด ํต์ฌ์ด์ง.
ย ย private void SetG()
ย ย ย ย {
ย ย ย ย ย ย if (Parent != null) G = Parent.G + GetShortestCostToTarget(Parent);
ย ย ย ย ย ย else G = 0;
ย ย ย ย }
ย ย ย ย private void SetH(Point target)
ย ย ย ย {
ย ย ย ย ย ย if (target != null) H = GetShortestCostToTarget(target);
ย ย ย ย ย ย else H = 0;
ย ย ย ย }
ย ย public int GetShortestCostToTarget(int targetXpos, int targetYpos)
ย ย {
ย ย ย ย ย ย int Xlength = Math.Abs(targetXpos - X);
ย ย ย ย ย ย int Ylength = Math.Abs(targetYpos - Y);
ย ย ย ย ย ย int diagonalLength = (Xlength > Ylength) ? Ylength : Xlength;
ย ย ย ย ย ย int straightLength = ((Xlength > Ylength) ? Xlength : Ylength) - diagonalLength;
ย ย ย ย ย ย return (Xlength + Ylength) * straightCost;//using only straight
ย ย ย ย ย ย //return straightLength * straightCost + diagonalLength * diagonalCost;(using diagonal)
ย ย }
๊ทผ๋ฐ ๋ณ ๊ฑฐ ์์.
F๋ ์ ์ฒด ๊ฑฐ๋ฆฌ
G๋ ์์์ง์ ~์ด ์ ๊น์ง์ ๊ฑฐ๋ฆฌ
H๋ ์ด ์ ~์ข ๋ฃ์ง์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ(์์๊ฐ)์์.
G๋ ๋ถ๋ชจ์ G ๊ฐ์๋ค๊ฐ, ๋ถ๋ชจ๊น์ง์ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ทธ๋ฅ ๋ํด ์ฃผ๋ฉด ๋ค์ผ. ์๋ํ๋ฉด ๋ถ๋ชจ๋ ํญ์ ๋ฐ๋ก ์์ ์๋ ์ฌ๊ฐํ์ด๊ฑฐ๋ .
์์๊ฐ ๋์ ์ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํด ์ค ์ด์ ๋, ์ํ์ข์ฐ๋ง ์ธ ๊ฒ์ธ๊ฐ, ๋๊ฐ์ ๊น์ง ์ธ ๊ฒ์ธ๊ฐ์ ๋ฐ๋ผ์ ๊ณ์ฐ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด์ผ.
6.ย ํ์ํ ์ ๋ค์ด ๋ชจ์ธ ๋ฆฌ์คํธ(opened list)์ ์ต์ข ์ง์ ์ด ํฌํจ๋์๋์ง ํ์ธํ, ํฌํจ๋์๋ค๋ฉด ํ์ ์ฑ๊ณต-์ข ๋ฃ / ์๋๋ผ๋ฉด 2๋ฒ๋ถํฐ ๋ฐ๋ณต.
4,5,6์ ์ค๋ช ์ ์กด๋ ๋์ถฉ๋์ถฉ ํ ๊ฑฐ ๊ฐ์๋ฐ, ๊ทธ๋ด ์ ๋ฐ์ ์๋๊ฒ ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ํฌ๊ฒ ๋ณ ๊ฑฐ ์์์ง๋ง ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ ๊ณผ์ ์ด ํ๋ค์๊ฑฐ๋ .
๊ทธ๋ฆฌ๊ณ ๋์ ์ ํํ ๊ฑธ ์ ์ฉ์ํค๋ ๋์ค์ ์๋ฌ๊ฐ ์ข ํฐ์ก์๊ณ .
๋์์ ์ ์ฌ๋ผ๊ฐ๋ ๋ชจ๋ฅด๊ฒ ๋ค. ์ด๋ง ์์ผ์ง.ย
๋ค์์๋ ์ฌ์ฌ ๋งต ์ ์ฅ์ฉ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ๋งต ์๋ํฐ UI๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ๋ค.
๋จธํ๋ ๊ฒ ์ ๋๊น
a*๋ ํ์ ์ธ๋ฏ...
๊ฐ์ธ์ ์ผ๋ก ๊ถ๊ธํ๊ฑด๋ฐ, ๊ทธ๋ ๊ฒ ๋จ์์ฝ๋ ๊ธ์ด๋ค๊ฐ ๋ถ์ํด์ ๋ฏ์ด๊ณ ์น๋ฉด์ ๊ฒ์๋ง๋ค์ ๋๋ฉด ์ธ์ด๊ณต๋ถ ์ผ๋ง๋ ํ์ด?
ใ ใ /๋์ ๋ง๋๋ ๊ฒ์
์ด์ธ์นด/4๋ (์ปด๊ณต์ด๋ค)