Hello,<br><br>Just my .02€ to this thread:<br><br><br><br><div><span class="gmail_quote">2008/2/5, Andreas Pakulat &lt;<a href="mailto:apaku@gmx.de">apaku@gmx.de</a>&gt;:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Currently this is a QFlags thingie, i.e. an enum with values 2, 4, 8,<br>...&nbsp;&nbsp;However this is limiting us to 32 elements, and 18 are already<br>taken by a 52 card deck.</blockquote><div><br>I don&#39;t think that using QFlags here is a good idea, because it wastes so many bits for invalid combinations. E.g., it doesn&#39;t make sense to specify a card like &quot;Spades | Diamonds | Queen&quot;, or &quot;Hearts | Queen | Jack&quot;.<br>
The suit of a card can be specified in 2 bits (instead of 4 with QFlags), that prevents invalid combinations for free, and the value of a 52 cards deck with wildcards can be specified in 4 bits. <br>One could use the old technique of just combining bits using &quot;|&quot;, and use enums like<br>
<br>enum Suit {Diamonds = 0x0, Hearts = 0x1, Spades = 0x2, Clubs = 0x3};<br>enum Value {Joker = 0x0, Ace = 0x4, Two = 0x8, Three = 0xC, Four = 0x10, Five = 0x14, Six = 0x18, Seven = 0x1C, Eight = 0x20, Nine = 0x24, Ten = 0x28, Jack = 0x2C, Queen = 0x30, King = 0x34};<br>
<br>Then you can specify a card like &quot;Nine | Diamond&quot; (or &quot;Nine + Diamond&quot;). The advantage is that the cards are sorted automatically (of course not addressing the problem that the ace is at the same time lower than 2 and higher than king).<br>
 </div><br>If you want to prevent expressions like &quot;Ace | Jack&quot; or &quot;Three | Diamonds | Spades&quot;, and at the same time get the type safety similar to that of QFlags, a class for creating a card could be used; something like<br>
<br>class Card<br>{<br>&nbsp;&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Card (Suit s, Value v) {card = s|v;}&nbsp; // create a card like &quot;Card (Diamonds, Ace)&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Card (Value v, Suit s) {card = s|v;}&nbsp; // create a card like &quot;Card (Ace, Diamonds)&quot;<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operator int () const {return card;}&nbsp; // return the combined card value as an int<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Value value () const {return card &amp; 0x3C;}&nbsp; // return the value of the card (Joker, Ace, ...)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Suit suit () const {return card &amp; 0x03;}&nbsp; // return the suit of the card (Diamonds, Hearts, ...)<br>
<br>&nbsp;&nbsp;&nbsp; private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int card;<br>};<br><br>Using this class as a parameter type, a card instance can only be created with exactly one suit and exactly one value. Trying to create a card other than that results in a compiler error. You could of course add further methods like &quot;setValue&quot;, &quot;setSuit&quot;, &quot;operator==&quot;, &quot;operator!=&quot;, &quot;operator&lt;&quot;, etc.<br>
<br>If you also want to keep &quot;Diamonds | Ace&quot; valid, you can define the operators<br><br>Card operator| (Suit s, Value v) {return Card (s, v);}<br>Card operator| (Value v, Suit s) {return Card (s, v);}<br><br>And this is just the beginning. Thinking of other cards like, e.g., tarrot cards, one could think of additional enums and additional constructors of &quot;Card&quot;. Or maybe a subclass of &quot;Card&quot; that provides support for other card types. You just have to keep the value of the internal &quot;card&quot; attribute unique. This reminds me of unicode: Every type of card deck has a specific range. The &quot;traditional&quot; card deck of 52 cards plus wildcards occupy the numbers &quot;0&quot; (Diamonds | Joker) to &quot;55&quot; (Clubs | King). Tarrot cards may occupy &quot;54&quot; to &quot;82&quot; (I have no idea how many different cards tarrot has). One could even think of some &quot;Memory&quot; like game to have its own range within the Card class.<br>
Maybe also a method that returns some kind of class ID could be usefull, to check whether an svg card deck matches the cards that can be contained within a Card instance.<br><br>Maybe I haven&#39;t seen one or the other drawback or pitfall in the approach I described, but I leave the &quot;work&quot; to you. :-)<br>
<br>Burkhard<br><br></div>