<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Best way to find the eleminated blocks?</title>
		<link>http://www.allegro.cc/forums/view/585610</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 25 May 2006 23:13:11 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m making a game where a rows of blocks rises from the bottom of the screen and you have to click on an area of 3 or more blocks of the same color and they disappear.  You loose if a block reaches the top row.  I&#39;m sure you&#39;ve all played a game like this.</p><p>What I&#39;m having touble with is finding the blocks in the array  to be removed.<br />The board is represented by an array of blocks (struct).  </p><p>Lets say x are blocks of the same color, if I click on one they all should disappear, but I&#39;m not sure of a good way to do this.</p><p> _ _ _ _ _ <br />|_|_|_|_|_|<br />|_|_|x|_|_|<br />|_|x|x|x|_|<br />|_|x|_|_|_|<br />|_|_|_|_|_|</p><p>My only idea is:<br />add the block I click on to a vector<br />check the four blocks surrounding it for the same color<br />  if same color, add to vector<br />loop until no more can be added<br />finaly remove blocks in the vector from the board</p><p>I&#39;m not necessarily looking for code.  Just wondering if ther is an easier way.  Seems like this my be more than I need to do.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Recorder)</author>
		<pubDate>Thu, 25 May 2006 22:07:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Well, if all blocks move up at the same speed and are alligned in a grid then:</p><p>1. Draw those blocks to a temporary bitmap.<br />2. Floodfill which block has been clicked on with a special colour.<br />3. Count the pixels with this colour, if less than 3 than ABORT.<br />4. Using the bitmap, change the block array to reflect the missing pieces.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Thu, 25 May 2006 22:12:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Richard, but that&#39;s not exactly what I&#39;m having a problem with.<br />I know how to make the blocks disappear.</p><p>I&#39;m not sure how to find which blocks need to be removed based only on the position of the one block I clicked on.</p><p>I can check if the blocks to the top, bottom, left, and right of the one I clicked on have the same color.  But then I have to check the one surrounding those and so on.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Recorder)</author>
		<pubDate>Thu, 25 May 2006 22:32:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
That&#39;s why you can use floodfill, it will mark all touching blocks of the same colour. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Thu, 25 May 2006 22:34:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Or you can just do your own floodfill algorithm to avoid messing around with a temporary copy of the data.</p><p>Very simple to do this recursively:</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> ClickedOnPoint<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">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    std::list<span class="k3">&lt;</span>std::pair<span class="k3">&lt;</span><span class="k1">int</span>, int&gt;&gt; results<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> color <span class="k3">=</span> grid.get<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>x, y, color, results<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>    <span class="c">// do something interesting with the result list</span></td></tr><tr><td class="number">10</td><td><span class="k2">}</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="k1">void</span> <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> color, std::list<span class="k3">&lt;</span>std::pair<span class="k3">&lt;</span><span class="k1">int</span>, int&gt;&gt; <span class="k3">&amp;</span>results<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>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>x <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>y <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>x <span class="k3">&gt;</span><span class="k3">=</span> gridWidth<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>y <span class="k3">&gt;</span><span class="k3">=</span> gridWidth<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td>        <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>    <span class="k1">if</span> <span class="k2">(</span>grid.get<span class="k2">(</span>x, y<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> color<span class="k2">)</span></td></tr><tr><td class="number">18</td><td>        <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>    results.add<span class="k2">(</span>std::make_pair<span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>x-1, y,   color, results<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>x<span class="k3">+</span><span class="n">1</span>, y,   color, results<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>x,   y-1, color, results<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <a href="http://www.allegro.cc/manual/floodfill" target="_blank"><span class="a">floodfill</span></a><span class="k2">(</span>x,   y<span class="k3">+</span><span class="n">1</span>, color, results<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

That will be terribly inefficient and use lots of stack space if the grid is very large, but I guess yours is only going to be 10x10 or at most maybe 30x30 or so? In which case this naiive implementation is no problem at all.</p><p>To make it more efficient you can use your own stack structure rather than relying on recursion, and also change it to work in horizontal line spans rather than just single pixels (do a rapid scan left and right from each point, then only bother to floodfill into the line spans above and below that resulting span). I think Foley &amp; Van Damme gives the standard algorithm for this, or you could look at how the Allegro implementation works.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Shawn Hargreaves)</author>
		<pubDate>Thu, 25 May 2006 22:54:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Recorder - This is easily solved using a recursive algorithm.</p><p>Example:</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">int</span> table_of_blocks<span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> ...<span class="k2">;</span> <span class="c">// Zero this out</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">int</span> number_of_blocks_touching<span class="k2">(</span> <span class="k1">int</span> row, <span class="k1">int</span> column <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">int</span> count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">bool</span> processed_marker<span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">[</span><span class="n">10</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  <span class="c">// zero processed_marker, I'll leave this up to you.</span></td></tr><tr><td class="number">8</td><td>  number_of_blocks_touching_recurisve<span class="k2">(</span> table_of_blocks<span class="k2">[</span>row<span class="k2">]</span><span class="k2">[</span>column<span class="k2">]</span>, row, column, count, processed_marker <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">return</span> count<span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k2">}</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="k1">void</span> number_of_blocks_touching_recursive<span class="k2">(</span> <span class="k1">int</span> orig, <span class="k1">int</span> row, <span class="k1">int</span> column, <span class="k1">int</span><span class="k3">&amp;</span> count, <span class="k1">bool</span><span class="k3">*</span> processed_marker<span class="k2">[</span><span class="n">10</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>  <span class="k1">if</span> <span class="k2">(</span> row <span class="k3">&lt;</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> row <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">10</span> <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">if</span> <span class="k2">(</span> column <span class="k3">&lt;</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> column <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">10</span> <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">if</span> <span class="k2">(</span> processed_marker<span class="k2">[</span>row<span class="k2">]</span><span class="k2">[</span>column<span class="k2">]</span> <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  processed_marker<span class="k2">[</span>row<span class="k2">]</span><span class="k2">[</span>column<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><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">if</span> <span class="k2">(</span> table_of_blocks<span class="k2">[</span>row<span class="k2">]</span><span class="k2">[</span>column<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> orig <span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>  <span class="k3">+</span><span class="k3">+</span>count<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  number_of_blocks_touching_recurisve<span class="k2">(</span> orig, row-1, column, count, processed_marker <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  number_of_blocks_touching_recurisve<span class="k2">(</span> orig, row<span class="k3">+</span><span class="n">1</span>, column, count, processed_marker <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  number_of_blocks_touching_recurisve<span class="k2">(</span> orig, row, column-1, count, processed_marker <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  number_of_blocks_touching_recurisve<span class="k2">(</span> orig, row, column<span class="k3">+</span><span class="n">1</span>, count, processed_marker <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Of course, this algorithm is basically the exact same thing as floodfill. (Beware, there are probabily syntax errors and such in that code, but I&#39;m too lazy to fix them right now <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> )</p><p>Edit:</p><p>DOH! Beaten. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Carrus85)</author>
		<pubDate>Thu, 25 May 2006 22:55:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ooooh, I didn&#39;t realize floodfill would take care of the adjacent block too.  Can you see the light bulb above my head.</p><p>Thanks alot.  </p><p>I&#39;m glad I asked.  <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Recorder)</author>
		<pubDate>Thu, 25 May 2006 23:13:11 +0000</pubDate>
	</item>
</rss>
