summaryrefslogtreecommitdiff
path: root/noncore/games/solitaire/freecellcardgame.cpp
authorharlekin <harlekin>2003-04-25 09:02:41 (UTC)
committer harlekin <harlekin>2003-04-25 09:02:41 (UTC)
commitbddc2d168776bf7674f9b938f8889051fb9fa7a8 (patch) (side-by-side diff)
tree5b03d071f18e30e1b023c7bbd07c49346e1ef428 /noncore/games/solitaire/freecellcardgame.cpp
parent25ab69ab9964a8de1c05f9ff659a4b8a820eb201 (diff)
downloadopie-bddc2d168776bf7674f9b938f8889051fb9fa7a8.zip
opie-bddc2d168776bf7674f9b938f8889051fb9fa7a8.tar.gz
opie-bddc2d168776bf7674f9b938f8889051fb9fa7a8.tar.bz2
added patch for freecell mode by radofan, closes bug 736, i hope it helps
Diffstat (limited to 'noncore/games/solitaire/freecellcardgame.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/solitaire/freecellcardgame.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/noncore/games/solitaire/freecellcardgame.cpp b/noncore/games/solitaire/freecellcardgame.cpp
index 98415aa..aeb32fc 100644
--- a/noncore/games/solitaire/freecellcardgame.cpp
+++ b/noncore/games/solitaire/freecellcardgame.cpp
@@ -69,6 +69,89 @@ void FreecellCardGame::deal(void)
endDealing();
}
+// checks if smaller card with different color, that could be put on top on the
+// card, is present in working or freecell pile
+bool FreecellCardGame::checkNeeded(Card *card)
+{
+ if (card->getValue() > 2){
+ int i;
+ Card *c;
+ for (i=0;i<4;i++){
+ c = freecellPiles[i]->cardOnBottom();
+ if (c != NULL){
+ if (card->isRed()!= c->isRed() && card->getValue()== c->getValue()+1){
+ return (false);
+ }
+ }
+ }
+ for (i=0;i<8;i++){
+ c=workingPiles[i]->cardOnBottom();
+ while (c!=NULL){
+ if (card->isRed() != c->isRed() && card->getValue() == c->getValue()+1) {
+ return (false);
+ }
+ c=workingPiles[i]->cardInfront(c);
+ }
+ }
+ }
+ return(true);
+}
+
+// added to move cards, on which no card can be moved, to discard pile
+void FreecellCardGame::checkUnusable()
+{
+ int i,j;
+// printf("void FreecellCardGame::checkUnusable()\n");
+ Card *top_one;
+ for (i=0;i < 8;i++)
+ {
+ top_one = workingPiles[i]->cardOnTop();
+ if (top_one != NULL)
+ {
+ j = 0;
+ while ((j < 4))
+ {
+ if (discardPiles[j]->isAllowedOnTop(top_one)){
+ if (checkNeeded(top_one)){
+ top_one->setCardPile(discardPiles[j]);
+ workingPiles[i]->removeCard(top_one);
+// printf("k %d f work%d to disk%d on %d\n ",top_one->getValue(),i+1,j+1,highestZ);
+ discardPiles[j]->addCardToTop(top_one);
+ top_one->setPos(discardPiles[j]->getX(),discardPiles[j]->getY(),highestZ);
+ highestZ++;
+ j = 4;
+ checkUnusable();
+ }
+ }
+ j++;
+ }
+ }
+ }
+ for (i=0;i<4;i++){
+ top_one = freecellPiles[i]->cardOnTop();
+ if (top_one != NULL)
+ {
+ j = 0;
+ while ((j < 4))
+ {
+ if (discardPiles[j]->isAllowedOnTop(top_one)){
+ if (checkNeeded(top_one)){
+ top_one->setCardPile(discardPiles[j]);
+ freecellPiles[i]->removeCard(top_one);
+// printf("k %d f work%d to disk%d on %d\n ",top_one->getValue(),i+1,j+1,highestZ);
+ discardPiles[j]->addCardToTop(top_one);
+ top_one->setPos(discardPiles[j]->getX(),discardPiles[j]->getY(),highestZ);
+ highestZ++;
+ j = 4;
+ checkUnusable();
+ }
+ }
+ j++;
+ }
+ }
+ }
+}
+
bool FreecellCardGame::mousePressCard( Card *c, QPoint p )
{