<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[C++] Good coding practices?</title>
		<link>http://www.allegro.cc/forums/view/600126</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 05 May 2009 20:46:36 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>before I convert my Malefiz project from C to C++, I thought I should brush up my C++/OOP skills with a smaller project first, so I&#039;ve converted a 1P tic-tac-toe game I wrote in C yesterday to C++.</p><p>Could someone check through it to see if there&#039;s anything that stands out as being bad coding?  It works, which is good, and I get no warnings, but I&#039;d like to make sure I eliminate any bad C habits I have before I embark on something bigger.</p><p>I&#039;ve attached the code, plus a Windows binary, but I&#039;ll paste the code here as well:</p><p>main.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  3</span><span class="p">#include "game.h"</span>
<span class="number">  4</span><span class="p">#include "player.h"</span>
<span class="number">  5</span><span class="p">#include "defines.h"</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <span class="k1">int</span> depth<span class="k2">;</span>  <span class="c">// colour depth</span>
<span class="number"> 14</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/install_mouse" target="_blank"><span class="a">install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>depth <span class="k3">=</span> <a href="http://www.allegro.cc/manual/desktop_color_depth" target="_blank"><span class="a">desktop_color_depth</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 21</span>        <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span>depth<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 23</span>
<span class="number"> 24</span>        cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Could not determine desktop colour depth."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span>
<span class="number"> 25</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, WIDTH, HEIGHT, WIDTH, HEIGHT<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>
<span class="number"> 31</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Failed to set graphics mode\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    game tictactoe<span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>    tictactoe.init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    tictactoe.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 42</span><span class="k2">}</span>
<span class="number"> 43</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
</div></div><p>

game.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef GAME_H</span>
<span class="number">  2</span><span class="p">#define GAME_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include "player.h"</span>
<span class="number">  6</span><span class="p">#include "types.h"</span>
<span class="number">  7</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">class</span> game <span class="k2">{</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    player_type board<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 15</span>    player_type current<span class="k2">;</span>
<span class="number"> 16</span>    player_type winner<span class="k2">;</span>
<span class="number"> 17</span>    player <span class="k3">*</span>noughts<span class="k2">;</span>
<span class="number"> 18</span>    player <span class="k3">*</span>crosses<span class="k2">;</span>
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">;</span>
<span class="number"> 20</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>back<span class="k2">;</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span>msg_font<span class="k2">;</span>
<span class="number"> 22</span>    <span class="k1">int</span> quit<span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    player_type play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k1">void</span> reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k1">void</span> draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">void</span> text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    player_type swap_player<span class="k2">(</span>player_type player<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k1">int</span> check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    position get_mouse_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    public:
<span class="number"> 33</span>
<span class="number"> 34</span>    <span class="k1">void</span> begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k1">void</span> init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>
<span class="number"> 40</span><span class="p">#endif</span>
</div></div><p>

game.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include "game.h"</span>
<span class="number">   2</span><span class="p">#include "defines.h"</span>
<span class="number">   3</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">   6</span>
<span class="number">   7</span>
<span class="number">   8</span><span class="k1">void</span> game::init<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">   9</span>
<span class="number">  10</span>    quit <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  11</span>    reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span>    noughts <span class="k3">=</span> <span class="k1">new</span> player<span class="k2">(</span>NOUGHT, <span class="s">"nought.bmp"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  14</span>    crosses <span class="k3">=</span> <span class="k1">new</span> player<span class="k2">(</span>CROSS, <span class="s">"cross.bmp"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>
<span class="number">  16</span>    buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number">  17</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  18</span>
<span class="number">  19</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Could not create buffer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  21</span>
<span class="number">  22</span>    <span class="k2">}</span>
<span class="number">  23</span>
<span class="number">  24</span>    back <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number">  25</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>back<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  26</span>
<span class="number">  27</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Could not create buffer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>
<span class="number">  30</span>    <span class="k2">}</span>
<span class="number">  31</span>
<span class="number">  32</span>    msg_font <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_font" target="_blank"><span class="a">load_font</span></a><span class="k2">(</span><span class="s">"font.pcx"</span>, NULL, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  33</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>msg_font<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  34</span>
<span class="number">  35</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error loading \"font.pcx\".\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span>    <span class="k2">}</span>
<span class="number">  38</span>
<span class="number">  39</span>    <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>back, WHITE<span class="k2">)</span><span class="k2">;</span>  <span class="c">// clear the background to white</span>
<span class="number">  40</span>
<span class="number">  41</span>    <span class="c">// draw the grid</span>
<span class="number">  42</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>back, EDGE <span class="k3">+</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE,  EDGE <span class="k3">+</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>back, EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE,  EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>back, EDGE, EDGE <span class="k3">+</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, EDGE <span class="k3">+</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  45</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>back, EDGE, EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  46</span>
<span class="number">  47</span>    <a href="http://www.allegro.cc/manual/show_mouse" target="_blank"><span class="a">show_mouse</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  48</span>
<span class="number">  49</span>    current <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number">  50</span>
<span class="number">  51</span><span class="k2">}</span>
<span class="number">  52</span>
<span class="number">  53</span><span class="k1">void</span> game::begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>
<span class="number">  55</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  56</span>
<span class="number">  57</span>        reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// set all positions to NONE</span>
<span class="number">  58</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">// draw the inital board state</span>
<span class="number">  59</span>
<span class="number">  60</span>        winner <span class="k3">=</span> play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// play until there is a winner</span>
<span class="number">  61</span>
<span class="number">  62</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// clears all messages drawn during game</span>
<span class="number">  63</span>        <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number">  64</span>            text<span class="k2">(</span><span class="n">11</span>, <span class="n">175</span>, <span class="s">"Player O wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number">  66</span>            text<span class="k2">(</span><span class="n">11</span>, <span class="n">175</span>, <span class="s">"Player X wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>        <span class="k1">else</span>
<span class="number">  68</span>            text<span class="k2">(</span><span class="n">11</span>, <span class="n">175</span>, <span class="s">"Nobody wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>        text<span class="k2">(</span><span class="n">11</span>, <span class="n">190</span>, <span class="s">"Play again? (Y/N)"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>
<span class="number">  71</span>        <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span><span class="k2">;</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  72</span>
<span class="number">  73</span>            <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_ESC<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_N<span class="k2">]</span><span class="k2">)</span>  <span class="k2">{</span>
<span class="number">  74</span>
<span class="number">  75</span>                quit <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">// signal to exit program</span>
<span class="number">  76</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number">  77</span>
<span class="number">  78</span>            <span class="k2">}</span>
<span class="number">  79</span>
<span class="number">  80</span>            <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_Y<span class="k2">]</span><span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span> <span class="c">// return to main loop</span>
<span class="number">  81</span>
<span class="number">  82</span>            <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number">  83</span>
<span class="number">  84</span>        <span class="k2">}</span>
<span class="number">  85</span>
<span class="number">  86</span>    <span class="k2">}</span>
<span class="number">  87</span>
<span class="number">  88</span>
<span class="number">  89</span><span class="k2">}</span>
<span class="number">  90</span>
<span class="number">  91</span>player_type game::play<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  92</span>
<span class="number">  93</span>    position <a href="http://www.allegro.cc/manual/mouse_pos" target="_blank"><span class="a">mouse_pos</span></a><span class="k2">;</span>     <span class="c">// the mouse position in board coordinates rather than screen coordinates</span>
<span class="number">  94</span>    <span class="k1">int</span> turn_over <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>      <span class="c">// variable for determining when current turn is over</span>
<span class="number">  95</span>    <span class="k1">int</span> game_over <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>      <span class="c">// variable for determining when current game is over</span>
<span class="number">  96</span>    <span class="k1">int</span> mouse_released <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// needed to stop multiple clicks from registering if mouse button held down</span>
<span class="number">  97</span>    <span class="k1">int</span> pieces <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>         <span class="c">// number of pieces placed on the board</span>
<span class="number">  98</span>
<span class="number">  99</span>    <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 100</span>
<span class="number"> 101</span>        turn_over <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>  <span class="c">// turn begins</span>
<span class="number"> 102</span>
<span class="number"> 103</span>        <span class="k1">if</span> <span class="k2">(</span>current <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 104</span>            text<span class="k2">(</span><span class="n">11</span>, <span class="n">175</span>, <span class="s">"Player O's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>        <span class="k1">else</span>
<span class="number"> 106</span>            text<span class="k2">(</span><span class="n">11</span>, <span class="n">175</span>, <span class="s">"Player X's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span>        <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_ESC<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// player signals to exit program</span>
<span class="number"> 109</span>
<span class="number"> 110</span>            game_over <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 111</span>            quit <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 112</span>
<span class="number"> 113</span>        <span class="k2">}</span>
<span class="number"> 114</span>
<span class="number"> 115</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span>  <span class="c">// mouse button not held down</span>
<span class="number"> 116</span>            mouse_released <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span>        <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_released<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 119</span>
<span class="number"> 120</span>            <a href="http://www.allegro.cc/manual/mouse_pos" target="_blank"><span class="a">mouse_pos</span></a> <span class="k3">=</span> get_mouse_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// get mouse position in board coordinates</span>
<span class="number"> 121</span>
<span class="number"> 122</span>            <span class="k1">if</span> <span class="k2">(</span>mouse_pos.x <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.x <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">2</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// only do if mouse over playable area</span>
<span class="number"> 123</span>
<span class="number"> 124</span>                <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>mouse_pos.y<span class="k2">]</span><span class="k2">[</span>mouse_pos.x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NONE<span class="k2">)</span> <span class="k2">{</span>  <span class="c">// check that square is currently empty</span>
<span class="number"> 125</span>
<span class="number"> 126</span>                    board<span class="k2">[</span>mouse_pos.y<span class="k2">]</span><span class="k2">[</span>mouse_pos.x<span class="k2">]</span> <span class="k3">=</span> current<span class="k2">;</span>  <span class="c">// player's piece is placed</span>
<span class="number"> 127</span>                    turn_over <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>  <span class="c">// turn is now over</span>
<span class="number"> 128</span>                    pieces<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>  <span class="c">// increment the number of pieces on the board</span>
<span class="number"> 129</span>
<span class="number"> 130</span>                <span class="k2">}</span>
<span class="number"> 131</span>
<span class="number"> 132</span>            <span class="k2">}</span>
<span class="number"> 133</span>
<span class="number"> 134</span>            mouse_released <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>  <span class="c">// mouse has been held down</span>
<span class="number"> 135</span>
<span class="number"> 136</span>        <span class="k2">}</span>
<span class="number"> 137</span>
<span class="number"> 138</span>        <span class="k1">if</span><span class="k2">(</span>check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 139</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>            <span class="k1">return</span> current<span class="k2">;</span>  <span class="c">// if the game has been won, return the current player</span>
<span class="number"> 141</span>        <span class="k2">}</span>
<span class="number"> 142</span>
<span class="number"> 143</span>        <span class="k1">if</span> <span class="k2">(</span>pieces <span class="k3">=</span><span class="k3">=</span> <span class="n">9</span><span class="k2">)</span> <span class="k1">return</span> NONE<span class="k2">;</span>  <span class="c">// if all squares are filled, return NONE</span>
<span class="number"> 144</span>
<span class="number"> 145</span>        <span class="k1">if</span><span class="k2">(</span>turn_over<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 146</span>
<span class="number"> 147</span>            current <span class="k3">=</span> swap_player<span class="k2">(</span>current<span class="k2">)</span><span class="k2">;</span>  <span class="c">// switch players</span>
<span class="number"> 148</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// draw the new board layout</span>
<span class="number"> 149</span>
<span class="number"> 150</span>        <span class="k2">}</span>
<span class="number"> 151</span>
<span class="number"> 152</span>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number"> 153</span>
<span class="number"> 154</span>    <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>    <span class="k1">return</span> NONE<span class="k2">;</span> <span class="c">// return NONE if player has quit game</span>
<span class="number"> 157</span>
<span class="number"> 158</span><span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span>
<span class="number"> 161</span><span class="k1">void</span> game::draw_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 162</span>
<span class="number"> 163</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 164</span>
<span class="number"> 165</span>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>back, buffer, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, back-&gt;w, back-&gt;h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>
<span class="number"> 167</span>    <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 168</span>
<span class="number"> 169</span>        <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 170</span>
<span class="number"> 171</span>            <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 172</span>                noughts-&gt;draw<span class="k2">(</span>buffer, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>            <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number"> 174</span>                crosses-&gt;draw<span class="k2">(</span>buffer, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span>
<span class="number"> 176</span>        <span class="k2">}</span>
<span class="number"> 177</span>
<span class="number"> 178</span>    <span class="k2">}</span>
<span class="number"> 179</span>
<span class="number"> 180</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 181</span>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, buffer-&gt;w, buffer-&gt;h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 182</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 183</span>
<span class="number"> 184</span><span class="k2">}</span>
<span class="number"> 185</span>
<span class="number"> 186</span>
<span class="number"> 187</span><span class="k1">void</span> game::reset_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 188</span>
<span class="number"> 189</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 190</span>
<span class="number"> 191</span>  <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 192</span>
<span class="number"> 193</span>      <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 194</span>             board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> NONE<span class="k2">;</span>
<span class="number"> 195</span>
<span class="number"> 196</span>    <span class="k2">}</span>
<span class="number"> 197</span>
<span class="number"> 198</span><span class="k2">}</span>
<span class="number"> 199</span>
<span class="number"> 200</span>
<span class="number"> 201</span><span class="k1">void</span> game::text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 202</span>
<span class="number"> 203</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 204</span>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, msg_font, x, y, BLACK, <span class="k3">-</span><span class="n">1</span>, msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 205</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 206</span>
<span class="number"> 207</span><span class="k2">}</span>
<span class="number"> 208</span>
<span class="number"> 209</span>
<span class="number"> 210</span>player_type game::swap_player<span class="k2">(</span>player_type player<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 211</span>
<span class="number"> 212</span>    player_type new_player<span class="k2">;</span>
<span class="number"> 213</span>
<span class="number"> 214</span>    <span class="k1">if</span> <span class="k2">(</span>player <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 215</span>        new_player <span class="k3">=</span> CROSS<span class="k2">;</span>
<span class="number"> 216</span>    <span class="k1">else</span>
<span class="number"> 217</span>        new_player <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number"> 218</span>
<span class="number"> 219</span>    <span class="k1">return</span> new_player<span class="k2">;</span>
<span class="number"> 220</span>
<span class="number"> 221</span><span class="k2">}</span>
<span class="number"> 222</span>
<span class="number"> 223</span>
<span class="number"> 224</span><span class="k1">int</span> game::check_win<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 225</span>
<span class="number"> 226</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number"> 227</span>
<span class="number"> 228</span>    <span class="k1">for</span> <span class="k2">(</span>n <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> n <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 229</span>
<span class="number"> 230</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>  <span class="c">// all 3 squares in a row are the same</span>
<span class="number"> 231</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>  <span class="c">// all 3 squares ina column are the same</span>
<span class="number"> 232</span>
<span class="number"> 233</span>    <span class="k2">}</span>
<span class="number"> 234</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>  <span class="c">// all 3 squares diagonally from top left are the same</span>
<span class="number"> 235</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>  <span class="c">// all 3 squares diagonally from bottom left are the same</span>
<span class="number"> 236</span>
<span class="number"> 237</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>  <span class="c">// no winner yet</span>
<span class="number"> 238</span>
<span class="number"> 239</span><span class="k2">}</span>
<span class="number"> 240</span>
<span class="number"> 241</span>
<span class="number"> 242</span>position game::get_mouse_pos<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 243</span>
<span class="number"> 244</span>    position temp<span class="k2">;</span>
<span class="number"> 245</span>
<span class="number"> 246</span>    temp.x <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>
<span class="number"> 247</span>    temp.y <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>
<span class="number"> 248</span>
<span class="number"> 249</span>    <span class="k1">return</span> temp<span class="k2">;</span>
<span class="number"> 250</span>
<span class="number"> 251</span><span class="k2">}</span>
</div></div><p>

player.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef PLAYER_H</span>
<span class="number">  2</span><span class="p">#define PLAYER_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include "types.h"</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">class</span> player <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    player_type type<span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    public:
<span class="number"> 17</span>
<span class="number"> 18</span>    player<span class="k2">(</span>player_type pt, <span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    ~player<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">void</span> draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>
<span class="number"> 25</span><span class="p">#endif</span>
</div></div><p>

player.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include "player.h"</span>
<span class="number">  2</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>
<span class="number">  7</span>player::player<span class="k2">(</span>player_type pt, <span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>
<span class="number">  9</span>    type <span class="k3">=</span> pt<span class="k2">;</span>
<span class="number"> 10</span>    bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>filename, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error loading \"%s\".\n"</span>, filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    <span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span>
<span class="number"> 21</span>player::~player<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span><span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span>
<span class="number"> 28</span><span class="k1">void</span> player::draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>dest, bmp, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span><span class="k2">}</span>
</div></div><p>

types.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef TYPES_H</span>
<span class="number">  2</span><span class="p">#define TYPES_H</span>
<span class="number">  3</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">typedef</span> <span class="k1">enum</span> <span class="k2">{</span> NONE, NOUGHT, CROSS<span class="k2">}</span> player_type<span class="k2">;</span>  <span class="c">// enumerated constants for the player type</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">struct</span> position <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">int</span> y<span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="p">#endif</span>
</div></div><p>

defines.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef DEFINES_H</span>
<span class="p">#define DEFINES_H</span>


<span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>


<span class="p">#define WIDTH 172   // the width of the window</span>
<span class="p">#define HEIGHT 232  // the height of the window</span>
<span class="p">#define EDGE 11     // the size of the gap between the window edge and teh board</span>
<span class="p">#define SQUARE 50   // the size of each square on the board</span>
<span class="p">#define WHITE makecol(255, 255, 255)</span>
<span class="p">#define BLACK makecol(0, 0, 0)</span>


<span class="p">#endif</span>
</pre></div></div><p>

edit: fixed some of the code formatting.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 07:51:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have some suggestions, it is just mho.</p><p>I never use &quot;using namespace std&quot;, always use the prefix std::, because if some day you want to create some namespaces you wont get lost if there are things with the same name as std::, I took this from a book <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Another thing is that I use class names starting with uppercase letters. So player becomes Player, and I could use Player player <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>In class I put the &quot;private:&quot; and &quot;public:&quot;, it makes your class header looks better <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>Things you can initialize and dont need to worry if it fails or not, I usually put on the class constructor, like initialing variables. Try to avoid doing tests and using exit at constructors or destructors.</p><p>I could be wrong on some advices, I am still learning C++ <img src="http://www.allegro.cc/forums/smileys/lipsrsealed.gif" alt=":-X" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (brunooo)</author>
		<pubDate>Sun, 03 May 2009 08:28:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809376#target">brunooo</a> said:</div><div class="quote"><p>I never use &quot;using namespace std&quot;, always use the prefix std::, because if some day you want to create some namespaces you wont get lost if there are things with the same name as std::, I took this from a book</p></div></div><p>

I haven&#39;t really looked into namespaces yet.  They didn&#39;t exist when I learnt C++.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>In class I put the &quot;private:&quot; and &quot;public:&quot;, it makes your class header looks better</p></div></div><p>

No offense, but it&#39;s actually a pet hate of mine when people do that.   By default, all members of a class are private, so adding the private keyword is superfluous.  </p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Things you can initialize and dont need to worry if it fails or not, I usually put on the class constructor, like initialing variables. </p></div></div><p>

I actually changed the game::init function to game::game just after posting that. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 08:37:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809377#target">LennyLen</a> said:</div><div class="quote"><p>No offense, but it&#39;s actually a pet hate of mine when people do that. By default, all members of a class are private, so adding the private keyword is superfluous.</p></div></div><p>I do it because I prefer to put all public stuff first.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> FooBarFrob <span class="k2">{</span>
   public:
      FooBarFrob<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
      <span class="k1">void</span> doSomething<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

   private:
      <span class="k1">int</span> someVar<span class="k2">;</span>

<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 03 May 2009 08:40:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809376#target">brunooo</a> said:</div><div class="quote"><p>
I never use &quot;using namespace std&quot;, always use the prefix std::, because if some day you want to create some namespaces you wont get lost if there are things with the same name as std::, I took this from a book <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div></div><p>
There is some truth to that but the chances that you will write a class that conflict with the std:: namespace is quite low. Its usually more convenient to do &#39;using namespace std&#39;, but its your call.</p><p>I wouldn&#39;t use #define anymore. Use const int instead. The reason is just so you can have better type checking (and macros are evil).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Sun, 03 May 2009 08:43:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809379#target">kazzmir</a> said:</div><div class="quote"><p>I wouldn&#39;t use #define anymore. Use const int instead. The reason is just so you can have better type checking.</p></div></div><p>Or enums.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 03 May 2009 08:44:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, that looks OK. As Brunooo suggested, you may wish to tag C++ library functions with std:: instead of defining &quot;using namespace std&quot; at the start in case you want to use other namespaces.</p><p>When I create objects, I add T_ to the name of the object class and capitalize any first letters. So if I wanted to make a gamestate object class, I would call it T_GameState. &#39;T&#39; stands for &quot;Type&quot; and is sort of a hold-over from my days programming in BASIC, not to mention a friend of mine who helped me to learn Pascal and C++ also did this.</p><p>It&#39;s almost always good to create constructors for your classes to initialize all the variables they hold. But, as for destructors, unless you do something which allocates memory from within a class object, they&#39;re unnecessary.</p><p>If you put any Allegro functions within the destructor though, make sure you don&#39;t make any global declarations of that class object, nor create them automatically within the scope of main(). If you do this, and quit the program, the destructors will be called and Allegro functions may end up being called AFTER Allegro has been removed from memory!</p><p>Other things you will need to adapt to are the C++ try/throw/catch method of error handling and the memory allocation keywords. You can use C error handling in C++ up until you need to error check C++ functions, at which point you&#39;ll need to use a &quot;try&quot; block to trap errors, a &quot;catch&quot; block to handle them, and &quot;throw&quot; keywords to continue passing error handling to additional catch blocks. You&#39;ll also be seeing a lot of the &quot;new&quot;, &quot;delete&quot;, and &quot;delete []&quot; keywords for allocating memory much more easily than malloc() ever was. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>That&#39;s my advice. Take what you will, leave what you won&#39;t, and regardless of anything, just code the way that works for you. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sun, 03 May 2009 08:51:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809378#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>I do it because I prefer to put all public stuff first.</p></div></div><p>

So why don&#39;t you use struct instead of class?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809379#target">kazzmir</a> said:</div><div class="quote"><p>I wouldn&#39;t use #define anymore. Use const int instead.</p></div></div><p>

That seemed kinda &#39;global variablish,&#39; though I guess a define that everyone accesses is similar.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>and macros are evil</p></div></div><p>

How so?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809380#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>Or enums.</p></div></div><p>

Like this: <span class="source-code"><span class="k1">typedef</span> <span class="k1">enum</span> <span class="k2">{</span> WIDTH <span class="k3">=</span> <span class="n">200</span>, HEIGHT <span class="k3">=</span> <span class="n">400</span><span class="k2">}</span> window_size<span class="k2">;</span></span>?</p><p>edit: Also, I get sick of typing makecol(255, 255, 255) every time I want white, so I use <span class="source-code"><span class="p">#define WHITE makecol(255, 255, 255)</span></span>  how ould you avoid that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 08:56:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809382#target">LennyLen</a> said:</div><div class="quote"><p>So why don&#39;t you use struct instead of class?</p></div></div><p>Because as a long time C coder, that would just confuse me <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> IMO a struct is for simple aggregate types, and a class is for complex types.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Like this: typedef enum { WIDTH = 200, HEIGHT = 400} window_size;?</p></div></div><p>for that enum I&#39;d skip the name, and make it an anonymous enum, but I&#39;m not sure how many compilers support that (mind you I don&#39;t care, I only use GCC).</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Also, I get sick of typing makecol(255, 255, 255) every time I want white, so I use #define WHITE makecol(255, 255, 255) how ould you avoid that?</p></div></div><p>Yeah, you really can&#39;t do that with <span class="source-code"><span class="k1">const</span> <span class="k1">int</span></span>s afaik, as I think they need to be initialized when they are declared.. But if not, just init them after set_gfx_mode (setting the mode will generally change the format that makecol generates).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 03 May 2009 09:22:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Putting aside the pointless style issues, you have a few things that concern me.</p><p>First off, though, your class design is pretty good. Your types adhere to a standard and your names are coherent and all that good stuff. So good job there.</p><p>But I think using player_type for everything is a little misleading. I would expect player_type to be a member of the player class, not something you have a 3x3 grid of in your game class.</p><p>Also, I think you could stand to break up your responsibilities a little more. The game class should be concerned with the high-level flow, and delegate to more specific classes. For example, buffer should be stored in a class like renderer or view.</p><p>I also noticed you&#39;re using an int in a lot of places where they only hold a 1 or a 0. We have a data type for that now: it&#39;s called bool.</p><p>You also have a worrying amount of inline arithmetic using numeric literals. You should replace those with constants, because a) then you know what 5 actually symbolizes, and b) if you have to change it, it&#39;s just in one spot.</p><p>You also have a worrying amount of (really long!) ifs. Some even have comments describing what it does, which is a clear sign that it needs to be refactored, probably into a function with a name similar to the comment itself.</p><p>There&#39;s also a fair amount of code that looks like it was copy-and-pasted. This is a usual sign that you need to make that into its own function. Whatever bits change from copy to copy become the parameters.</p><p>Also, when you&#39;re doing a critical action like placing a piece, you should definitely break that into its own function, because it communicates that this action is one the fundamental actions the class takes. (Make sure the function is parametrized, too!)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sun, 03 May 2009 09:24:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809379#target">kazzmir</a> said:</div><div class="quote"><p>There is some truth to that but the chances that you will write a class that conflict with the std:: namespace is quite low.</p></div></div><p>

Allegro 5 does this in some cases. The following program won&#39;t compile in MSVC9:</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;allegro5/allegro5.h&gt;</span>

<span class="p">#include &lt;iostream&gt;</span>
<span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">bool</span> test<span class="k2">;</span>
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
<a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
</pre></div></div><p>

Allegro 5 redefines &quot;bool&quot; to &quot;_Bool&quot;, which conflicts with std::_Bool, which is apparently just part of MSVC&#39;s standard library implementation, since the above code compiles fine on G++.</p><p>The total namespace dump can indeed cause problems, and so should be used with caution if at all.  <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mr. Accident)</author>
		<pubDate>Sun, 03 May 2009 09:53:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>At least under Windows using MSVC6, the bool object type still takes up 32-bits, just like an int. There&#39;s almost no reason to use bools unless you want to force the use of true and false keywords. If the Visual C++ 6.0 optimizer is able to group bools together I&#39;ve never seen it mentioned anywhere in the MSDN libraries.</p><p>Not to mention, many times when I make a variable that initially only has two states, I find later I want that variable to have more states. For example, in my current project, I have a &quot;paused&quot; variable. For weeks now, it only changed between 1 and 0. However, now that I&#39;ve got task switching working, which automatically pauses, I had to make a way of detecting stuck keys as a result of a keyboard-shortcut task switch. I found the best way to handle this was to allow &quot;paused&quot; to equal 2, and to run a scan when it does and set itself back to 1 if the scan detects no stuck keys.</p><p>If I was using bools, I&#39;d have to either change it to an int and all the true/false references to 1&#39;s and 0&#39;s, or make a new variable, take up another 4 bytes of memory, and add more initialization code for the variable and checking to make sure it&#39;s set properly.</p><p>My opinion: Stick with ints. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sun, 03 May 2009 09:57:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Because as a long time C coder, that would just confuse me  IMO a struct is for simple aggregate types, and a class is for complex types.</p></div></div><p>

Fair enough.  While I prefer C myself, I actually learnt C++ first, so I still see class/struct as being the same thing but just with different default permissions.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>But I think using player_type for everything is a little misleading. I would expect player_type to be a member of the player class, not something you have a 3x3 grid of in your game class.</p></div></div><p>

Yeah, that was a throwback to an earlier design choice.  I&#039;ve removed the player class.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>I also noticed you&#039;re using an int in a lot of places where they only hold a 1 or a 0. We have a data type for that now: it&#039;s called bool.</p></div></div><p>

Oh yeah! I meant to look for those and change them. Thanks for the reminder.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>You also have a worrying amount of inline arithmetic using numeric literals. You should replace those with constants, because a) then you know what 5 actually symbolizes, and b) if you have to change it, it&#039;s just in one spot.</p></div></div><p>

Fixed. That was me being lazy.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>You also have a worrying amount of (really long!) ifs. Some even have comments describing what it does, which is a clear sign that it needs to be refactored, probably into a function with a name similar to the comment itself.</p></div></div><p>

This I do intentionally as I find long ifs less confusing than nested if statements.  I know most people find the opposite to be true, but it makes it easier for me.  Or did you mean the longer nested ifs?  I moved one of them to its own function.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>There&#039;s also a fair amount of code that looks like it was copy-and-pasted. This is a usual sign that you need to make that into its own function. Whatever bits change from copy to copy become the parameters.</p></div></div><p>

I must have fixed that already, as I can&#039;t find any reperated code in the current state.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Also, when you&#039;re doing a critical action like placing a piece, you should definitely break that into its own function, because it communicates that this action is one the fundamental actions the class takes. (Make sure the function is parametrized, too!)</p></div></div><p>

Good point.  Done!</p><p>updated code:</p><p>main.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  3</span><span class="p">#include "game.h"</span>
<span class="number">  4</span><span class="p">#include "defines.h"</span>
<span class="number">  5</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>
<span class="number">  9</span>    <span class="k1">int</span> depth<span class="k2">;</span>  <span class="c">// colour depth</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/install_mouse" target="_blank"><span class="a">install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>depth <span class="k3">=</span> <a href="http://www.allegro.cc/manual/desktop_color_depth" target="_blank"><span class="a">desktop_color_depth</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 17</span>        <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span>depth<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 19</span>
<span class="number"> 20</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Could not determine desktop colour depth."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 21</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, WIDTH, HEIGHT, WIDTH, HEIGHT<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>
<span class="number"> 26</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Failed to set graphics mode\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    <span class="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    game tictactoe<span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    tictactoe.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
</div></div><p>

game.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef GAME_H</span>
<span class="number">  2</span><span class="p">#define GAME_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include "graphic.h"</span>
<span class="number">  6</span><span class="p">#include "types.h"</span>
<span class="number">  7</span><span class="p">#include "mouse.h"</span>
<span class="number">  8</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="k1">class</span> game <span class="k2">{</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    player_type board<span class="k2">[</span>GRIDSIZE<span class="k2">]</span><span class="k2">[</span>GRIDSIZE<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 13</span>    player_type current<span class="k2">;</span>
<span class="number"> 14</span>    player_type winner<span class="k2">;</span>
<span class="number"> 15</span>    graphic <span class="k3">*</span>noughts<span class="k2">;</span>
<span class="number"> 16</span>    graphic <span class="k3">*</span>crosses<span class="k2">;</span>
<span class="number"> 17</span>    graphic <span class="k3">*</span>buffer<span class="k2">;</span>
<span class="number"> 18</span>    graphic <span class="k3">*</span>back<span class="k2">;</span>
<span class="number"> 19</span>    graphic <span class="k3">*</span>scr<span class="k2">;</span>
<span class="number"> 20</span>    <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span>msg_font<span class="k2">;</span>
<span class="number"> 21</span>    <span class="k1">bool</span> quit<span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    player_type play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="k1">void</span> reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k1">void</span> update_board<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, player_type player<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k1">void</span> draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">void</span> text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    player_type swap_player<span class="k2">(</span>player_type player<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k1">bool</span> check_mouse<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    <span class="k1">bool</span> check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    public:
<span class="number"> 33</span>
<span class="number"> 34</span>    game<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k1">void</span> begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>
<span class="number"> 40</span><span class="p">#endif</span>
</div></div><p>

game.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include "game.h"</span>
<span class="number">   2</span><span class="p">#include "defines.h"</span>
<span class="number">   3</span>
<span class="number">   4</span>
<span class="number">   5</span>game::game<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">   6</span>
<span class="number">   7</span>    quit <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">   8</span>    reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">   9</span>
<span class="number">  10</span>    noughts <span class="k3">=</span> <span class="k1">new</span> graphic<span class="k2">(</span><span class="s">"nought.bmp"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  11</span>    crosses <span class="k3">=</span> <span class="k1">new</span> graphic<span class="k2">(</span><span class="s">"cross.bmp"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  12</span>    buffer <span class="k3">=</span> <span class="k1">new</span> graphic<span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number">  13</span>    back <span class="k3">=</span> <span class="k1">new</span> graphic<span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number">  14</span>    scr <span class="k3">=</span> <span class="k1">new</span> graphic<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>
<span class="number">  16</span>    msg_font <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_font" target="_blank"><span class="a">load_font</span></a><span class="k2">(</span><span class="s">"font.pcx"</span>, NULL, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  17</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>msg_font<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  18</span>
<span class="number">  19</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error loading \"font.pcx\".\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  21</span>    <span class="k2">}</span>
<span class="number">  22</span>
<span class="number">  23</span>    back-&gt;clear<span class="k2">(</span>WHITE<span class="k2">)</span><span class="k2">;</span>  <span class="c">// clear the background to white</span>
<span class="number">  24</span>
<span class="number">  25</span>    <span class="c">// draw the grid</span>
<span class="number">  26</span>    back-&gt;rect<span class="k2">(</span>EDGE <span class="k3">+</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE,  EDGE <span class="k3">+</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  27</span>    back-&gt;rect<span class="k2">(</span>EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE,  EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>    back-&gt;rect<span class="k2">(</span>EDGE, EDGE <span class="k3">+</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, EDGE <span class="k3">+</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>    back-&gt;rect<span class="k2">(</span>EDGE, EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">-</span> <span class="n">1</span>, EDGE <span class="k3">+</span> <span class="n">3</span> <span class="k3">*</span> SQUARE, EDGE <span class="k3">+</span> <span class="n">2</span> <span class="k3">*</span> SQUARE <span class="k3">+</span> <span class="n">1</span>, BLACK<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span>    <a href="http://www.allegro.cc/manual/show_mouse" target="_blank"><span class="a">show_mouse</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>
<span class="number">  33</span>    current <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="k2">}</span>
<span class="number">  36</span>
<span class="number">  37</span>
<span class="number">  38</span><span class="k1">void</span> game::begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  39</span>
<span class="number">  40</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  41</span>
<span class="number">  42</span>        reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// set all positions to NONE</span>
<span class="number">  43</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">// draw the inital board state</span>
<span class="number">  44</span>
<span class="number">  45</span>        winner <span class="k3">=</span> play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// play until there is a winner</span>
<span class="number">  46</span>
<span class="number">  47</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// clears all messages drawn during game</span>
<span class="number">  48</span>        <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number">  49</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player O wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number">  51</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player X wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  52</span>        <span class="k1">else</span>
<span class="number">  53</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Nobody wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>        text<span class="k2">(</span>EDGE, TEXTLINE2, <span class="s">"Play again? (Y/N)"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>
<span class="number">  56</span>        <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span><span class="k2">;</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  57</span>
<span class="number">  58</span>            <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_ESC<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_N<span class="k2">]</span><span class="k2">)</span>  <span class="k2">{</span>
<span class="number">  59</span>
<span class="number">  60</span>                quit <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">// signal to exit program</span>
<span class="number">  61</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number">  62</span>
<span class="number">  63</span>            <span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>            <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_Y<span class="k2">]</span><span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span> <span class="c">// return to main loop</span>
<span class="number">  66</span>
<span class="number">  67</span>            <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number">  68</span>
<span class="number">  69</span>        <span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span>    <span class="k2">}</span>
<span class="number">  72</span>
<span class="number">  73</span><span class="k2">}</span>
<span class="number">  74</span>
<span class="number">  75</span>player_type game::play<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  76</span>
<span class="number">  77</span>    <span class="k1">bool</span> turn_over<span class="k2">;</span>      <span class="c">// variable for determining when current turn is over</span>
<span class="number">  78</span>    <span class="k1">bool</span> game_over <span class="k3">=</span> FALSE<span class="k2">;</span>      <span class="c">// variable for determining when current game is over</span>
<span class="number">  79</span>    <span class="k1">int</span> pieces <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>         <span class="c">// number of pieces placed on the board</span>
<span class="number">  80</span>
<span class="number">  81</span>    <span class="k1">do</span> <span class="k2">{</span>
<span class="number">  82</span>
<span class="number">  83</span>        turn_over <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// turn begins</span>
<span class="number">  84</span>
<span class="number">  85</span>        <span class="k1">if</span> <span class="k2">(</span>current <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number">  86</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player O's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>        <span class="k1">else</span>
<span class="number">  88</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player X's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span>        <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_ESC<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// player signals to exit program</span>
<span class="number">  91</span>
<span class="number">  92</span>            game_over <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number">  93</span>            quit <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number">  94</span>
<span class="number">  95</span>        <span class="k2">}</span>
<span class="number">  96</span>
<span class="number">  97</span>        <span class="k1">if</span> <span class="k2">(</span>check_mouse<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  98</span>
<span class="number">  99</span>            turn_over <span class="k3">=</span> TRUE<span class="k2">;</span>  <span class="c">// turn is now over</span>
<span class="number"> 100</span>            pieces<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>  <span class="c">// increment the number of pieces on the board</span>
<span class="number"> 101</span>
<span class="number"> 102</span>        <span class="k2">}</span>
<span class="number"> 103</span>
<span class="number"> 104</span>        <span class="k1">if</span><span class="k2">(</span>check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 105</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>            <span class="k1">return</span> current<span class="k2">;</span>  <span class="c">// if the game has been won, return the current player</span>
<span class="number"> 107</span>        <span class="k2">}</span>
<span class="number"> 108</span>
<span class="number"> 109</span>        <span class="k1">if</span> <span class="k2">(</span>pieces <span class="k3">=</span><span class="k3">=</span> NUMSQUARES<span class="k2">)</span> <span class="k1">return</span> NONE<span class="k2">;</span>  <span class="c">// if all squares are filled, return NONE</span>
<span class="number"> 110</span>
<span class="number"> 111</span>        <span class="k1">if</span><span class="k2">(</span>turn_over<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 112</span>
<span class="number"> 113</span>            current <span class="k3">=</span> swap_player<span class="k2">(</span>current<span class="k2">)</span><span class="k2">;</span>  <span class="c">// switch players</span>
<span class="number"> 114</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// draw the new board layout</span>
<span class="number"> 115</span>
<span class="number"> 116</span>        <span class="k2">}</span>
<span class="number"> 117</span>
<span class="number"> 118</span>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number"> 119</span>
<span class="number"> 120</span>    <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span>    <span class="k1">return</span> NONE<span class="k2">;</span> <span class="c">// return NONE if player has quit game</span>
<span class="number"> 123</span>
<span class="number"> 124</span><span class="k2">}</span>
<span class="number"> 125</span>
<span class="number"> 126</span>
<span class="number"> 127</span><span class="k1">void</span> game::draw_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 128</span>
<span class="number"> 129</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</span>    back-&gt;blit_to<span class="k2">(</span>buffer, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>
<span class="number"> 133</span>    <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 134</span>
<span class="number"> 135</span>        <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 136</span>
<span class="number"> 137</span>            <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 138</span>                noughts-&gt;blit_to<span class="k2">(</span>buffer, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>            <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number"> 140</span>                crosses-&gt;blit_to<span class="k2">(</span>buffer, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>
<span class="number"> 142</span>        <span class="k2">}</span>
<span class="number"> 143</span>
<span class="number"> 144</span>    <span class="k2">}</span>
<span class="number"> 145</span>
<span class="number"> 146</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 147</span>    buffer-&gt;blit_to<span class="k2">(</span>scr, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 149</span>
<span class="number"> 150</span><span class="k2">}</span>
<span class="number"> 151</span>
<span class="number"> 152</span>
<span class="number"> 153</span><span class="k1">void</span> game::reset_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 154</span>
<span class="number"> 155</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 156</span>
<span class="number"> 157</span>  <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 158</span>
<span class="number"> 159</span>            <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 160</span>            board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> NONE<span class="k2">;</span>
<span class="number"> 161</span>
<span class="number"> 162</span>    <span class="k2">}</span>
<span class="number"> 163</span>
<span class="number"> 164</span><span class="k2">}</span>
<span class="number"> 165</span>
<span class="number"> 166</span>
<span class="number"> 167</span><span class="k1">void</span> game::text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 168</span>
<span class="number"> 169</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 170</span>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, msg_font, x, y, BLACK, <span class="k3">-</span><span class="n">1</span>, msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 171</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 172</span>
<span class="number"> 173</span><span class="k2">}</span>
<span class="number"> 174</span>
<span class="number"> 175</span>
<span class="number"> 176</span>player_type game::swap_player<span class="k2">(</span>player_type player<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 177</span>
<span class="number"> 178</span>    player_type new_player<span class="k2">;</span>
<span class="number"> 179</span>
<span class="number"> 180</span>    <span class="k1">if</span> <span class="k2">(</span>player <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 181</span>        new_player <span class="k3">=</span> CROSS<span class="k2">;</span>
<span class="number"> 182</span>    <span class="k1">else</span>
<span class="number"> 183</span>        new_player <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number"> 184</span>
<span class="number"> 185</span>    <span class="k1">return</span> new_player<span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span><span class="k2">}</span>
<span class="number"> 188</span>
<span class="number"> 189</span>
<span class="number"> 190</span><span class="k1">bool</span> game::check_win<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 191</span>
<span class="number"> 192</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number"> 193</span>
<span class="number"> 194</span>    <span class="k1">for</span> <span class="k2">(</span>n <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> n <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 195</span>
<span class="number"> 196</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares in a row are the same</span>
<span class="number"> 197</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares ina column are the same</span>
<span class="number"> 198</span>
<span class="number"> 199</span>    <span class="k2">}</span>
<span class="number"> 200</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares diagonally from top left are the same</span>
<span class="number"> 201</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares diagonally from bottom left are the same</span>
<span class="number"> 202</span>
<span class="number"> 203</span>    <span class="k1">return</span> FALSE<span class="k2">;</span>  <span class="c">// no winner yet</span>
<span class="number"> 204</span>
<span class="number"> 205</span><span class="k2">}</span>
<span class="number"> 206</span>
<span class="number"> 207</span>
<span class="number"> 208</span><span class="k1">bool</span> game::check_mouse<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 209</span>
<span class="number"> 210</span>    position <a href="http://www.allegro.cc/manual/mouse_pos" target="_blank"><span class="a">mouse_pos</span></a><span class="k2">;</span>     <span class="c">// the mouse position in board coordinates rather than screen coordinates</span>
<span class="number"> 211</span>    <span class="k1">static</span> <span class="k1">bool</span> mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span> <span class="c">// needed to stop multiple clicks from registering if mouse button held down</span>
<span class="number"> 212</span>
<span class="number"> 213</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span>  <span class="c">// mouse button not held down</span>
<span class="number"> 214</span>        mouse_released <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number"> 215</span>
<span class="number"> 216</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_released<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 217</span>
<span class="number"> 218</span>        mouse_pos.get_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// get mouse position in board coordinates</span>
<span class="number"> 219</span>
<span class="number"> 220</span>        <span class="k1">if</span> <span class="k2">(</span>mouse_pos.x <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.x <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">2</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">2</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// only do if mouse over playable area</span>
<span class="number"> 221</span>
<span class="number"> 222</span>            <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>mouse_pos.y<span class="k2">]</span><span class="k2">[</span>mouse_pos.x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NONE<span class="k2">)</span> <span class="k2">{</span>  <span class="c">// check that square is currently empty</span>
<span class="number"> 223</span>
<span class="number"> 224</span>                update_board<span class="k2">(</span>mouse_pos.x, mouse_pos.y, current<span class="k2">)</span><span class="k2">;</span>  <span class="c">// player's piece is placed</span>
<span class="number"> 225</span>                mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// mouse has been held down</span>
<span class="number"> 226</span>                <span class="k1">return</span> TRUE<span class="k2">;</span>
<span class="number"> 227</span>
<span class="number"> 228</span>            <span class="k2">}</span>
<span class="number"> 229</span>
<span class="number"> 230</span>        <span class="k2">}</span>
<span class="number"> 231</span>
<span class="number"> 232</span>        mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// mouse has been held down</span>
<span class="number"> 233</span>
<span class="number"> 234</span>    <span class="k2">}</span>
<span class="number"> 235</span>
<span class="number"> 236</span>    <span class="k1">return</span> FALSE<span class="k2">;</span>
<span class="number"> 237</span>
<span class="number"> 238</span><span class="k2">}</span>
<span class="number"> 239</span>
<span class="number"> 240</span>
<span class="number"> 241</span><span class="k1">void</span> game::update_board<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, player_type player<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 242</span>
<span class="number"> 243</span>    board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> player<span class="k2">;</span>
<span class="number"> 244</span>
<span class="number"> 245</span><span class="k2">}</span>
</div></div><p>

types.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef TYPES_H</span>
<span class="p">#define TYPES_H</span>


<span class="k1">typedef</span> <span class="k1">enum</span> <span class="k2">{</span> NONE, NOUGHT, CROSS <span class="k2">}</span> player_type<span class="k2">;</span>  <span class="c">// enumerated constants for the player type</span>
<span class="k1">typedef</span> <span class="k1">enum</span> <span class="k2">{</span> GRIDSIZE <span class="k3">=</span> <span class="n">3</span>, NUMSQUARES <span class="k3">=</span> <span class="n">9</span>, TEXTLINE1 <span class="k3">=</span> <span class="n">175</span>, TEXTLINE2 <span class="k3">=</span> <span class="n">190</span>, WIDTH <span class="k3">=</span> <span class="n">172</span>, HEIGHT <span class="k3">=</span> <span class="n">232</span>, EDGE <span class="k3">=</span> <span class="n">11</span>, SQUARE <span class="k3">=</span> <span class="n">50</span> <span class="k2">}</span> sizes<span class="k2">;</span>


<span class="p">#endif</span>
</pre></div></div><p>

defines.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef DEFINES_H</span>
<span class="p">#define DEFINES_H</span>


<span class="p">#define WHITE makecol(255, 255, 255)</span>
<span class="p">#define BLACK makecol(0, 0, 0)</span>


<span class="p">#endif&gt;</span>
</pre></div></div><p>

graphic.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef PLAYER_H</span>
<span class="number">  2</span><span class="p">#define PLAYER_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include "types.h"</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">class</span> graphic <span class="k2">{</span>
<span class="number">  9</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    public:
<span class="number"> 13</span>
<span class="number"> 14</span>    graphic<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    graphic<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    graphic<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    ~graphic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <span class="k1">void</span> draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>src, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">void</span> blit_to<span class="k2">(</span>graphic <span class="k3">*</span>dest, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">void</span> clear<span class="k2">(</span><span class="k1">int</span> color<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>    <span class="k1">void</span> <a href="http://www.allegro.cc/manual/rect" target="_blank"><span class="a">rect</span></a><span class="k2">(</span><span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2, <span class="k1">int</span> color<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>
<span class="number"> 26</span><span class="p">#endif</span>
</div></div><p>

graphic.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include "graphic.h"</span>
<span class="number">  2</span>
<span class="number">  3</span>
<span class="number">  4</span>graphic::graphic<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>
<span class="number">  6</span>    bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>filename, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>
<span class="number">  9</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error loading \"%s\".\n"</span>, filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    <span class="k2">}</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>
<span class="number"> 17</span>graphic::graphic<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error creating bitmap.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>    <span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span><span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>
<span class="number"> 30</span>graphic::graphic<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 31</span>
<span class="number"> 32</span>    bmp <span class="k3">=</span> dest<span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span><span class="k2">}</span>
<span class="number"> 35</span>
<span class="number"> 36</span>
<span class="number"> 37</span>graphic::~graphic<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>
<span class="number"> 39</span>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span><span class="k2">}</span>
<span class="number"> 42</span>
<span class="number"> 43</span>
<span class="number"> 44</span><span class="k1">void</span> graphic::draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>src, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 45</span>
<span class="number"> 46</span>    <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>bmp, src, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>
<span class="number"> 48</span><span class="k2">}</span>
<span class="number"> 49</span>
<span class="number"> 50</span>
<span class="number"> 51</span><span class="k1">void</span> graphic::blit_to<span class="k2">(</span>graphic <span class="k3">*</span>dest, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 52</span>
<span class="number"> 53</span>    dest-&gt;draw<span class="k2">(</span>bmp, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>
<span class="number"> 55</span><span class="k2">}</span>
<span class="number"> 56</span>
<span class="number"> 57</span>
<span class="number"> 58</span><span class="k1">void</span> graphic::clear<span class="k2">(</span><span class="k1">int</span> color<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 59</span>
<span class="number"> 60</span>    <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>bmp, color<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>
<span class="number"> 62</span><span class="k2">}</span>
<span class="number"> 63</span>
<span class="number"> 64</span>
<span class="number"> 65</span><span class="k1">void</span> graphic::rect<span class="k2">(</span><span class="k1">int</span> x1, <span class="k1">int</span> y1, <span class="k1">int</span> x2, <span class="k1">int</span> y2, <span class="k1">int</span> color<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 66</span>
<span class="number"> 67</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>bmp, x1, y1, x2, y2, color<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>
<span class="number"> 69</span><span class="k2">}</span>
</div></div><p>

mouse.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef MOUSE_H</span>
<span class="p">#define MOUSE_H</span>


<span class="k1">struct</span> position <span class="k2">{</span>

    <span class="k1">int</span> x<span class="k2">;</span>
    <span class="k1">int</span> y<span class="k2">;</span>

    <span class="k1">void</span> get_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

<span class="k2">}</span><span class="k2">;</span>


<span class="p">#endif</span>
</pre></div></div><p>

mouse.cpp:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;allegro.h&gt;</span>
<span class="p">#include "types.h"</span>
<span class="p">#include "mouse.h"</span>


<span class="k1">void</span> position::get_pos<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>

    x <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>
    y <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>

<span class="k2">}</span>
</pre></div></div><p>

I still have the two #defines for the makecol calls, but apart from that, I think I&#039;ve incorporated all suggestions.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 10:20:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should replace those exit(1) calls with throw&#39;ing some exception. You may just call exit(1) in the catch handler anyway but its good practice and there may actually be a time when you can do something about the exception being thrown.</p><p>Here is some quick code for using exceptions
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;exception&gt;</span>
<span class="number">  2</span><span class="k1">class</span> myexception: <span class="k1">public</span> std::exception<span class="k2">{</span>
<span class="number">  3</span>public:
<span class="number">  4</span>  myexception<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number">  5</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">void</span> blah<span class="k2">(</span><span class="k2">)</span> <span class="k1">throw</span> <span class="k2">(</span>myexception<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>   ...
<span class="number">  9</span>   <span class="k1">throw</span> myexception<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// note its not 'new myexception'</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">void</span> foo<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 13</span>   <span class="k1">try</span><span class="k2">{</span>
<span class="number"> 14</span>     blah<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>   <span class="k2">}</span> <span class="k1">catch</span> <span class="k2">(</span><span class="k1">const</span> myexception <span class="k3">&amp;</span> ex<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 16</span>     <span class="c">// do something</span>
<span class="number"> 17</span>   <span class="k2">}</span>
<span class="number"> 18</span><span class="k2">}</span>
</div></div><p>
Exceptions are nicer than sprinkled calls to exit because then your error handling is centralized.</p><p>BTW, macros are evil because they introduce errors that are not readily apparent from looking at the source. Imagine something like
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define foo "abcdef"</span>
<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
  <span class="k1">int</span> foo <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
  ...
<span class="k2">}</span>
</pre></div></div><p>
The error from g++ is
</p><div class="source-code snippet"><div class="inner"><pre>x.c: In function ‘<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>’<span class="k2">:</span>
x.c:3: error: expected unqualified-id before string constant
</pre></div></div><p>
If the #define was in a different header file you would be pretty confused for a while about this error. This almost exact situation happened to me when programming in windows land. Some system header file defined something like &#39;mode&#39; and caused all sorts of compilation errors when I tried to use it as a variable name.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Sun, 03 May 2009 10:36:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just fyi, I try to make the public/protected/private levels in my header files make sense in an orderly manner, as any other programmer should only have to look at the header rather than the accompanying cpp file.  In a project I&#39;m working on now, a third party engine has a class that integrates another third party engine and their code kind of looks like this: </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">class</span> BaseEntity_cl <span class="k2">:</span> <span class="k1">public</span> Engine_A_BaseEntity
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="c">// Engine_A Stuff</span>
<span class="number">  4</span>  public:
<span class="number">  5</span>    ...
<span class="number">  6</span>
<span class="number">  7</span>  protected:
<span class="number">  8</span>    ...
<span class="number">  9</span>
<span class="number"> 10</span>  <span class="c">// Engine_B Stuff</span>
<span class="number"> 11</span>  public:
<span class="number"> 12</span>    ...
<span class="number"> 13</span>
<span class="number"> 14</span>  protected:
<span class="number"> 15</span>    ...
<span class="number"> 16</span>
<span class="number"> 17</span>  <span class="c">// Engine_A and Engine_B conversion Stuff</span>
<span class="number"> 18</span>  public:
<span class="number"> 19</span>    ...
<span class="number"> 20</span>
<span class="number"> 21</span>  protected:
<span class="number"> 22</span>    ...
<span class="number"> 23</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

Wish I could talk about what the engines do, because they are pretty neat, but I&#39;m under contract. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sun, 03 May 2009 11:14:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809384#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p>
Because as a long time C coder, that would just confuse me <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> IMO a struct is for simple aggregate types, and a class is for complex types.
</p></div></div><p>

&quot;The only difference between structs and classes in C++ is that the members of a struct have public visibility by default, and the members of a class have private visibility by default.&quot;<span class="ref"><sup>[<a href="#">1</a>]</sup></span>
</p><div class="ref-block"><h2>References</h2><ol><li><a href="http://carcino.gen.nz/tech/cpp/struct_vs_class.php">http://carcino.gen.nz/tech/cpp/struct_vs_class.php</a></li></ol></div></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sun, 03 May 2009 11:17:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809391#target">kazzmir</a> said:</div><div class="quote"><p>You should replace those exit(1) calls with throw&#39;ing some exception.</p></div></div><p>

Could you give an example of how to do it with the main.cpp code I have?  Your example doesn&#39;t make much sense to me, and unfortunately neither do any of the online references I looked up.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 11:35:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809396#target">Schyfis</a> said:</div><div class="quote"><p>&quot;The only difference between structs and classes in C++ is that the members of a struct have public visibility by default, and the members of a class have private visibility by default.&quot;</p></div></div><p>I realize that. Doesn&#39;t change my expectations or preferences though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 03 May 2009 11:58:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, <i>preference</i>. I thought you were saying that that was the difference.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sun, 03 May 2009 13:52:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809387#target">Mr. Accident</a> said:</div><div class="quote"><p>
Allegro 5 redefines &quot;bool&quot; to &quot;_Bool&quot;
</p></div></div><p>

This seems like allegro&#39;s fault then. Identifiers beginning with underscore and capital letter are reserved for compiler implementators.</p><p>As to structs/classes question, structs are generally used for POD types that are basically the same as C structs. I also use structs for types that have no private section at all (e.g simple function objects).</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809397#target">LennyLen</a> said:</div><div class="quote"><p>
Could you give an example of how to do it with the main.cpp code I have? Your example doesn&#39;t make much sense to me, and unfortunately neither do any of the online references I looked up.
</p></div></div><p>

Something like this:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include "graphic.h"</span>
<span class="number">  2</span><span class="p">#include &lt;stdexcept&gt;</span>
<span class="number">  3</span>
<span class="number">  4</span>graphic::graphic<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span>
<span class="number">  5</span><span class="k2">{</span>
<span class="number">  6</span>    bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>filename, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Error loading \""</span><span class="k2">)</span> <span class="k3">+</span> filename <span class="k3">+</span> <span class="s">'"'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <span class="k2">}</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 13</span><span class="k2">{</span>
<span class="number"> 14</span>    <span class="c">//init allegro</span>
<span class="number"> 15</span>    <span class="k1">try</span> <span class="k2">{</span>
<span class="number"> 16</span>        <span class="c">//game stuff</span>
<span class="number"> 17</span>    <span class="k2">}</span>
<span class="number"> 18</span>    <span class="k1">catch</span> <span class="k2">(</span>std::runtime_error<span class="k3">&amp;</span> e<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 19</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span>e.what<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>        <span class="c">//program will be exiting anyway</span>
<span class="number"> 21</span>    <span class="k2">}</span>
<span class="number"> 22</span>    <span class="c">//deinit allegro</span>
<span class="number"> 23</span><span class="k2">}</span>
</div></div><p>

P.S Your graphics class is either missing a copy constructor, or it should be declared private. Same goes for operator=.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Sun, 03 May 2009 14:58:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Several of your classes are missing copy constructors and copy assignment operators.  It also looks like some of your classes are questionable in the exception safety department.  You&#39;re also using dynamically allocated objects a lot when there&#39;s no need for them, and fixing that will help a lot with the exception safety.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809379#target">kazzmir</a> said:</div><div class="quote"><p>There is some truth to that but the chances that you will write a class that conflict with the std:: namespace is quite low. Its usually more convenient to do &#39;using namespace std&#39;, but its your call.</p></div></div><p>

It&#39;s still generally best avoided.  As you move to more complex programs where you&#39;re using more than just a single library, you will almost always end up with name clashes between libraries regardless of your own code.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809391#target">kazzmir</a> said:</div><div class="quote"><p>Here is some quick code for using exceptions</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> blah<span class="k2">(</span><span class="k2">)</span> <span class="k1">throw</span> <span class="k2">(</span>myexception<span class="k2">)</span> <span class="k2">{</span>
  ...
  <span class="k1">throw</span> myexception<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// note its not 'new myexception'</span>
<span class="k2">}</span>
</pre></div></div></div></div><p>

One point - you should basically never write exception specifications.  You&#39;ll probably just want to forget that they event exist.  See <a href="http://www.gotw.ca/publications/mill22.htm">Herb Sutter&#39;s article on the subject</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Sun, 03 May 2009 19:09:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I never created a copy constructor as no objects were ever copied.  I just added constructors for the various ways that the object would be created in this program. Is one really needed?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Sun, 03 May 2009 19:16:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809420#target">LennyLen</a> said:</div><div class="quote"><p>I never created a copy constructor as no objects were ever copied. I just added constructors for the various ways that the object would be created in this program. Is one really needed?</p></div></div><p>

&quot;Good practice&quot; (you asked for it <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> ) would be to either go ahead and write them even if you don&#39;t need them right this second (what if you come back to this code in 6 months and start writing something that copies or assigns them?  boom) or explicitly declare them as private so that they can&#39;t accidentally be used.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Sun, 03 May 2009 19:30:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre>    graphic <span class="k3">*</span>noughts<span class="k2">;</span>
    graphic <span class="k3">*</span>crosses<span class="k2">;</span>
    graphic <span class="k3">*</span>buffer<span class="k2">;</span>
    graphic <span class="k3">*</span>back<span class="k2">;</span>
    graphic <span class="k3">*</span>scr<span class="k2">;</span>
</pre></div></div><p>

There is no reason to allocate these dynamically. If you don&#39;t do so, your game class wouldn&#39;t leak memory, nor should you even worry about implementing the destructor (and copying)...</p><p>You can also use the initializer list to call the constructors of the stack instances:</p><div class="source-code snippet"><div class="inner"><pre>game::game<span class="k2">(</span><span class="k2">)</span><span class="k2">:</span>
    quit<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
    noughts<span class="k2">(</span><span class="s">"nought.bmp"</span><span class="k2">)</span>,
    crosses<span class="k2">(</span><span class="s">"cross.bmp"</span><span class="k2">)</span>,
    buffer<span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span>,
    back<span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span>,
    scr<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span>, <span class="c">//is it a good idea to have screen destroyed by the destructor???</span>
    msg_font<span class="k2">(</span><a href="http://www.allegro.cc/manual/load_font" target="_blank"><span class="a">load_font</span></a><span class="k2">(</span><span class="s">"font.pcx"</span>, NULL, NULL<span class="k2">)</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="c">//...</span>
<span class="k2">}</span>
</pre></div></div><p>

As for the question on copy constructors and assignment operator for graphics, you need to decide whether instances of this should be copyable in the first place (by declaring them private and not implementing them / deriving from a simple class that does this to its copy constructor and operator=, a la boost::noncopyable), or if they should be copyable, whether each copy should get their own bitmap resource, or whether these should be shared between copies (e.g through reference counting, for which you can use shared_ptr&lt;BITMAP&gt;)</p><p>------<br />P.S I have a problem with a script on this thread (line numbering of code boxes)? Does it perhaps take too much time, seeing that there are many code boxes here? (Toggling line numbers on/off won&#39;t work when the script is stopped.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Sun, 03 May 2009 19:40:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809419#target">Speedo</a> said:</div><div class="quote"><p>
One point - you should basically never write exception specifications. You&#39;ll probably just want to forget that they event exist. See Herb Sutter&#39;s article on the subject [www.gotw.ca]
</p></div></div><p>
Yes, C++ exception handling fails in a lot of ways and I wouldn&#39;t specify exceptions in function types except that in my latest project I was getting segfaults until I added the throw&#39;s clause. I have no idea why but I just go with the flow.</p><p>(Having programmed in Java for a while where exceptions mostly work I would like to be able to specify the exceptions that can be thrown and have the compiler say something if I messed it up.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Sun, 03 May 2009 22:20:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just a minor issue and not C++-specific:</p><p><span class="source-code"> <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>depth <span class="k3">=</span> <a href="http://www.allegro.cc/manual/desktop_color_depth" target="_blank"><span class="a">desktop_color_depth</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></span></p><p>I&#39;d rather see this one split up; it&#39;s overloaded, thus more difficult to read, and most of all, it invites errors involving = and ==.</p><p>To put it more bluntly and dogmatic: <b>Never make (active) use of side-effects.</b>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Indeterminatus)</author>
		<pubDate>Sun, 03 May 2009 22:25:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809446#target">kazzmir</a> said:</div><div class="quote"><p>
Yes, C++ exception handling fails in a lot of ways and I wouldn&#39;t specify exceptions in function types except that in my latest project I was getting segfaults until I added the throw&#39;s clause. I have no idea why but I just go with the flow.
</p></div></div><p>

IMO it is more likely that you have something wrong elsewhere and since the error specification would lead to small changes in the binary these might cover up the symptoms (temporarily, another change might make it crash again). I&#39;ve had a program segfault unless a single bool assignment was commented out (the real cause was elsewhere and the program had been working fine despite the bug for a couple of days).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Sun, 03 May 2009 22:51:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I saw a bunch of points I wanted to make, but I&#39;ll only touch on two.</p><p>First off, use of enums for constants. I don&#39;t like that idea, because that&#39;s not what they&#39;re for. What&#39;s wrong with const ints again? After all... they are constants.</p><p>Second, struct vs class. Thomas is right, and if you move on to more civilized languages (like C#) it goes one step further. In C#, structs are passed by value, whereas classes are passed by reference.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Mon, 04 May 2009 00:10:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809461#target">BAF</a> said:</div><div class="quote"><p>First off, use of enums for constants. I don&#39;t like that idea, because that&#39;s not what they&#39;re for. What&#39;s wrong with const ints again? After all... they are constants.</p></div></div><p>

Please note that I did not follow this thread. Nothing&#39;s wrong with <span class="source-code"><span class="k1">const</span> <span class="k1">int</span></span>, and nothing&#39;s wrong with <span class="source-code"><span class="k1">enum</span></span>. Both have their uses, and their domains are orthogonal. An enumeration is quite explicit in what it&#39;s there for: providing a range of values, noone should care (or have to care) how the respective values are represented &quot;underneath&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Indeterminatus)</author>
		<pubDate>Mon, 04 May 2009 00:55:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, enums have their uses, but not for setting a constant for screen width or height, IMO.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Mon, 04 May 2009 02:17:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Asking about good practices, is it a good practice to exceed the char type limit?</p><p>For example:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> a <span class="k3">=</span> <span class="n">127</span><span class="k2">;</span>
a <span class="k3">+</span><span class="k3">=</span> <span class="n">2</span><span class="k2">;</span> <span class="c">// a will be -127 now right?</span>
</pre></div></div><p>

Instead of:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> a <span class="k3">=</span> <span class="n">127</span><span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span>a <span class="k3">+</span> <span class="n">2</span> <span class="k3">&gt;</span> <span class="n">127</span><span class="k2">)</span> a <span class="k3">=</span> a <span class="k3">+</span> <span class="n">2</span> <span class="k3">-</span> <span class="n">256</span><span class="k2">;</span>
<span class="k1">else</span> a <span class="k3">+</span><span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (brunooo)</author>
		<pubDate>Mon, 04 May 2009 05:55:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809519#target">brunooo</a> said:</div><div class="quote"><p>
a += 2; // a will be -127 now right?
</p></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
if (a + 2 &gt; 127)
</p></div></div><p>

If your first statment would be true how would that second statement ever evaluate to true? Never, bacause -127 is not bigger then 127. You can not detect an overflow with a bigger as sign. That makes no sense.</p><p>I always thought that char can hold upto 255 values and is unsigned per default? But I could be wrong about this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (count)</author>
		<pubDate>Mon, 04 May 2009 06:04:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809519#target">brunooo</a> said:</div><div class="quote"><p>Asking about good practices, is it a good practice to exceed the char type limit?</p></div></div><p>

No it&#39;s not.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> a <span class="k3">=</span> <span class="n">127</span><span class="k2">;</span>
a <span class="k3">+</span><span class="k3">=</span> <span class="n">2</span><span class="k2">;</span> <span class="c">// a will be -127 now right?</span>
</pre></div></div></div></div><p>

It depends on the compiler.  Some treat the type char type as being signed, some do not.  If char&#39;s are signed, then yes it will wrap around, if not, it will now equal 129.</p><p>If you want to be certain whether or not a char will be signed or not, use <tt>signed char</tt> or <tt>unsigned char</tt>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Mon, 04 May 2009 06:13:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry, I would than do this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> a <span class="k3">=</span> <span class="n">127</span><span class="k2">;</span>
<span class="k1">signed</span> <span class="k1">char</span> b<span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span>a <span class="k3">+</span> <span class="n">2</span> <span class="k3">&gt;</span> <span class="n">127</span><span class="k2">)</span> b <span class="k3">=</span> a <span class="k3">+</span> <span class="n">2</span> <span class="k3">-</span> <span class="n">256</span><span class="k2">;</span>
<span class="k1">else</span> b <span class="k3">=</span> a <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (brunooo)</author>
		<pubDate>Mon, 04 May 2009 06:35:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809521#target">Christopher Bludau</a> said:</div><div class="quote"><p>If your first statment would be true how would that second statement ever evaluate to true? Never, bacause -127 is not bigger then 127. You can not detect an overflow with a bigger as sign. That makes no sense.</p></div></div><p>
Actually, I believe numerical literals are ints by default, which means the char would get promoted to an int before the operation, so it would be 129.</p><p>Still, the whole thing is really sketchy and I would avoid the situation altogether. Overflows should be considered an error, not a tool.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Mon, 04 May 2009 07:38:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><img src="http://www.allegro.cc/forums/smileys/lipsrsealed.gif" alt=":-X" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Mon, 04 May 2009 08:38:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809523#target">LennyLen</a> said:</div><div class="quote"><p>If you want to be certain whether or not a char will be signed or not, use signed char or unsigned char.</p></div></div><p>

Well, if you&#39;re using it for text you should just use plain char, so that it&#39;s in line with whatever your compiler/project uses.  If you want a 1 byte integer, you should explicitly use signed/unsigned char.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809533#target">Kibiz0r</a> said:</div><div class="quote"><p>Actually, I believe numerical literals are ints by default</p></div></div><p>

I believe they should be a signed integer type which matches the word size of the target platform (which isn&#39;t always int - wouldn&#39;t want to be too consistent or anything).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Mon, 04 May 2009 09:02:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809545#target">Speedo</a> said:</div><div class="quote"><p>Well, if you&#39;re using it for text you should just use plain char, so that it&#39;s in line with whatever your compiler/project uses.</p></div></div><p>

Yup.  <tt>char</tt> values outside of 0-127 shouldn&#39;t be used for text anyway.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Mon, 04 May 2009 09:10:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809527#target">brunooo</a> said:</div><div class="quote"><p>Sorry, I would than do this:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> a <span class="k3">=</span> <span class="n">127</span><span class="k2">;</span>
<span class="k1">signed</span> <span class="k1">char</span> b<span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span>a <span class="k3">+</span> <span class="n">2</span> <span class="k3">&gt;</span> <span class="n">127</span><span class="k2">)</span> b <span class="k3">=</span> a <span class="k3">+</span> <span class="n">2</span> <span class="k3">-</span> <span class="n">256</span><span class="k2">;</span>
<span class="k1">else</span> b <span class="k3">=</span> a <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>

I would just do this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">signed</span> <span class="k1">char</span> a<span class="k2">;</span>
<span class="c">// ...</span>
<span class="k1">if</span> <span class="k2">(</span>a <span class="k3">&lt;</span> <span class="n">126</span><span class="k2">)</span> a <span class="k3">+</span><span class="k3">=</span> <span class="n">2</span><span class="k2">;</span>
<span class="k1">else</span> a <span class="k3">=</span> <span class="n">128</span> <span class="k3">-</span> a<span class="k2">;</span>
</pre></div></div><p>

Would this not protect against the problem faced with the wrap-around?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Mon, 04 May 2009 12:02:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809424#target">anonymous</a> said:</div><div class="quote"><p>    graphic *noughts;<br />    graphic *crosses;<br />    graphic *buffer;<br />    graphic *back;<br />    graphic *scr;</p><p>There is no reason to allocate these dynamically. </p></div></div><p>

The reason I did that was when I did <span class="source-code">noughts<span class="k2">(</span><span class="s">"nought.bmp"</span><span class="k2">)</span></span>, I got the following error, which I have no idea how to fix:</p><pre class="terminal">mingw32-g++.exe -Wall -fexceptions -O2 -c &quot;C:\Users\LennyLen\Documents\source code\tictac++\main.cpp&quot; -o obj\Release\main.o
mingw32-g++.exe -Wall -fexceptions -O2 -c &quot;C:\Users\LennyLen\Documents\source code\tictac++\game.cpp&quot; -o obj\Release\game.o
C:\Users\LennyLen\Documents\source code\tictac++\game.cpp: In constructor `game::game()&#39;:
C:\Users\LennyLen\Documents\source code\tictac++\game.cpp:5: error: no matching function for call to `graphic::graphic()&#39;
C:\Users\LennyLen\Documents\source code\tictac++\graphic.h:17: note: candidates are: graphic::graphic(const graphic&amp;)
C:\Users\LennyLen\Documents\source code\tictac++\graphic.h:16: note: graphic::graphic(BITMAP*)
C:\Users\LennyLen\Documents\source code\tictac++\graphic.h:15: note: graphic::graphic(int, int)
C:\Users\LennyLen\Documents\source code\tictac++\graphic.h:14: note: graphic::graphic(const char*)
C:\Users\LennyLen\Documents\source code\tictac++\game.cpp:10: error: no match for call to `(graphic) (const char[11])&#39;</pre><p>

I get the same for all of those declarations if I stop them from being dynamic.</p><p>In the end, I removed the graphic class altogether.  It didn&#39;t really serve any purpose.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>You can also use the initializer list to call the constructors of the stack instances:</p></div></div><p>

The initializer list is something new to me. What benefit does it serve that is better than just assigning values inside the constructor?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809478#target">BAF</a> said:</div><div class="quote"><p>Yeah, enums have their uses, but not for setting a constant for screen width or height, IMO.</p></div></div><p>

It seemed a bit odd to me too, butit was suggested. I&#39;ve changed them to <span class="source-code"><span class="k1">const</span> <span class="k1">int</span></span>s, even though it makes no real difference except stylistically.</p><p>I still need to add the exception handling, but that can wait until tomorrow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Mon, 04 May 2009 15:43:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809574#target">LennyLen</a> said:</div><div class="quote"><p>The reason I did that was when I did noughts(&quot;nought.bmp&quot;), I got the following error, which I have no idea how to fix:</p><p>...</p><p>I get the same for all of those declarations if I stop them from being dynamic.</p></div></div><p>

If you do not initialize them in the initializer list, they must have a default constructor that can be called.  See below.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>The initializer list is something new to me. What benefit does it serve that is better than just assigning values inside the constructor?</p></div></div><p>

Efficiency.  Every class member must be constructed before control enters the body of the contructor.  So, if you don&#39;t use the list you have a default construction plus an assignment.</p><p>It&#39;s the same logic that leads us in C++ to prefer delaying the declaration of variables as long as possible, so they can initialized on creation.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> Foo<span class="k2">(</span> <span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  string s<span class="k2">;</span> <span class="c">// default construction</span>
<span class="number">  4</span>
<span class="number">  5</span>  <span class="c">// ... 20 lines later</span>
<span class="number">  6</span>
<span class="number">  7</span>  s <span class="k3">=</span> <span class="s">"Hello World!"</span><span class="k2">;</span> <span class="c">// assignment</span>
<span class="number">  8</span><span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="c">//better</span>
<span class="number"> 11</span><span class="k1">void</span> Foo<span class="k2">(</span> <span class="k2">)</span>
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>  <span class="c">//... 20 lines later</span>
<span class="number"> 14</span>
<span class="number"> 15</span>  string s<span class="k2">(</span><span class="s">"Hello World!"</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// initialization</span>
<span class="number"> 16</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Mon, 04 May 2009 18:33:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809593#target">Speedo</a> said:</div><div class="quote"><p>
Efficiency.
</p></div></div><p>

Not only that. There are certain things that can only be initialized, not assigned later, like classes without default constructor <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />, constant members, reference members and base classes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Mon, 04 May 2009 19:13:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think this should be the final revison of this little project now:</p><p>main.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;stdexcept&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  4</span><span class="p">#include "game.h"</span>
<span class="number">  5</span><span class="p">#include "defines.h"</span>
<span class="number">  6</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">void</span> init_alleg<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <span class="k1">try</span> <span class="k2">{</span>
<span class="number"> 14</span>
<span class="number"> 15</span>        init_alleg<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>        game tictactoe<span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>        tictactoe.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    <span class="k2">}</span>
<span class="number"> 22</span>    <span class="k1">catch</span> <span class="k2">(</span>std::runtime_error<span class="k3">&amp;</span> e<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 23</span>
<span class="number"> 24</span>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span>e.what<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 30</span><span class="k2">}</span>
<span class="number"> 31</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number"> 32</span>
<span class="number"> 33</span>
<span class="number"> 34</span><span class="k1">void</span> init_alleg<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    <span class="k1">int</span> depth<span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>    <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>    <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>    <a href="http://www.allegro.cc/manual/install_mouse" target="_blank"><span class="a">install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>
<span class="number"> 43</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>depth <span class="k3">=</span> <a href="http://www.allegro.cc/manual/desktop_color_depth" target="_blank"><span class="a">desktop_color_depth</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 44</span>        <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span>depth<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>    <span class="k1">else</span>
<span class="number"> 46</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Couldn't determine desktop resolution"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>
<span class="number"> 48</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, WIDTH, HEIGHT, WIDTH, HEIGHT<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 49</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Failed to set graphics mode"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>
<span class="number"> 51</span><span class="k2">}</span>
</div></div><p>

game.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef GAME_H</span>
<span class="number">  2</span><span class="p">#define GAME_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;stdexcept&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  6</span><span class="p">#include "types.h"</span>
<span class="number">  7</span><span class="p">#include "defines.h"</span>
<span class="number">  8</span><span class="p">#include "mouse.h"</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">class</span> game <span class="k2">{</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    player_type board<span class="k2">[</span>GRIDSIZE<span class="k2">]</span><span class="k2">[</span>GRIDSIZE<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 14</span>    player_type current<span class="k2">;</span>
<span class="number"> 15</span>    player_type winner<span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">bool</span> quit<span class="k2">;</span>
<span class="number"> 17</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>noughts<span class="k2">;</span>
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>crosses<span class="k2">;</span>
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>grid<span class="k2">;</span>
<span class="number"> 20</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">;</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span>msg_font<span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bitmap_load<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> filename<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bitmap_create<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    player_type play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k1">void</span> reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">void</span> update_board<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, player_type player<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    <span class="k1">void</span> draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k1">void</span> text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    player_type swap_player<span class="k2">(</span>player_type player<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="k1">bool</span> check_mouse<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k1">bool</span> check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span>    public:
<span class="number"> 35</span>
<span class="number"> 36</span>    game<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    <span class="k1">void</span> begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span>
<span class="number"> 42</span><span class="p">#endif</span>
</div></div><p>

game.cpp:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include "game.h"</span>
<span class="number">   2</span>
<span class="number">   3</span>
<span class="number">   4</span>game::game<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span>  quit<span class="k2">(</span><span class="n">0</span><span class="k2">)</span>,
<span class="number">   5</span>                noughts<span class="k2">(</span>bitmap_load<span class="k2">(</span><span class="s">"nought.bmp"</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number">   6</span>                crosses<span class="k2">(</span>bitmap_load<span class="k2">(</span><span class="s">"cross.bmp"</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number">   7</span>                grid<span class="k2">(</span>bitmap_load<span class="k2">(</span><span class="s">"grid.bmp"</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number">   8</span>                buffer<span class="k2">(</span>bitmap_create<span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">)</span>,
<span class="number">   9</span>                msg_font<span class="k2">(</span><a href="http://www.allegro.cc/manual/load_font" target="_blank"><span class="a">load_font</span></a><span class="k2">(</span><span class="s">"font.pcx"</span>, NULL, NULL<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  10</span>
<span class="number">  11</span>    reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>msg_font<span class="k2">)</span>
<span class="number">  14</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Error loading \"font.pcx\""</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>
<span class="number">  16</span>    <a href="http://www.allegro.cc/manual/show_mouse" target="_blank"><span class="a">show_mouse</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  17</span>
<span class="number">  18</span>    current <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="k2">}</span>
<span class="number">  21</span>
<span class="number">  22</span>
<span class="number">  23</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>game::bitmap_load<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  24</span>
<span class="number">  25</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span>filename, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span>
<span class="number">  27</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Error loading \""</span><span class="k2">)</span> <span class="k3">+</span> filename <span class="k3">+</span> <span class="s">'"'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span>    <span class="k1">return</span> bmp<span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span><span class="k2">}</span>
<span class="number">  32</span>
<span class="number">  33</span>
<span class="number">  34</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>game::bitmap_create<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  35</span>
<span class="number">  36</span>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span>x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bmp<span class="k2">)</span>
<span class="number">  38</span>        <span class="k1">throw</span> std::runtime_error<span class="k2">(</span>std::string<span class="k2">(</span><span class="s">"Error creating bitmap"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span>    <span class="k1">return</span> bmp<span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span><span class="k2">}</span>
<span class="number">  43</span>
<span class="number">  44</span>
<span class="number">  45</span><span class="k1">void</span> game::begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  46</span>
<span class="number">  47</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  48</span>
<span class="number">  49</span>        reset_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// set all positions to NONE</span>
<span class="number">  50</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">// draw the inital board state</span>
<span class="number">  51</span>
<span class="number">  52</span>        winner <span class="k3">=</span> play<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// play until there is a winner</span>
<span class="number">  53</span>
<span class="number">  54</span>        draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// clears all messages drawn during game</span>
<span class="number">  55</span>        <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number">  56</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player O wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>winner <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number">  58</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player X wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>        <span class="k1">else</span>
<span class="number">  60</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Nobody wins."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>        text<span class="k2">(</span>EDGE, TEXTLINE2, <span class="s">"Play again? (Y/N)"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>
<span class="number">  63</span>        <span class="k1">for</span><span class="k2">(</span><span class="k2">;</span><span class="k2">;</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  64</span>
<span class="number">  65</span>            <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_ESC<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_N<span class="k2">]</span><span class="k2">)</span>  <span class="k2">{</span>
<span class="number">  66</span>
<span class="number">  67</span>                quit <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">// signal to exit program</span>
<span class="number">  68</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number">  69</span>
<span class="number">  70</span>            <span class="k2">}</span>
<span class="number">  71</span>
<span class="number">  72</span>            <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_Y<span class="k2">]</span><span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span> <span class="c">// return to main loop</span>
<span class="number">  73</span>
<span class="number">  74</span>            <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number">  75</span>
<span class="number">  76</span>        <span class="k2">}</span>
<span class="number">  77</span>
<span class="number">  78</span>    <span class="k2">}</span>
<span class="number">  79</span>
<span class="number">  80</span><span class="k2">}</span>
<span class="number">  81</span>
<span class="number">  82</span>player_type game::play<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  83</span>
<span class="number">  84</span>    <span class="k1">bool</span> turn_over<span class="k2">;</span>      <span class="c">// variable for determining when current turn is over</span>
<span class="number">  85</span>    <span class="k1">bool</span> game_over <span class="k3">=</span> FALSE<span class="k2">;</span>      <span class="c">// variable for determining when current game is over</span>
<span class="number">  86</span>    <span class="k1">int</span> pieces <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>         <span class="c">// number of pieces placed on the board</span>
<span class="number">  87</span>
<span class="number">  88</span>    <span class="k1">do</span> <span class="k2">{</span>
<span class="number">  89</span>
<span class="number">  90</span>        turn_over <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// turn begins</span>
<span class="number">  91</span>
<span class="number">  92</span>        <span class="k1">if</span> <span class="k2">(</span>current <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number">  93</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player O's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>        <span class="k1">else</span>
<span class="number">  95</span>            text<span class="k2">(</span>EDGE, TEXTLINE1, <span class="s">"Player X's turn."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>
<span class="number">  97</span>        <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_ESC<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// player signals to exit program</span>
<span class="number">  98</span>
<span class="number">  99</span>            game_over <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number"> 100</span>            quit <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number"> 101</span>
<span class="number"> 102</span>        <span class="k2">}</span>
<span class="number"> 103</span>
<span class="number"> 104</span>        <span class="k1">if</span> <span class="k2">(</span>check_mouse<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 105</span>
<span class="number"> 106</span>            turn_over <span class="k3">=</span> TRUE<span class="k2">;</span>  <span class="c">// turn is now over</span>
<span class="number"> 107</span>            pieces<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>  <span class="c">// increment the number of pieces on the board</span>
<span class="number"> 108</span>
<span class="number"> 109</span>        <span class="k2">}</span>
<span class="number"> 110</span>
<span class="number"> 111</span>        <span class="k1">if</span><span class="k2">(</span>check_win<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 112</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 113</span>            <span class="k1">return</span> current<span class="k2">;</span>  <span class="c">// if the game has been won, return the current player</span>
<span class="number"> 114</span>        <span class="k2">}</span>
<span class="number"> 115</span>
<span class="number"> 116</span>        <span class="k1">if</span> <span class="k2">(</span>pieces <span class="k3">=</span><span class="k3">=</span> NUMSQUARES<span class="k2">)</span> <span class="k1">return</span> NONE<span class="k2">;</span>  <span class="c">// if all squares are filled, return NONE</span>
<span class="number"> 117</span>
<span class="number"> 118</span>        <span class="k1">if</span><span class="k2">(</span>turn_over<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 119</span>
<span class="number"> 120</span>            current <span class="k3">=</span> swap_player<span class="k2">(</span>current<span class="k2">)</span><span class="k2">;</span>  <span class="c">// switch players</span>
<span class="number"> 121</span>            draw_board<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// draw the new board layout</span>
<span class="number"> 122</span>
<span class="number"> 123</span>        <span class="k2">}</span>
<span class="number"> 124</span>
<span class="number"> 125</span>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// reduce CPU usage</span>
<span class="number"> 126</span>
<span class="number"> 127</span>    <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>
<span class="number"> 129</span>    <span class="k1">return</span> NONE<span class="k2">;</span> <span class="c">// return NONE if player has quit game</span>
<span class="number"> 130</span>
<span class="number"> 131</span><span class="k2">}</span>
<span class="number"> 132</span>
<span class="number"> 133</span>
<span class="number"> 134</span><span class="k1">void</span> game::draw_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 135</span>
<span class="number"> 136</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 137</span>
<span class="number"> 138</span>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>grid, buffer, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, grid-&gt;w, grid-&gt;h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>
<span class="number"> 140</span>    <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 141</span>
<span class="number"> 142</span>        <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 143</span>
<span class="number"> 144</span>            <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 145</span>                <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer, noughts, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>            <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> CROSS<span class="k2">)</span>
<span class="number"> 147</span>                <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer, crosses, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> x, EDGE <span class="k3">+</span> SQUARE <span class="k3">*</span> y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>
<span class="number"> 149</span>        <span class="k2">}</span>
<span class="number"> 150</span>
<span class="number"> 151</span>    <span class="k2">}</span>
<span class="number"> 152</span>
<span class="number"> 153</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 154</span>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, buffer-&gt;w, buffer-&gt;h<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 156</span>
<span class="number"> 157</span><span class="k2">}</span>
<span class="number"> 158</span>
<span class="number"> 159</span>
<span class="number"> 160</span><span class="k1">void</span> game::reset_board<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 161</span>
<span class="number"> 162</span>    <span class="k1">int</span> x, y<span class="k2">;</span>
<span class="number"> 163</span>
<span class="number"> 164</span>    <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 165</span>
<span class="number"> 166</span>        <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 167</span>            board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> NONE<span class="k2">;</span>
<span class="number"> 168</span>
<span class="number"> 169</span>    <span class="k2">}</span>
<span class="number"> 170</span>
<span class="number"> 171</span><span class="k2">}</span>
<span class="number"> 172</span>
<span class="number"> 173</span>
<span class="number"> 174</span><span class="k1">void</span> game::text<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">char</span><span class="k3">*</span> msg<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 175</span>
<span class="number"> 176</span>    <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// hide mouse while drawing to screen</span>
<span class="number"> 177</span>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, msg_font, x, y, BLACK, <span class="k3">-</span><span class="n">1</span>, msg<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>    <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// show mouse again</span>
<span class="number"> 179</span>
<span class="number"> 180</span><span class="k2">}</span>
<span class="number"> 181</span>
<span class="number"> 182</span>
<span class="number"> 183</span>player_type game::swap_player<span class="k2">(</span>player_type player<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 184</span>
<span class="number"> 185</span>    player_type new_player<span class="k2">;</span>
<span class="number"> 186</span>
<span class="number"> 187</span>    <span class="k1">if</span> <span class="k2">(</span>player <span class="k3">=</span><span class="k3">=</span> NOUGHT<span class="k2">)</span>
<span class="number"> 188</span>        new_player <span class="k3">=</span> CROSS<span class="k2">;</span>
<span class="number"> 189</span>    <span class="k1">else</span>
<span class="number"> 190</span>        new_player <span class="k3">=</span> NOUGHT<span class="k2">;</span>
<span class="number"> 191</span>
<span class="number"> 192</span>    <span class="k1">return</span> new_player<span class="k2">;</span>
<span class="number"> 193</span>
<span class="number"> 194</span><span class="k2">}</span>
<span class="number"> 195</span>
<span class="number"> 196</span>
<span class="number"> 197</span><span class="k1">bool</span> game::check_win<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 198</span>
<span class="number"> 199</span>    <span class="k1">int</span> n<span class="k2">;</span>
<span class="number"> 200</span>
<span class="number"> 201</span>    <span class="k1">for</span> <span class="k2">(</span>n <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> n <span class="k3">&lt;</span> GRIDSIZE<span class="k2">;</span> n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 202</span>
<span class="number"> 203</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span>n<span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares in a row are the same</span>
<span class="number"> 204</span>        <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span>n<span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares ina column are the same</span>
<span class="number"> 205</span>
<span class="number"> 206</span>    <span class="k2">}</span>
<span class="number"> 207</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares diagonally from top left are the same</span>
<span class="number"> 208</span>    <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NONE <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> board<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> board<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span> <span class="k1">return</span> TRUE<span class="k2">;</span>  <span class="c">// all GRIDSIZE squares diagonally from bottom left are the same</span>
<span class="number"> 209</span>
<span class="number"> 210</span>    <span class="k1">return</span> FALSE<span class="k2">;</span>  <span class="c">// no winner yet</span>
<span class="number"> 211</span>
<span class="number"> 212</span><span class="k2">}</span>
<span class="number"> 213</span>
<span class="number"> 214</span>
<span class="number"> 215</span><span class="k1">bool</span> game::check_mouse<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 216</span>
<span class="number"> 217</span>    position <a href="http://www.allegro.cc/manual/mouse_pos" target="_blank"><span class="a">mouse_pos</span></a><span class="k2">;</span>     <span class="c">// the mouse position in board coordinates rather than screen coordinates</span>
<span class="number"> 218</span>    <span class="k1">static</span> <span class="k1">bool</span> mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span> <span class="c">// needed to stop multiple clicks from registering if mouse button held down</span>
<span class="number"> 219</span>
<span class="number"> 220</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span>  <span class="c">// mouse button not held down</span>
<span class="number"> 221</span>        mouse_released <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number"> 222</span>
<span class="number"> 223</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_released<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 224</span>
<span class="number"> 225</span>        mouse_pos.get_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// get mouse position in board coordinates</span>
<span class="number"> 226</span>
<span class="number"> 227</span>        <span class="k1">if</span> <span class="k2">(</span>mouse_pos.x <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.x <span class="k3">&lt;</span><span class="k3">=</span> <span class="k2">(</span>GRIDSIZE <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> mouse_pos.y <span class="k3">&lt;</span><span class="k3">=</span> <span class="k2">(</span>GRIDSIZE <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// only do if mouse over playable area</span>
<span class="number"> 228</span>
<span class="number"> 229</span>            <span class="k1">if</span> <span class="k2">(</span>board<span class="k2">[</span>mouse_pos.y<span class="k2">]</span><span class="k2">[</span>mouse_pos.x<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NONE<span class="k2">)</span> <span class="k2">{</span>  <span class="c">// check that square is currently empty</span>
<span class="number"> 230</span>
<span class="number"> 231</span>                update_board<span class="k2">(</span>mouse_pos.x, mouse_pos.y, current<span class="k2">)</span><span class="k2">;</span>  <span class="c">// player's piece is placed</span>
<span class="number"> 232</span>                mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// mouse has been held down</span>
<span class="number"> 233</span>                <span class="k1">return</span> TRUE<span class="k2">;</span>
<span class="number"> 234</span>
<span class="number"> 235</span>            <span class="k2">}</span>
<span class="number"> 236</span>
<span class="number"> 237</span>        <span class="k2">}</span>
<span class="number"> 238</span>
<span class="number"> 239</span>        mouse_released <span class="k3">=</span> FALSE<span class="k2">;</span>  <span class="c">// mouse has been held down</span>
<span class="number"> 240</span>
<span class="number"> 241</span>    <span class="k2">}</span>
<span class="number"> 242</span>
<span class="number"> 243</span>    <span class="k1">return</span> FALSE<span class="k2">;</span>
<span class="number"> 244</span>
<span class="number"> 245</span><span class="k2">}</span>
<span class="number"> 246</span>
<span class="number"> 247</span>
<span class="number"> 248</span><span class="k1">void</span> game::update_board<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, player_type player<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 249</span>
<span class="number"> 250</span>    board<span class="k2">[</span>y<span class="k2">]</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> player<span class="k2">;</span>
<span class="number"> 251</span>
<span class="number"> 252</span><span class="k2">}</span>
</div></div><p>

mouse.h:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef MOUSE_H</span>
<span class="number">  2</span><span class="p">#define MOUSE_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include &lt;allegro.h&gt;</span>
<span class="number">  5</span><span class="p">#include "types.h"</span>
<span class="number">  6</span><span class="p">#include "defines.h"</span>
<span class="number">  7</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">struct</span> position <span class="k2">{</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 12</span>    <span class="k1">int</span> y<span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <span class="k1">void</span> get_pos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>
<span class="number"> 19</span><span class="p">#endif</span>
</div></div><p>

mouse.cpp:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include "mouse.h"</span>


<span class="k1">void</span> position::get_pos<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>

    x <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>
    y <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a> <span class="k3">-</span> EDGE<span class="k2">)</span> <span class="k3">/</span> SQUARE<span class="k2">;</span>

<span class="k2">}</span>
</pre></div></div><p>

types.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef TYPES_H</span>
<span class="p">#define TYPES_H</span>


<span class="k1">typedef</span> <span class="k1">enum</span> <span class="k2">{</span> NONE, NOUGHT, CROSS <span class="k2">}</span> player_type<span class="k2">;</span>  <span class="c">// enumerated constants for the player type</span>


<span class="p">#endif</span>
</pre></div></div><p>

defines.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef DEFINES_H</span>
<span class="p">#define DEFINES_H</span>


<span class="p">#define WHITE makecol(255, 255, 255)</span>
<span class="p">#define BLACK makecol(0, 0, 0)</span>

<span class="k1">const</span> <span class="k1">int</span> GRIDSIZE <span class="k3">=</span> <span class="n">3</span>, NUMSQUARES <span class="k3">=</span> <span class="n">9</span>, TEXTLINE1 <span class="k3">=</span> <span class="n">175</span>, TEXTLINE2 <span class="k3">=</span> <span class="n">190</span>, WIDTH <span class="k3">=</span> <span class="n">172</span>, HEIGHT <span class="k3">=</span> <span class="n">232</span>, EDGE <span class="k3">=</span> <span class="n">11</span>, SQUARE <span class="k3">=</span> <span class="n">50</span><span class="k2">;</span>


<span class="p">#endif</span>
</pre></div></div><p>

And <a href="http://www.allegro.cc/files/attachment/598436">here</a> is all the code/resources with a Windows binary.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Tue, 05 May 2009 10:17:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there an advantage to using a #define for <tt>makecol(..., ..., ...)</tt>?</p><p>If the preprocessor simply replaces your WHITE instances with &quot;makecol(255, 255, 255)&quot;, you are just reusing the same thing.  I&#39;d just use &quot;const int WHITE = makecol(255, 255, 255);&quot; and avoid any redundant function calls to makecol() if you are just using it for white (or black, or lavender, or puce, ...).</p><p>If you&#39;re worried that it&#39;s trying to set the color before setting the color depth, just don&#39;t make it a <tt>const</tt> and set its value inside your init() function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Tue, 05 May 2009 10:54:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809714#target">OnlineCop</a> said:</div><div class="quote"><p>If you&#39;re worried that it&#39;s trying to set the color before setting the color depth, just don&#39;t make it a const and set its value inside your init() function.</p></div></div><p>

It was more that I was trying to avoid any global variables.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Tue, 05 May 2009 10:56:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809715#target">LennyLen</a> said:</div><div class="quote"><p>It was more that I was trying to avoid any global variables.</p></div></div><p>

And yet Allegro 4 and 5 both use globals all over the place.  Once you set the screen resolution, you have SCREEN_W, SCREEN_H, you&#39;ve got mouse_b, etc.  It gives you access to globals all over the place.</p><p>I think globals have their place.  Sometimes you just don&#39;t want to pass some variable around through a dozen function calls to be used in one or two places down the chain: you use a global.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (OnlineCop)</author>
		<pubDate>Tue, 05 May 2009 11:02:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809716#target">OnlineCop</a> said:</div><div class="quote"><p>I think globals have their place. Sometimes you just don&#39;t want to pass some variable around through a dozen function calls to be used in one or two places down the chain: you use a global.</p></div></div><p>

I think #defines have their place. Sometimes you just don&#39;t want to write the same bit of text over and over in many places: you use a #define.</p><p>edit: And to be honest, the #define vs global variable has nothing to do with C++ explicitly. It&#39;s the same for any language that supports both.  I&#39;m only interested in in C++ specifics for now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Tue, 05 May 2009 11:06:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre> CResourceManager::add_color<span class="k2">(</span><a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, <span class="s">"white"</span><span class="k2">)</span><span class="k2">;</span>
 CResourceManager::add_color<span class="k2">(</span><a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span>, <span class="s">"black"</span><span class="k2">)</span><span class="k2">;</span>

 ..

 col <span class="k3">=</span> CResourceManager::get_color<span class="k2">(</span><span class="s">"white"</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

That&#39;s the proper way of doing it in OOP.<br />Not with defines. And not with globals.</p><p>Whether you make the methods static or not depends on what you need.</p><p>You could go further and define a Resource class and inherit all Resources from that... you have to decide if you want:</p><p>a) // two methods for every resource<br />add_a(type_a, id)<br />add_b(type_b, id)<br />type_a a = get_a(id);<br />type_b a = get_b(id);</p><p>or:<br />b) // having to cast everytime you get a resource<br />add(resource, id)<br />type_a a = (type_a)get(id);</p><p>Both have their pros and cons.</p><p>EDIT:<br />Obviously, if you want to take the second path, you would have to write wrappers around all allegro c types. Otherwise you can&#39;t let them extend the resource class.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (count)</author>
		<pubDate>Tue, 05 May 2009 12:07:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code">col <span class="k3">=</span> CResourceManager::get_color<span class="k2">(</span><span class="s">"white"</span><span class="k2">)</span><span class="k2">;</span></span><br />I find this very error-prone. It&#39;s going to compile ok and bite you at runtime if you mistake &quot;grey&quot; and &quot;gray&quot;, for example.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Tue, 05 May 2009 13:00:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>load_bitmap(&quot;sprite.bmp&quot;); might compile ok but will bite you at runtime if the image can&#39;t be loaded.</p><p>Same goes for any resource once you use a ResourceManager.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (count)</author>
		<pubDate>Tue, 05 May 2009 13:36:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You could also have global functions instead of macros:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> white<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
<span class="k1">int</span> black<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
</pre></div></div><p>

Practically no difference with how the macro works, except takes a bit more typing, but can be put in a namespace etc. The macro itself is benign, except perhaps for naming conflicts that they all can cause.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Tue, 05 May 2009 13:45:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I just use 0 and -1 for black and white <img src="http://www.allegro.cc/forums/smileys/lipsrsealed.gif" alt=":-X" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 05 May 2009 14:11:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Except that is less readable, won&#39;t work on all colour depths and still doesn&#39;t solve the question what you do when you want other colours like green...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Tue, 05 May 2009 14:23:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809712#target">LennyLen</a> said:</div><div class="quote"><p><span class="source-code"><span class="k1">catch</span> <span class="k2">(</span>std::runtime_error<span class="k3">&amp;</span> e<span class="k2">)</span> <span class="k2">{</span></span></p></div></div><p>
Just for good measure, you might want to beef up the try...catch with a few more catches so no exceptions can get past your main routine. <span class="source-code">std::exception</span> would catch any type derived from the standard exception type. And you can use an ellipsis (<span class="source-code">...</span>) to catch anything else, and still output some kind of &quot;WTF is this...&quot; message so the user doesn&#39;t just have the game outright crash on him. In <a href="http://code.google.com/p/intern-quest/source/browse/branches/bamccaig-unstable/src/main.cpp?r=165">Intern&#39;s Quest</a>, we catch <span class="source-code">std::invalid_argument</span>, <span class="source-code">std::range_error</span>, <span class="source-code">std::logic_error</span>, <span class="source-code">std::runtime_error</span>, and <span class="source-code">std::exception</span>, in that order (clearly I didn&#39;t think ... was necessary at the time).</p><p>It allows for really sweet error handling in the application code. For starters, I just said everything is fatal, and would throw an exception for everything, which were only caught in main. It worked out really great because the game would typically output some kind of error message and exit gracefully for anything (Allegro complicated things because of how I was using timers, etc... Occasionally Allegro timers would not be uninstalled and would fire after Allegro was deinitialized and it would crash anyway, but I think that is mostly cleaned up now).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 05 May 2009 18:54:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809771#target">bamccaig</a> said:</div><div class="quote"><p>Just for good measure, you might want to beef up the try...catch with a few more catches so no exceptions can get past your main routine. std::exception would catch any type derived from the standard exception type. And you can use an ellipsis (...) to catch anything else, and still output some kind of &quot;WTF is this...&quot; message so the user doesn&#39;t just have the game outright crash on him. In Intern&#39;s Quest, we catch std::invalid_argument, std::range_error, std::logic_error, std::runtime_error, and std::exception, in that order (clearly I didn&#39;t think ... was necessary at the time).</p></div></div><p>

When you&#39;re just catching fatal errors in main, there&#39;s really not much point catching anything other than std::exception and any exceptions thrown by 3rd party libs which don&#39;t dervive from std::exception.  Anything that derives from std::exception <b>should</b> adequately report whatever the problem was via its what() method, so there&#39;s no reason to catch derived types unless you&#39;re actually going to take some action specific to that type.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Tue, 05 May 2009 19:14:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809774#target">Speedo</a> said:</div><div class="quote"><p>
unless you&#39;re actually going to take some action specific to that type
</p></div></div><p>

In which case you might also derive your own exception type for a particular error (e.g bitmap_load_error). Pick one of the stdexcepts as the base, and you&#39;ll only need a constructor that passes the exception message to the base constructor. It is also good to derive them from std exceptions, so you could always catch them with std::exception&amp; if you don&#39;t want a particular action.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Tue, 05 May 2009 19:21:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809775#target">anonymous</a> said:</div><div class="quote"><p>In which case you might also derive your own exception type for a particular error (e.g bitmap_load_error). Pick one of the stdexcepts as the base, and you&#39;ll only need a constructor that passes the exception message to the base constructor.</p></div></div><p>

It&#39;s probably better to actually make your own intermediate exception type and then derive from it, because the standard doesn&#39;t require std::exception to be able to hold a message (MSVC and some other compilers extend it to do so, GCC doesn&#39;t).</p><p>I&#39;d also recommend taking a look at Boost.Exception.  It&#39;s particularly awesome in that you can transport any arbitrary information along with any given exception.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Tue, 05 May 2009 19:36:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Though the type of exception does carry some information as well, which I found useful to display to the user as well. At least, I found it easier to guess what went wrong when debugging, without having to write type-specific what messages.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 05 May 2009 19:57:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>IMO any exception should carry enough info to tell you (the programmer) what the problem was.  But even if you want to display the name of the exception class, that&#39;s done easily enough with typeid(excpetionclass).name().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Speedo)</author>
		<pubDate>Tue, 05 May 2009 20:14:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809785#target">Speedo</a> said:</div><div class="quote"><p>...typeid(excpetionclass)...</p></div></div><p>
<img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 05 May 2009 20:33:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809777#target">Speedo</a> said:</div><div class="quote"><p>It&#39;s probably better to actually make your own intermediate exception type and then derive from it, because the standard doesn&#39;t require std::exception to be able to hold a message (MSVC and some other compilers extend it to do so, GCC doesn&#39;t).</p></div></div><p>

What I meant is use one of the derivates of the std::exception from &lt;stdexcept&gt; (IIRC std::exception itself doesn&#39;t even have a constructor to accept a message). Or naturally you can make your intermediary classes: std::exception &gt; std::runtime_error &gt; my::resource_error &gt; my::bitmap_loading_error.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/600126/809780#target">bamccaig</a> said:</div><div class="quote"><p>
Though the type of exception does carry some information as well, which I found useful to display to the user as well. At least, I found it easier to guess what went wrong when debugging, without having to write type-specific what messages. 
</p></div></div><p>
The type of the exception lets you catch different kinds of exceptions in different places and/or handle them separately. The what message is for a description that you fill in where the exception happens and where you have the exact information. You can also have intermediary try blocks where you catch the message, add more information to it and rethrow it (but I guess that would not be the general pattern and some things might better be left for the debugger).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (anonymous)</author>
		<pubDate>Tue, 05 May 2009 20:46:36 +0000</pubDate>
	</item>
</rss>
