<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>A* algorithm needs fixing</title>
		<link>http://www.allegro.cc/forums/view/590185</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 23 Feb 2007 21:22:32 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I made a simple A* path finding algorithm, but it i really messed up and only finds the right path sometimes. I&#39;ll post the code since there isn&#39;t a lot.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> AddTile<span class="k2">(</span>Tile <span class="k3">*</span>tile, <span class="k1">bool</span> addToOpenList <span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_600.html" target="_blank">open</a> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>tile-&gt;blocked<span class="k2">)</span></td></tr><tr><td class="number">4</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">if</span><span class="k2">(</span>find<span class="k2">(</span>openList.begin<span class="k2">(</span><span class="k2">)</span>, openList.end<span class="k2">(</span><span class="k2">)</span>, tile<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> openList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>      openList.push_back<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">9</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tile-&gt;blocked<span class="k2">)</span></td></tr><tr><td class="number">11</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">if</span><span class="k2">(</span>find<span class="k2">(</span>closedList.begin<span class="k2">(</span><span class="k2">)</span>, closedList.end<span class="k2">(</span><span class="k2">)</span>, tile<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> closedList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>      closedList.push_back<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      tile-&gt;pathMark <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">void</span> FindPath<span class="k2">(</span><span class="k1">int</span> startX, <span class="k1">int</span> startY, <span class="k1">int</span> endX, <span class="k1">int</span> endY<span class="k2">)</span></td></tr><tr><td class="number">21</td><td><span class="k2">{</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">bool</span> pathFound <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">int</span> currentX <span class="k3">=</span> startX, currentY <span class="k3">=</span> startY<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>startX, startY<span class="k2">)</span>, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    GetTile<span class="k2">(</span>endX, endY<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>end <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>pathFound<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>  <span class="c">//add the tiles around the current tile to check them</span></td></tr><tr><td class="number">30</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">-</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">-</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">+</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">+</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>  vector<span class="k3">&lt;</span>Tile <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> openList.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>  <span class="k1">int</span> currentLow <span class="k3">=</span> <span class="n">1000000</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  Tile <span class="k3">*</span>currentTile <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>        <span class="c">//find the tile with the lowest F score</span></td></tr><tr><td class="number">38</td><td>  <span class="k1">while</span><span class="k2">(</span>it <span class="k3">!</span><span class="k3">=</span> openList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">39</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>      <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>h <span class="k3">=</span> <span class="n">32</span> <span class="k3">*</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endX<span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>      <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>g <span class="k3">=</span> closedList.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>      <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>f <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>h <span class="k3">+</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>g<span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>checked <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>      <span class="c">//check if following this path would be faster</span></td></tr><tr><td class="number">45</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>f <span class="k3">&lt;</span> currentLow<span class="k2">)</span></td></tr><tr><td class="number">46</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">47</td><td>    currentLow <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>f<span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    currentTile <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">50</td><td>      it<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">52</td><td>  <span class="c">//add the tile to the closed list</span></td></tr><tr><td class="number">53</td><td>  AddTile<span class="k2">(</span>currentTile, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>  currentX <span class="k3">=</span> currentTile-&gt;x <span class="k3">/</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>  currentY <span class="k3">=</span> currentTile-&gt;y <span class="k3">/</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>  <span class="c">//check if the tile we just added is the destination</span></td></tr><tr><td class="number">57</td><td>        <span class="k1">if</span><span class="k2">(</span>currentTile-&gt;x <span class="k3">/</span> <span class="n">32</span> <span class="k3">=</span><span class="k3">=</span> endX <span class="k3">&amp;</span><span class="k3">&amp;</span> currentTile-&gt;y <span class="k3">/</span> <span class="n">32</span> <span class="k3">=</span><span class="k3">=</span> endY<span class="k2">)</span> pathFound <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">59</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

I realize this isn&#39;t very optimized, I just want it to work before I try speeding it up. The main problem is that it only makes paths that look like right angles, and sometimes it doesn&#39;t work at all when it meets blocked tiles.</p><p>EDIT:<br />Ugh, I guess I should change this so it&#39;s more like a linked list where the tiles have parents. I&#39;m not sure how I would do the search though, would I just keep going through the whole list and adding more tiles to check which way it the shortest?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GrantG)</author>
		<pubDate>Wed, 21 Feb 2007 21:54:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try the following code
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span>
  tempx <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>x <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endX,
  tempy <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>y <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endY<span class="k2">;</span>

<span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>h <span class="k3">=</span> tempx<span class="k3">*</span>tempx <span class="k3">+</span> tempy<span class="k3">*</span>tempy<span class="k2">;</span>
</pre></div></div><p>
instead of your own to compute h. When you call<br /><span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">)</span><span class="k2">;</span></span><br />you get the distance between the current tile and the destination tile. But in this case you don&#39;t need to do that, especially if you don&#39;t want to waste runtime.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kevin Adrian)</author>
		<pubDate>Thu, 22 Feb 2007 18:45:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Heh, thanks for the help, but I&#39;ve already fixed it. It works perfectly now, but for some reason the search area is larger than it should be.</p><p>I suppose I&#39;ll post the updated code, the search issue isn&#39;t that much of a problem since it&#39;s still very fast, but if anyone can point out something I&#39;m doing wrong that would be nice.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">struct</span> Tile</td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    Tile <span class="k3">*</span>parent<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">int</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> h, g, f<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>    <span class="k1">bool</span> blocked<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">bool</span> onClosedList<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">bool</span> start, end<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">bool</span> pathMark<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">bool</span> checked<span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>Tile <span class="k3">*</span>GetTile<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span></td></tr><tr><td class="number">14</td><td><span class="k2">{</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">if</span><span class="k2">(</span>x <span class="k3">&gt;</span> <span class="k3">-</span><span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> x <span class="k3">&lt;</span> <span class="n">20</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> y <span class="k3">&gt;</span> <span class="k3">-</span><span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> y <span class="k3">&lt;</span> <span class="n">15</span><span class="k2">)</span></td></tr><tr><td class="number">16</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="k2">(</span>y <span class="k3">*</span> <span class="n">20</span><span class="k2">)</span> <span class="k3">+</span> x<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&gt;</span> <span class="k3">-</span><span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> <span class="n">300</span><span class="k2">)</span> <span class="k1">return</span> <span class="k3">&amp;</span>tiles<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">21</td><td><span class="k2">}</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td><span class="k1">void</span> AddTile<span class="k2">(</span>Tile <span class="k3">*</span>parent, Tile <span class="k3">*</span>tile, <span class="k1">bool</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_600.html" target="_blank">open</a> <span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span></td></tr><tr><td class="number">24</td><td><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_600.html" target="_blank">open</a> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>tile-&gt;blocked<span class="k2">)</span></td></tr><tr><td class="number">26</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tile-&gt;onClosedList<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>      <span class="k1">if</span><span class="k2">(</span>find<span class="k2">(</span>openList.begin<span class="k2">(</span><span class="k2">)</span>, openList.end<span class="k2">(</span><span class="k2">)</span>, tile<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> openList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">31</td><td>    <span class="c">//check if the path if better using that tile</span></td></tr><tr><td class="number">32</td><td>    <span class="k1">if</span><span class="k2">(</span>parent-&gt;g <span class="k3">+</span> <span class="n">32</span> <span class="k3">&lt;</span> tile-&gt;g<span class="k2">)</span></td></tr><tr><td class="number">33</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">34</td><td>        tile-&gt;parent <span class="k3">=</span> parent<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>        tile-&gt;g <span class="k3">=</span> parent-&gt;g <span class="k3">+</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>              tile-&gt;f <span class="k3">=</span> tile-&gt;h <span class="k3">+</span> tile-&gt;g<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">38</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">else</span></td></tr><tr><td class="number">40</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>    tile-&gt;h <span class="k3">=</span> <span class="n">32</span> <span class="k3">*</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>tile-&gt;x <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endX<span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>tile-&gt;y <span class="k3">/</span> <span class="n">32</span> <span class="k3">-</span> endY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    tile-&gt;g <span class="k3">=</span> closedList.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    tile-&gt;f <span class="k3">=</span> tile-&gt;h <span class="k3">+</span> tile-&gt;g<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    tile-&gt;parent <span class="k3">=</span> parent<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    tile-&gt;checked <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    openList.push_back<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">48</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">49</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">50</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tile-&gt;blocked<span class="k2">)</span></td></tr><tr><td class="number">51</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">52</td><td>  <span class="k1">if</span><span class="k2">(</span>find<span class="k2">(</span>closedList.begin<span class="k2">(</span><span class="k2">)</span>, closedList.end<span class="k2">(</span><span class="k2">)</span>, tile<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> closedList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">53</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">54</td><td>      tileAdded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>      tile-&gt;onClosedList <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>      closedList.push_back<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">58</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">59</td><td><span class="k2">}</span></td></tr><tr><td class="number">60</td><td>&#160;</td></tr><tr><td class="number">61</td><td><span class="k1">void</span> MarkPath<span class="k2">(</span>Tile <span class="k3">*</span>dest<span class="k2">)</span></td></tr><tr><td class="number">62</td><td><span class="k2">{</span></td></tr><tr><td class="number">63</td><td>    <span class="k1">if</span><span class="k2">(</span>dest-&gt;parent <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">64</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>  dest-&gt;pathMark <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>  MarkPath<span class="k2">(</span>dest-&gt;parent<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">68</td><td><span class="k2">}</span></td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td><span class="k1">void</span> FindPath<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> x2, <span class="k1">int</span> y2<span class="k2">)</span></td></tr><tr><td class="number">71</td><td><span class="k2">{</span></td></tr><tr><td class="number">72</td><td>    <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>x2, y2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>blocked <span class="k3">|</span><span class="k3">|</span> GetTile<span class="k2">(</span>x, y<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>blocked<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Start: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">74</td><td>    <span class="k1">bool</span> pathFound <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>    startX <span class="k3">=</span> x<span class="k2">;</span></td></tr><tr><td class="number">76</td><td>    startY <span class="k3">=</span> y<span class="k2">;</span></td></tr><tr><td class="number">77</td><td>    endX <span class="k3">=</span> x2<span class="k2">;</span></td></tr><tr><td class="number">78</td><td>    endY <span class="k3">=</span> y2<span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k1">int</span> currentX <span class="k3">=</span> startX, currentY <span class="k3">=</span> startY<span class="k2">;</span></td></tr><tr><td class="number">80</td><td>    AddTile<span class="k2">(</span>NULL, GetTile<span class="k2">(</span>startX, startY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td>    Tile <span class="k3">*</span>currentTile <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">83</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">84</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">85</td><td>  <span class="c">//find the tile with the lowest F score</span></td></tr><tr><td class="number">86</td><td>  vector<span class="k3">&lt;</span>Tile <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it <span class="k3">=</span> openList.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>  <span class="k1">int</span> currentLow <span class="k3">=</span> <span class="n">1000000</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  tileAdded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>  <span class="k1">while</span><span class="k2">(</span>it <span class="k3">!</span><span class="k3">=</span> openList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">90</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">91</td><td>      <span class="k1">if</span><span class="k2">(</span>step<span class="k2">)</span> DrawTiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>      <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>f <span class="k3">&lt;</span> currentLow <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> currentTile <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>onClosedList<span class="k2">)</span></td></tr><tr><td class="number">93</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">94</td><td>    currentLow <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>f<span class="k2">;</span></td></tr><tr><td class="number">95</td><td>    currentTile <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">97</td><td>      it<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">99</td><td>  <span class="c">//add the tile to the closed list</span></td></tr><tr><td class="number">100</td><td>  AddTile<span class="k2">(</span>NULL, currentTile, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td>  <span class="c">//if the tile was not added, that means that a path could not be found</span></td></tr><tr><td class="number">102</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>tileAdded<span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>  currentX <span class="k3">=</span> currentTile-&gt;x <span class="k3">/</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">104</td><td>  currentY <span class="k3">=</span> currentTile-&gt;y <span class="k3">/</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>  <span class="c">//check if the tile we just added is the destination</span></td></tr><tr><td class="number">106</td><td>  <span class="k1">if</span><span class="k2">(</span>currentTile-&gt;x <span class="k3">/</span> <span class="n">32</span> <span class="k3">=</span><span class="k3">=</span> endX <span class="k3">&amp;</span><span class="k3">&amp;</span> currentTile-&gt;y <span class="k3">/</span> <span class="n">32</span> <span class="k3">=</span><span class="k3">=</span> endY<span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>  <span class="c">//add the tiles around the current tile to check them</span></td></tr><tr><td class="number">108</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">-</span> <span class="n">1</span>, currentY<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY<span class="k2">)</span>, GetTile<span class="k2">(</span>currentX <span class="k3">-</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY<span class="k2">)</span>, GetTile<span class="k2">(</span>currentX, currentY <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">110</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX <span class="k3">+</span> <span class="n">1</span>, currentY<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY<span class="k2">)</span>, GetTile<span class="k2">(</span>currentX <span class="k3">+</span> <span class="n">1</span>, currentY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>  <span class="k1">if</span><span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> AddTile<span class="k2">(</span>GetTile<span class="k2">(</span>currentX, currentY<span class="k2">)</span>, GetTile<span class="k2">(</span>currentX, currentY <span class="k3">+</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">112</td><td>        <span class="c">//this stuff is just here for stepping through the process</span></td></tr><tr><td class="number">113</td><td>  <span class="k1">if</span><span class="k2">(</span>step<span class="k2">)</span> <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">114</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ENTER<span class="k2">]</span><span class="k2">)</span> step <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">116</td><td>    MarkPath<span class="k2">(</span>closedList.back<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">117</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"End: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">118</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GrantG)</author>
		<pubDate>Fri, 23 Feb 2007 21:22:32 +0000</pubDate>
	</item>
</rss>
